| |

Visual-Basic EinsteigerVB6 und LibreOffice | |  | Autor: Hollie | Datum: 19.10.24 13:22 |
| Hallo und guten Tag,
leider finde ich im Netz nichts geeignetes, was für einen "DAU" greif- bzw. umsetzbar wäre.
Also:
ein existierendes VB6-Projekt (und die "*.exe") arbeitet mit einem MS-Excel-Workbook (und dessen Tabellenblätter) zusammen.
Soweit so gut, klappt alles.
Nun soll dieses Programm auf eine ".ods"-Datei (LibreOffice) umgerüstet werden.
Damit ergibt sich das Problem der Zugriffe auf die ".ods"-Datei.
Erste grundsätzliche Frage:
Was muss ich ggf. zusätzlich installieren, um aus VB6 (und dann der *.exe) heraus auf eine ".ods"-Datei zugreifen zu können ???
(Bei der Internet-Recherche lese ich öfters so etwas wie "com.sun.star.frame.Desktop" oder ähnlich.)
Kann es sein, dass ich "Java Runtime Environment" (bei mir speziell "jre-8u431-windows-x64.exe") installieren muss ?
Zweite Frage:
Muss ich im VB6-Projekt dann einen "Verweis" (welchen) einbinden?
Dritte Frage:
Was und wie muss ich deklarieren, um auf ods-Datei, Tabellenblatt und Zelle zugreifen zu können ?
Zum Vergleich zu MS-Excel die derzeitigen Deklarationen:
- Public EXC As Object
- Public ZELLE as Object
- Public KFR_A As Object 'Tabelle1
- Public KFR_K As Object 'Tabelle2
- Public KFR_F As Object 'Tabelle3
- Public Const DATEI = "C:\KFR_Daten.xlsx"
Beim EXE-Start (natürlich auch in VB6) setze ich dann
- Set EXC = CreateObject("Excel.application")
- EXC.Workbooks.Open DATEI
und vor dem Zugriff auf eine Zelle dann
- Set KFR_K = EXC.worksheets("Tabelle2")
- Set ZELLE = KFR_K.Cells
Ich hoffe, hier verständliche und notwendige Angaben gemacht zu haben.
Würde mich freuen, wenn mir jemand "idiotensicher" weiterhelfen könnte
(vielleicht gibt es auch hier im Forum einen guten Beitrag, den ich nicht gefunden habe).
Vielen Dank. |  |
Re: VB6 und LibreOffice | |  | Autor: Tueftel | Datum: 04.11.24 09:13 |
| Hallo "Hollie",
nach einiger Zeit recherchieren, konnte ich folgenden Code zusammenstellen. Sicher nicht perfekt, aber bei mir läuft er einwandfrei. Vielleicht ein erster Einstieg. Insgesamt nicht ganz einfach. Deine Daten musst Du natürlich noch anpassen. Gruß Tueftel
Option Explicit
Dim oSM As Object 'Root object for accessing
' OpenOffice from VB --> (ServiceManager)
Private Sub cmdLibreOfficeTest_Click()
Call LibreOfficeTest
End Sub
Sub LibreOfficeTest()
Dim oDesk As Object
Dim oDoc As Object
Dim oSheets As Object
Dim oSheet As Object
Dim oRange As Object
Dim vartest As Variant
Dim strtest As String
Dim strFileName As String
Set oSM = CreateObject("com.sun.star.ServiceManager")
Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")
Dim OpenParam(3) As Object 'Parameters to open the doc
Set OpenParam(0) = mAkePropertyValue2("ReadOnly", False)
Set OpenParam(1) = mAkePropertyValue2("Hidden", True)
Set OpenParam(2) = mAkePropertyValue2("FilterName", "calc8")
Set OpenParam(3) = mAkePropertyValue2("MacroExecutionMode", 4)
' Set OpenParam(4) = mAkePropertyValue2("AsTemplate", False)
' Set OpenParam(5) = mAkePropertyValue2("overwrite", True)
strFileName = "G:/Test" 'Sonderzeichen nicht erlaubt??
'Open existing doc
Set oDoc = oDesk.loadComponentFromURL("file:///" & strFileName & ".ods", _
"_blank", 0, OpenParam)
MsgBox "Datei geöffnet!"
Set OpenParam(0) = Nothing
Set OpenParam(1) = Nothing
Set OpenParam(2) = Nothing
Set OpenParam(3) = Nothing
' Set OpenParam(4) = Nothing
' Set OpenParam(5) = Nothing
'Get the Worksheet
Set oSheets = oDoc.getSheets()
Set oSheet = oSheets.getByName("Tabelle1")
MsgBox "Arbeitsblatt geöffnet!"
'Read the value of a selected cell
strtest = oSheet.getCellRangeByName("B1").String ' = oSelection.String
'Change the value of a selected cell
strtest = Date & "*" & Time
oSheet.getCellRangeByName("B1").String = strtest
Debug.Print "strtest = " & strtest
MsgBox "Daten geändert!"
'Save the spreadsheet
Dim SaveParam(0) As Object 'Parameters to save the doc
Set SaveParam(0) = mAkePropertyValue2("FilterName", "calc8")
oDoc.storeAsURL "file:///" & strFileName & "_Neu" & ".ods", SaveParam
Set SaveParam(0) = Nothing
MsgBox "Daten gespeichert! - Neue Datei"
'Save the spreadsheet
Dim SaveParam2(1) As Object 'Parameters to save the doc
Set SaveParam2(0) = mAkePropertyValue2("FilterName", "calc8")
Set SaveParam2(1) = mAkePropertyValue2("overwrite", True)
oDoc.storeAsURL "file:///" & strFileName & ".ods", SaveParam
Set SaveParam2(0) = Nothing
Set SaveParam2(1) = Nothing
MsgBox "Daten gespeichert! - Überschrieben"
oDoc.dispose
oDesk.Terminate
Set oRange = Nothing
Set oSheet = Nothing
Set oSheets = Nothing
Set oDoc = Nothing
Set oDesk = Nothing
Set oSM = Nothing
End Sub
Public Function mAkePropertyValue2(cName, uValue)
Dim oStruct As Object
Set oStruct = oSM.Bridge_getStruct("com.sun.star.beans.PropertyValue")
oStruct.Name = cName
oStruct.Value = uValue
Set mAkePropertyValue2 = oStruct
Set oStruct = Nothing
End Function |  |
Re: VB6 und LibreOffice | |  | Autor: Hollie | Datum: 05.11.24 11:48 |
| Oi, hatte gar nicht mehr mit einer Antwort gerechnet, WOW toll.
Hallo Tueftel, vielen Dank.
Nun mein Versuchsresultat:
der Ablauf "stirbt" in der Zeile
'Open existing doc
Set oDoc = oDesk.loadComponentFromURL("file:///" & strFileName & ".ods", "_blank", 0, OpenParam)
mit LfzF 424 "Object erforderlich"
(Datei- und Pfadangabe sind aber angepasst, also bei mir ok).
Das führt mich auf meine beiden Eingangsfragen zurück:
Erste grundsätzliche Frage:
Was muss ich ggf. zusätzlich installieren, um aus VB6 (und dann der *.exe) heraus auf eine ".ods"-Datei zugreifen zu können ???
(Bei der Internet-Recherche lese ich öfters so etwas wie "com.sun.star.frame.Desktop" oder ähnlich.)
Kann es sein, dass ich "Java Runtime Environment" (bei mir speziell "jre-8u431-windows-x64.exe") installieren muss ?
Zweite Frage:
Muss ich im VB6-Projekt dann einen "Verweis" (welchen) einbinden?
Könntest Du mir da noch Tipps bzw. Antworten geben?
Vielen Dank. |  |
Re: VB6 und LibreOffice | |  | Autor: Tueftel | Datum: 05.11.24 15:07 |
| Hallo Hollie,
als erstes habe ich mir LibreOffice Version 24.8 im Standardmodus installiert. Ich hatte allerdings auch schon einmal eine Portable Version installiert. Ob das etwas ausmacht, weiß ich nicht.
Als nächstes eine Testdatei in LibreCalc in einem anderen Laufwerk (evtl. USB Stick) im Hauptverzeichnis gespeichert. Im Laufwerk C:/ des Rechners hatte ich Probleme mit Zugriffsrechten. Ein Dateiname mit Sonderzeichen macht ebenfalls noch Probleme. Selbst ein "Leerzeichen" muss konvertiert werden. Stellt man fest, wenn man ein Makro aufzeichnet.
Spezielle Verweise oder Komponenten wurden nicht eingesetzt.
Zum weiteren Testen würde ich erst einmal eine Testdatei (siehe oben) anlegen und schauen ob es dann immer noch klemmt.
Hier noch einige Links:
https://help.libreoffice.org/7.3/de/text/sbasic/shared/main0601.html?DbPAR=BASIC
https://api.libreoffice.org/docs/idl/ref/index.html
Mehr kann ich von hier aus leider erst einmal nicht helfen.
Gruß
Tueftel |  |
Re: VB6 und LibreOffice | |  | Autor: Hollie | Datum: 06.11.24 14:31 |
| 
Hallo Tueftel, Dein Hinweis hat mich auf meinen Fehler geschubbst.
Das Öffnen erfolgt hier mit "Slash" in der Pfadangabe, ich hatte althergebracht den "Backslash" drin.
Das ist korrigiert und nunmehr erfolgreich getestet.
Ein VIELFACHES "Danke".
Vl. an Dich eine allerletzte Frage, vl. hast Du noch diesen Tipp:
Das Öffnen versteckt erfolgt ja mit dem Parameter "Set OpenParam(1) = mAkePropertyValue2("Hidden", True)".
Wie kann ich die Datei - während diese läuft - von "Hidden=False" bzw. "Hidden=True" in den jeweils
anderen Zustand versetzen?
(Hab leider im Web noch nichts passendes gefunden.)
Ok, in jedem Fall: danke für Deine Zeit und Mühe, beste Grüße von mir. |  |
Re: VB6 und LibreOffice | |  | Autor: Tueftel | Datum: 06.11.24 18:08 |
| Hallo Hollie,
der "Zaubercode" lautet bei mir:
oDoc.getCurrentController.getFrame.getContainerWindow().setVisible (False) 'oder true
'Set OpenParam(1) = mAkePropertyValue2("Minimized", True) 'Minimized ist auch ein neuer Parameter!
Ich würde allerdings nicht manuell in der geöffneten Tabelle etwas ändern. Aber ein Versuch ist es wert.
Nachfolgend der neue Code:
Option Explicit
Dim oSM As Object 'Root object for accessing
' OpenOffice from VB --> (ServiceManager)
Sub LibreOfficeTest()
Dim oDesk As Object
Dim oDoc As Object
Dim oSheets As Object
Dim oSheet As Object
Dim oRange As Object
Dim vartest As Variant
Dim strtest As String
Dim strFileName As String
Set oSM = CreateObject("com.sun.star.ServiceManager")
Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")
Dim OpenParam(3) As Object 'Parameters to open the doc
Set OpenParam(0) = mAkePropertyValue2("ReadOnly", False)
Set OpenParam(1) = mAkePropertyValue2("Hidden", True)
'Set OpenParam(1) = mAkePropertyValue2("Minimized", True)
Set OpenParam(2) = mAkePropertyValue2("FilterName", "calc8")
Set OpenParam(3) = mAkePropertyValue2("MacroExecutionMode", 4)
' Set OpenParam(4) = mAkePropertyValue2("AsTemplate", False)
' Set OpenParam(5) = mAkePropertyValue2("overwrite", True)
strFileName = "G:/Test" 'Sonderzeichen nicht erlaubt??
'Open existing doc
Set oDoc = oDesk.loadComponentFromURL("file:///" & strFileName & ".ods", _
"_blank", 0, OpenParam)
MsgBox "Datei geöffnet!"
oDoc.getCurrentController.getFrame.getContainerWindow().setVisible (True)
Set OpenParam(0) = Nothing
Set OpenParam(1) = Nothing
Set OpenParam(2) = Nothing
Set OpenParam(3) = Nothing
' Set OpenParam(4) = Nothing
' Set OpenParam(5) = Nothing
'Get the Worksheet
Set oSheets = oDoc.getSheets()
Set oSheet = oSheets.getByName("Tabelle1")
MsgBox "Arbeitsblatt geöffnet!"
'Read the value of a selected cell
strtest = oSheet.getCellRangeByName("B1").String ' = oSelection.String
Debug.Print "Datum/Zeit vorher: " & strtest
'Change the value of a selected cell
strtest = Date & "*" & Time
oSheet.getCellRangeByName("B1").String = strtest
strtest = oSheet.getCellRangeByName("B1").String ' = oSelection.String
Debug.Print "Datum/Zeit nachher: " & strtest
MsgBox "Daten geändert!"
oDoc.getCurrentController.getFrame.getContainerWindow().setVisible (False)
'Save the spreadsheet
Dim SaveParam(0) As Object 'Parameters to save the doc
Set SaveParam(0) = mAkePropertyValue2("FilterName", "calc8")
oDoc.storeAsURL "file:///" & strFileName & "_Neu" & ".ods", SaveParam
Set SaveParam(0) = Nothing
MsgBox "Daten gespeichert! - Neue Datei"
'Save the spreadsheet
Dim SaveParam2(1) As Object 'Parameters to save the doc
Set SaveParam2(0) = mAkePropertyValue2("FilterName", "calc8")
Set SaveParam2(1) = mAkePropertyValue2("overwrite", True)
oDoc.storeAsURL "file:///" & strFileName & ".ods", SaveParam
Set SaveParam2(0) = Nothing
Set SaveParam2(1) = Nothing
MsgBox "Daten gespeichert! - Überschrieben"
oDoc.dispose
oDesk.Terminate
Set oRange = Nothing
Set oSheet = Nothing
Set oSheets = Nothing
Set oDoc = Nothing
Set oDesk = Nothing
Set oSM = Nothing
End Sub
Public Function mAkePropertyValue2(cName, uValue)
Dim oStruct As Object
Set oStruct = oSM.Bridge_getStruct("com.sun.star.beans.PropertyValue")
oStruct.Name = cName
oStruct.Value = uValue
Set mAkePropertyValue2 = oStruct
Set oStruct = Nothing
End Function
Private Sub cmdLibreOfficeTest_Click()
Call LibreOfficeTest
End Sub Ich hoffe, das hilft Dir.
Gruß Tüftel |  |
Re: VB6 und LibreOffice | |  | Autor: Hollie | Datum: 08.11.24 17:57 |
| Super, vielen Dank Tueftel, scheinst ja mehr zu wissen, als es den Anschein hat 
Probiere ich am WE aus, bin aber sehr optimistisch.
Vielen Dank und Dir frohes Schaffen. VG Hollie. |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
sevWizard für VB5/6 
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere InfosTipp des Monats TOP Entwickler-Paket 
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1866.50 EUR...
Jetzt nur 979,00 EURWeitere Infos
|