Übersetzung eines VBA-Makros nach OO-Basic

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

Moderator: Moderatoren

turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Hi Reimond,

hier ein Beispiel zum auslesen von Formularfeldern:

Code: Alles auswählen

Sub Formularfelder_Auslesen
	oDoc = thisComponent
	oController = oDoc.getCurrentController()
	oform=odoc.drawpage.forms.getbyindex(0)
	CtrlTextBox = oForm.getByName("TextBox") 'Achtung: Namen anpassen
	oKView = oController.getControl(CtrlTextBox)
	MyText = oKView.Model.Text
	msgbox mytext
	CtrlCheckBox = oForm.getByName("CheckBox")
	oKView = oController.getControl(CtrlCheckBox)
	Myctrl= oKView.model.State
	msgbox Myctrl
End Sub
Hilft das weiter?

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Hallo Reimond,

wenn die Textfelder "TextBox1" bis TextBox5" heissen dann kann man das wie folgt machen:

Code: Alles auswählen

.....
for i = 1 to 5
	CtrlTextBox = oForm.getByName("TextBox" & i) 
	oKView = oController.getControl(CtrlTextBox)
	MyText = oKView.Model.Text
	msgbox mytext
	next i
.....
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von komma4 »

Reimond,

wenn Du StarBasic besser begreifen willst, dann siehe Dir die Beispiele in Andrews Makro-Dokument an, oder die von http://www.dannenhoefer.de
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Hallo Reimond,

kommst Du damit weiter:

Code: Alles auswählen

Sub Name_2_Dateiname 
	dim dummy()
	oDoc = thisComponent
	oController = oDoc.getCurrentController()
	oform=odoc.drawpage.forms.getbyindex(0)
	CtrlTextBox = oForm.getByName("TextBox1")
	oKView = oController.getControl(CtrlTextBox)
	sName = oKView.Model.Text
	CtrlTextBox = oForm.getByName("TextBox2") 
	oKView = oController.getControl(CtrlTextBox)
	sVorname = oKView.Model.Text
	CtrlTextBox = oForm.getByName("TextBox3")
	oKView = oController.getControl(CtrlTextBox)
	sGebDat = oKView.Model.Text
	sLaufwerk = "C:/"
	Filename = sName & ", " & sVorname & " (" & sGebDat & ")"
	neuerpfad = sLaufwerk +  Filename + ".ods"
	dateiurl=converttourl(neuerpfad)
	odoc.storetourl(dateiurl,dummy())
End Sub
?

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Hallo Reimond,

es gibt bestimmt eine elegantere Lösung aber versuche es mal damit:

Code: Alles auswählen

Sub Formularfelder_Auslesen2
Dim Arg() 
Dim oDoc As Object
	oDoc = thisComponent
	oController = oDoc.getCurrentController()
	sUrl = convertToURL("C:\Textfelder.odt")
	vDoc=StarDesktop.loadComponentFromURL (sURL, "_blank", 63, Arg())
	z = 2 '2 = 3 Textfelder weil index bei 0 anfängt
	for i = 0 to 2   
	oform=odoc.drawpage.forms.getbyindex (0)
	CtrlTextBox = oForm.getbyindex (z)
	NameTextBox = CtrlTextBox.name
	oKView = oController.getControl(CtrlTextBox)
	MyText = oKView.Model.Text
	otext=vdoc.text
	ocursor=otext.createtextcursor()
	otext.insertString(ocursor,NameTextBox & ":" & CHR(9) & MyText & CHR(13)  ,false)
	z = z -1
	next i   
End Sub
Die Datei Textfelder.odt muss in dem Verzeichnis vorhanden sein sonst kommt eine Fehlermeldung.
Die Anzahl der Textfelder ist ensprechend anzupassen.

Viel Erfolg.
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Hallo Raimond,

vergiss den obigen Code. Der funktioniert so nicht wenn Checkboxen im Dokument sind.
Ich hänge hier mal eine funktionierende Beispieldatei an.
Denk daran:
turtle47 hat geschrieben:Die Datei Textfelder.odt muss in dem Verzeichnis C:\ vorhanden sein
bzw. den Namen oder Ort entsprechend im Code anpassen

Mit den Tabs "CHR(9) musst Du ausprobieren. Sonst mit Leerzeichen im Namenfeld korrigieren.

Viel Erfolg.

Jürgen
Dateianhänge
Formularfelder_auslesen.odt
(9.91 KiB) 79-mal heruntergeladen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Hallo Raimond,

ich habe das Makro so abgeändert, dass man nicht mehr die Anzahl der Objekte angeben muss.
Optionsfelder gehe jetzt auch.
Achtung: Wenn Schaltflächen im Dokument vorhanden sind gibt es einen Error.

Code: Alles auswählen

Sub Formularfelder_Auslesen2
Dim Arg() 
Dim oDoc As Object
	oDoc = thisComponent
	oController = oDoc.getCurrentController()
	sUrl = convertToURL("C:\Textfelder.odt")
	vDoc=StarDesktop.loadComponentFromURL (sURL, "_blank", 63, Arg())
	oform = odoc.drawpage.forms.getbyindex (0)
	ccount = oForm.count
	for i = 0 to ccount -1
	CtrlTextBox = oForm.getbyindex (i)
	CtlId = CtrlTextBox.ClassId
	NameTextBox = CtrlTextBox.name
	oKView = oController.getControl(CtrlTextBox)
	if CtlId = 9 then 'Textfeld
	Myctrl= oKView.model.Text
	MyText = Myctrl	
	elseif CtlId = 5 then 'Checkbox
	Myctrl= oKView.model.State
	MyText = Myctrl
	elseif CtlId = 3 then 'Optionsbutton
	Myctrl= oKView.model.State
	MyText = Myctrl
	end if
	otext = vdoc.text
	ocursor=otext.createtextcursor()
	ocursor.gotoend (false)
	otext.insertString(ocursor,NameTextBox & "  " & CHR(9) & MyText & CHR(13)  ,false)
	next i	   
End Sub
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Nabend Reimond,

da die Optionsfelder in einem Gruppierungsrahmen sein müssen verhalten diese sich ein wenig widerspenstig. :twisted:

Wenn Du die Optionsfelder dort bearbeiten willst, so musst Du im Entwurfsmodus einen Rechtsklick in die Gruppe machen
und Gruppe betreten auswählen. Danach kannst Du die Optionsfelder doppelt anklicken und in den Eigenschaften Einstellungen vornehmen. Ich habe dort zum Beispiel im Feld "Zusatzinformationen" (Tag) Text eingetragen, der
nachher im Dokument "Textfelder" angezeigt wird.

Die Auflistung der Gruppierungsrahmen und der Schaltfläche wird im Makro übersprungen.

Zur Veranschaulichung habe ich nochmals eine Beispieldatei mit ausführlicher Kommetierung beigefügt.
Formularfelder_auslesen_2.odt
(10.61 KiB) 134-mal heruntergeladen
Viel Erfolg und schöne Grüsse.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von komma4 »

lasse Dir sURL vor der fehlerwerfenen Anweisung anzeigen und kontrolliere den Inhalt:

Code: Alles auswählen

msgbox sURL
Die Fehlermeldung besagt, dass die Aufbereitung falsch ist....
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von komma4 »

Reimond hat geschrieben:DateiXYZ ist die Datei die ich durch das Makro erstelle.
...dann gibt es die Datei (noch) nicht?

Die Meldung sagt:
Die Datei (deren Namen Du angibst) kann nicht geladen werden.

Warum?
-weil der Name falsch geschrieben ist
-weil Dir Rechte zum Lesen der Datei fehlen
-weil der Pfade (Netzwerklaufwerk) nicht vorhanden ist

Welche Konsequenzen Du ziehen kannst? Beseitige den Fehler!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Hallo Raimond,

in dem von mir erstellten Ursprungscode steht ja die Zeile:

Code: Alles auswählen

sUrl = convertToURL("C:\Textfelder.odt")
Damit das Makro funktioniert muss die Datei "Textfelder.odt " unter "C:\" liegen sonst kommt besagte Fehlermeldung.
Dazu hatte ich bereits ja auch schon mal geschrieben:
turtle47 hat geschrieben:Die Datei Textfelder.odt muss in dem Verzeichnis vorhanden sein sonst kommt eine Fehlermeldung.
Es sei denn, Du hast die Pfadangabe im Makro verändert, dann muss die Datei natürlich an der angebenen Stelle vorhanden sein.
Reimond hat geschrieben:in der Zeile
vDoc=StarDesktop.loadComponentFromURL (sURL, "_blank", 63, Arg())
kommt es zur Fehlermeldung: BASIC Laufzeitfehler, URL seems to be an unsupported one....
Der Fehler kommt also beim Laden der Datei!
Das Ganze hat also nichts damit zu tun wie die erstellte Datei nachher abgespeichert wird!

Hilft Dir das weiter?

Schöne Grüsse.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Hallo Raimond,
Reimond hat geschrieben: danke, hab das jetzt wieder im Griff.
Was war denn nun die Fehlerursache?*

Suchst Du vielleicht sowas hier:

Code: Alles auswählen

sub Textfelder
   oDoc = thiscomponent
   oTxtFelder = oDoc.getTextFields().createEnumeration()
   do while oTxtFelder.hasmoreElements()
      oFeld = oTxtFelder.nextElement
      if oFeld.supportsService("com.sun.star.text.TextField.SetExpression") then
         msgbox oFeld.content 'Wert auslesen
         'oFeld.content = "Thomas" Wert Schreiben
      end if
   loop
   oDoc.getTextFields().refresh()
End Sub
?

Schöne Grüsse.

Jürgen

Edit: * Wir hier im Forum sind immer daran interessiert, was letztendlich zur Lösung beigetragen hat. :lol:
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Guten Morgen Raimond,

füge den neuen angepassten Code doch einfach an den "alten" Code unten an:

Code: Alles auswählen

next i ' alter Code
	' Ende alter Code
	'Start Bereich Felder auslesen
	oTxtFelder = oDoc.getTextFields().createEnumeration()
	do while oTxtFelder.hasmoreElements()
	oFeld = oTxtFelder.nextElement
	if oFeld.supportsService("com.sun.star.text.TextField.SetExpression") then
	myFieldName = oFeld.VariableName 'Name des Feldes	
	myFieldContent=  oFeld.content 'Wert des Feldes
	'oFeld.content = "Mein Wert" 'braucht man nur wenn man neuen Inhat einfügt
	end if
	'oDoc.getTextFields().refresh()'braucht man nur wenn man neuen Inhat eingefügt hat
	otext = vdoc.text
	ocursor=otext.createtextcursor() 'Cursor im Dokument setzen
	ocursor.gotoend (false) 'Cursor ans Ende des Dokumentes setzen
	otext.insertString(ocursor,myFieldName & "  " & CHR(9) & myFieldContent & CHR(13)  ,false)'Text in das Dokument einfügen
	Loop
End Sub
Fertig ist die Laube. :mrgreen:
Reimond hat geschrieben:Eignet sich für eine dezentrale Dankenbank.
Was soll den das für eine Datenbank werden?
Turtle 47 hat geschrieben:Mit den Tabs "CHR(9) musst Du ausprobieren. Sonst mit Leerzeichen im Namenfeld korrigieren.
Dazu ein kleiner Tip am Rande was die Tabs betrifft.
Füge in Deinem Zieldokument mal drei Zeilen Text ein. Dann markiere den ganzen Text und setze oben im Lineal einen linksbündigen Tab (z.B. 5 cm.). Dann lösche den ganzen Text so das der Cursor ganz am Anfang des Dokumentes steht.
Anschließend speichere das Zieldokument.

Schönen Tag noch.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Hallo Reimond,
Reimond hat geschrieben:Den Teil mit dem Tab habe ich mal ausprobiert. Ergebnis: die Erste Zeil war 5cm eingerückt.
War das die Idee ?
Nein, es sollte normalerweise dann so aussehen:
Tab.jpg
Tab.jpg (15.62 KiB) 2090 mal betrachtet
Ziel war, dass Du das hier nicht mehr brauchst:
Turtle47 hat geschrieben:Sonst mit Leerzeichen im Namenfeld korrigieren.
Die Zeile im Code sollte so aussehen:

Code: Alles auswählen

otext.insertString(ocursor,NameElement & CHR(9) & MyText & CHR(13)  ,false)'Text in das Dokument einfügen
Zum Testen hier mal meine Zieldatei:
Textfelder_1.odt
(7.21 KiB) 47-mal heruntergeladen
Schöne Grüsse.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Übersetzung eines VBA-Makros nach OO-Basic

Beitrag von turtle47 »

Reimond hat geschrieben:Dein bisheriges Makro ließt die Inhalte von "Listenfeldern" nicht aus.
kann ja auch nicht, weil der supportsService ein anderer ist.

Code: Alles auswählen

.....
	if oFeld.supportsService("com.sun.star.text.TextField.SetExpression") then
	myFieldName = oFeld.VariableName 'Name des Feldes	
	myFieldContent=  oFeld.content 'Wert auslesen	
	elseif oFeld.supportsService("com.sun.star.text.TextField.DropDown") then
	myFieldContent =  oFeld.SelectedItem 'Selektion auslesen
	myFieldName= oFeld.name 'Name des Feldes
	end if
....
Beschäftige Dich wie von mir schon einmal empfohlen mit "xray". Damit bekommt man das ganz einfach raus. 8)

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Antworten