vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
VB6 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel