Help

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Nedel
Beiträge: 3
Registriert: Do, 01.03.2007 14:32

Help

Beitrag von Nedel »

Hey Leute, ich versuche diesen VBA Code in OO Basic zu wandeln. Ich kriege das einfach nicht hin.

Das Programm definiert eine funktion mit dem einen Namen in einer Spalte sucht und der Zähler zählt wie oft der jenige in der Spalte vorhanden ist. Zusätzlich wird noch eine weiter Spalte durchsucht. Ich habs geschrieben um aus einer Meetingsliste herauszufinden wer wie oft, was für ein Typ Vortrag (progress report, progress proposal) gehalten hat. In excel funkt. wunderbar, aber ich verzweifele langsam bei oo basic.

Naja wäre schön wenn ihr mir helfen könntet:

Public Function doIt(Name As String, Bereich As Range, Typ As String, unused As Range) As Integer
counter = 0
For Each cell In Bereich.Cells
If (InStr(cell.Value, Name) > 0 And StrComp(cell.Offset(0, 1).Value, Typ) = 0) Then
counter = counter + 1
End If
Next
doIt = counter
End Function

danke nedel
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Nedel,
ich versuche diesen VBA Code in OO Basic zu wandeln. Ich kriege das einfach nicht hin
Na, was hast du denn schon für Code in OOo Basic? Wo hakt es genau?

Oder suchst du nur jemanden, der für Dich die "Arbeit" macht und "schnell mal den VBA-Code übersetzt"? Gibt es bestimmt einige hier, schätze mal: 1 Stunde Arbeit, 80,- EUR???

Wir helfen gern, aber sicher nur dort, wo du nicht weiterkommst. Das Lernen von OOo Basic könen wir dir allerdings auch nicht abnehmen ;-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Nedel
Beiträge: 3
Registriert: Do, 01.03.2007 14:32

Na klar

Beitrag von Nedel »

Nein, ich hab schon probiert siehe unten:
Ich hab da bloss cell.Offset nicht drin, weil ich gelesen hab dass es von oo nicht unterstützt wird.


Public Function doIt(name As String, BereichString as String , Typ As String, bereich2 as Object) As String
Bereich = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(BereichString)

counter = 0
for nRow = Bereich.StartRow To Bereich.EndRow
for nCol = Bereich.StartColumn To Bereich.EndColumn
cell = ThisComponent.CurrentController.ActiveSheet.getCellByPosition(nCol, nRow)
If (InStr(cell.Value, name) > 0) Then
counter = counter + 1
End If
next
next
doIt = name
End Function
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Nedel,

Und? Funktioniert dein Code so zunächst?

Das mit dem Cell.offset gibt es nicht in OOo Basic, das realisiert du dann eben manuell. Im Grunde verschiebt es ja nur die splate um 1?
Dann addierst du zu dem Column-Wert eben den Offset hinzu :-)

Aber, wenn ich das Excel Makro richtig interpretiere, so lautet das:

Erhöhe den Zähler um 1 wenn
in der Zelle ein bestimmter Text ("Name") vorkommt und gleichzeitig in der Zelle daneben der "Typ" aufgelistet wird?
(finde leider die Funktion StrComp() in meinem Excelbuch nicht, schätze aber, sie vergleicht, ob die beiden Strings gleich sind?)
Dann kannst du das eigentlich auch direkt umsetzen:

Code: Alles auswählen

Function doIt(name As String, BereichString as String , Typ As String, bereich2 as Object) As String
Bereich = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(BereichString)

counter = 0
for nRow = Bereich.StartRow To Bereich.EndRow
  for nCol = Bereich.StartColumn To Bereich.EndColumn
    cell = ThisComponent.CurrentController.ActiveSheet.getCellByPosition(nCol, nRow)
    cell2 = ThisComponent.CurrentController.ActiveSheet.getCellByPosition(nCol+1, nRow)
    If (InStr(cell.string, name) > 0) AND StrComp(cell2.string, Typ) Then
        counter = counter + 1
    End If
  next
next
doIt = name
End Function
Noch etwas: Das Zellobjekt kann drei Inhaltstypen beinhalten: Werte (value), Texte (String) oder Formeln (formula). In OOo musst du schon den richtigen Typ abfragen, der Typ "value" liefert dir Null (0) zurück, wenn in der Zelle Texte drin stehen!

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Nedel
Beiträge: 3
Registriert: Do, 01.03.2007 14:32

?

Beitrag von Nedel »

Also ich bin gerade mit Fehlermeldungenbeseitigen beschäftigt.
javascript:emoticon(':?')

Zb musste ich name durch Hans ersetzen, weil name wohl anders festgelegt ist.

Dann habe ich probleme mit dem definieren von Range.
ich bekomme für die 2te Zeile "Bereich = ..." die Fehlermeldung Baisc Laufzeitfehler:Objektvariable nicht belegt.

Was könnte das bedeuten? Ich hab vorher noch nicht mit oo gearbeitet.


Public Function doIt(Hans As String, BereichString As String , Typ As String, bereich2 As Object) As Integer

Bereich = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName(BereichString)

counter = 0
for nRow = Bereich.StartRow To Bereich.EndRow
for nCol = Bereich.StartColumn To Bereich.EndColumn
cell = ThisComponent.CurrentController.ActiveSheet.getCellByPosition(nCol, nRow)
cell2 = ThisComponent.CurrentController.ActiveSheet.getCellByPosition(nCol+1, nRow)
If (InStr(cell.string, Hans) > 0) AND StrComp(cell2.string, Typ) Then
counter = counter + 1
End If
next
next
doIt = Hans
End Function
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Nedel,
Zb musste ich name durch Hans ersetzen, weil name wohl anders festgelegt ist.
Korrekt. Name ist ein geschützter Begriff.
Dann habe ich probleme mit dem definieren von Range.
ich bekomme für die 2te Zeile "Bereich = ..." die Fehlermeldung Baisc Laufzeitfehler:Objektvariable nicht belegt.
Was könnte das bedeuten? Ich hab vorher noch nicht mit oo gearbeitet.
Das, was es sagt. Die Varaible ist nicht definiert, also übergibst du offensichtlich keinen String, der einen Bereich definiert. Die Zeile selbst ist korrekt, und wenn die Variable im funktionsaufruf einen (gültigen) bereichsnamen des Tabellenblattes enthält oder eine Range in Form "A1:B5" ist alles korrekt. Wenn nicht, kommt die Fehlermeldung ;-)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Antworten