Problem mit Combobox beim Makro aufzeichnen

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

Moderator: Moderatoren

cldi
*
Beiträge: 11
Registriert: Do, 09.11.2006 18:02

Problem mit Combobox beim Makro aufzeichnen

Beitrag von cldi »

Hallo,

ich muss eine Stundenabrechnung, die auf Excel Makros aufbaut an Open Office anpassen.

Leider bin ich auf einige Probleme gestossen (abgesehen davon, dass die kompletten Makros umgeschrieben werden müssen :roll: ).

Ein Problem habe ich mit den ComboBoxen (die z.B. erst am OpenOffice 2.0 funktionieren)

Zum Herausfinden, wie Basic funktioniert habe ich das Makro aufzeichnen wollen.

In der Combobox gibt es verschiedene Auswahlmöglichkeiten z.B. U für Urlaub. Wenn U gewählt werden, soll in die Zeit Spalte 8:00 (Stunden) eingetragen werden und diese in die Spalte WAKUR übernommen werden.


Beim Aufzeichnen hat alles funktioniert, bis auf das U zu übernehmen. Es kam meines Erachten auch nicht im Aufgezeichneten Makro vor. Kann es sein, dass Basic nichts mit ComboBoxen anfangen kann?

Code: Alles auswählen

sub UrlaubUebertragen

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object


rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$E$11"
rem "$E$11" entspricht Spalte Zeit

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "8:00"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())

rem ----------------------------------------------------------------------
 dim args3(0) as new com.sun.star.beans.PropertyValue
 args3(0).Name = "ToPoint"
 args3(0).Value = "$K$11"
rem "$E$11" entspricht Spalte Zeit WAKUR

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
 dim args4(0) as new com.sun.star.beans.PropertyValue
 args4(0).Name = "StringName"
 args4(0).Value = "=E11"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args4())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0, Array())


end sub
Folglich würde ich daraus schliessen, dass sich des so wie ich es in VBA umgesetz habe nicht möglich ist? Stimmt das?

Code: Alles auswählen

Sub UrlaubKrank()

Dim x As Integer
Dim y As Integer

    For x = 4 To 34
        If (UCase(Cells(x, 7).Value) = "U") Then Cells(x, 11).Formula = "8:00:00"
    Next x
    
    For x = 4 To 34
        If (UCase(Cells(x, 7).Value) = "U") Then Cells(x, 5).Formula = "8:00:00"
    Next x
     
    For x = 4 To 34
        If (UCase(Cells(x, 7).Value) = "U") Then Cells(x, 6).Formula = "Urlaub"
    Next x
  
End Sub
Bin für jeden Lösungsvorschlag dankbar, den eigentlich sollte der "Komfort" durch die Umstellung nicht darunter leiden.

Vielen Dank im Voraus

cldi
Zuletzt geändert von cldi am Di, 14.11.2006 08:19, insgesamt 1-mal geändert.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey cldi,

also, wenn du umfangreiche Makros für OOo umstellen willst, solltest du dich mit den Grundlagen beschäftigen. Das Problem ist der Einstieg in die Makroprogrammierung von OOo. Grundsätzlich ist das ähnlich wie in VBA, nur das Objektmodell ist eben völlig anders.
Und da hilft die leider der Makrorekorder in OpenOffice.org nicht weiter. Der liefert nämlich nur den sogenannten "Dispatcher Code", eine Art Hilfscode, der parrallel zum eigentlichen Code auch funktioniert (meistens...). Für die Programmierung jedoch ist er wenig hilfreich.

Also: Comboboxen sind teil eines Formulars im Calc-Sheet, und die wiederum sind Teil der Drawpage. Jede Combobox (Objekt) hat einen speziellen Namen und so kannst du die auch ansprechen. Dann kannst du den Wert auslesen und weiterverarbeiten, zum Beispiel mit deinen If-Schleifen (das ist Basic und funktioniert so in OOo natürlich auch.)

Allerdings: Offensichtlich hast du gar keine Comboboxen - sondern wohl eher Gültigkeiten für eine Zelle als Auswahlliste - dein VBA Makro jedenfalls liest ja auch nur die Zellwerte aus - und keine Combo-Boxen.

So ganz erxchließt sich mir sowieso nicht der Sinn deines Makros (in VBA), ist wohl eher "umständlich" geschrieben , aber versuch es mal mit folgenden OOo Makro:

Code: Alles auswählen

Sub UrlaubKrank()

  Dim x As Integer
  Dim oZelle as Object
  dim oSheet as object
   oSheet = thisComponent.getCurrentController.getActivesheet().
   For x = 4 To 34
         oZelle = oSheet.getCellByPosition(x, 7)
        If (UCase(oZelle.string) = "U") Then 
            oSheet.getCellByPosition(x, 11).Formula = "8:00:00"
            oSheet.getCellByPosition(x, 5).Formula = "8:00:00"
            oSheet.getCellByPosition(x, 6).String = "Urlaub"
        end if
    Next x
End Sub 
Allerdings erschliesst sich mir auch nicht, wie du das Makro startest, aber das ist dann auch wie in Excel.

Na ja, wie gesagt, ich würde mir ein "gutes Buch zur Makroprogrammierung unter OOo zulegen - und ein wenig Grundlagenarbeit leisten :-)

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
cldi
*
Beiträge: 11
Registriert: Do, 09.11.2006 18:02

Beitrag von cldi »

Danke für die Antwort
Toxitom hat geschrieben:
Allerdings: Offensichtlich hast du gar keine Comboboxen - sondern wohl eher Gültigkeiten für eine Zelle als Auswahlliste - dein VBA Makro jedenfalls liest ja auch nur die Zellwerte aus - und keine Combo-Boxen.

ok, sorry mein Fehler, ist wirklich nur nee Auswahliste.

Ich habe es mit deinem Code ausprobiert. Leider wird in die erste If- Schleife gar nicht reingegangen.

Was genau macht den der Befehl: getCellByPosition
Bei den Versuch oZelle auszugeben passiert nichts...
Kann es sein, dass nicht auf die gewünschte Zelle zugegriffen wird?
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo

Entferne mal den Punkt am Ende der 5. Codezeile, dann funktioniert es.
cldi
*
Beiträge: 11
Registriert: Do, 09.11.2006 18:02

Beitrag von cldi »

der Punkt war bei mir sofort gelöscht, ganz blöd bin ich ja auch nicht ;)

aber an dem Punkt liegt es auch nicht, dass er nicht in die if schleife geht.

also wenn man es debuggt, wird ersichtlich dass es nicht funktioniert.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

aber an dem Punkt liegt es auch nicht, dass er nicht in die if schleife geht.

also wenn man es debuggt, wird ersichtlich dass es nicht funktioniert.
Dann ist die Bedingung nicht erfüllt, oder wird die Bedingung garnicht geprüft? Hast Du geprüft das die Bedingung geprüft wird?

Ich sehe zunächst keinen Fehler an dem Code.


Gruß
Stephan
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo

Bei mir funktioniert es tadellos,- ich trage 'u' oder 'U' in der 8. Tabellenzeile ein und starte das Makro - die Spalten werden ensprechend ausgefüllt.

Gruß Karo
cldi
*
Beiträge: 11
Registriert: Do, 09.11.2006 18:02

Beitrag von cldi »

Bei mir funktioniert endlich auch alles und zwar auch so wie es sein sollte.

Code: Alles auswählen


Sub UrlaubKrank()

  Dim x As Integer
  Dim oZelle as Object
  dim oSheet as object
   oSheet = thisComponent.getCurrentController.getActivesheet()
   For x = 3 To 34   
         oZelle = oSheet.getCellByPosition(6, x)
      
        If (UCase(oZelle.string) = "U") Then
            oSheet.getCellByPosition(10, x).Formula = "8:00:00"
    
            oSheet.getCellByPosition(4, x).Formula = "8:00:00"
             
            oSheet.getCellByPosition(5, x).String = "Urlaub"
              
        end if
        
         If (UCase(oZelle.string) = "K") Then
            oSheet.getCellByPosition(10, x).Formula = "8:00:00"
    
            oSheet.getCellByPosition(4, x).Formula = "8:00:00"
             
            oSheet.getCellByPosition(5, x).String = "Krank"
              
        end if
        
    Next x
End Sub
Interessant zu wissen wäre jetzt warum Open Office die Werte genau anders herum will und alles um eine Zelle verschoben wird, als wie bei Excel der Fall war (weiss des zufällig jemand?)
Fängt Open Office mit 0 an zuzählen?
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Beitrag von Karolus »

Hallo
Ich kenn mich mit Excel sehr wenig aus und kann dir dazu nichts sagen.
Die OOo-basic Syntax ist
....getCellbyPosition(Spaltennr,Zeilennr)
und ja, die Zählung beginnt in diesem Fall bei 0.
Die andere Möglichkeit ....getCellbyName("A1")
erwartet die Zeilennummerierung so wie Calc (Zählung beginnt bei 1).

Gruß Karo
Antworten