Seite 1 von 1
Von Visual Basic aus Calc-Zellen ansprechen
Verfasst: Do, 02.02.2012 11:42
von Daniel Schneider
Hallo zusammen
Ich möchte gerne von Visual Basic aus mit zwei verschachtelten Schlaufen ein DataGridView exportieren, wie mir das bei Excel auch gelungen ist. Der erste Teil des Codes, das Öffnen von OpenOffice Calc gelingt mit folgendem Code:
Code: Alles auswählen
Dim oSM
Dim oDesk, oDoc, oTab, oZelle As Object
Dim arg(-1) As Object
oSM = CreateObject("com.sun.star.ServiceManager")
oDesk = oSM.createInstance("com.sun.star.frame.Desktop")
oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg)
Weiter schaffe ich es leider trotz zwei Fachbücher zu OO-Makros und stundenlangen Versuchen nicht. Ich denk vor folgenden Zeilen fehlt bloss noch eine:
Code: Alles auswählen
oZelle = oSM.createInstance("com.sun.star.table.CellAddress")
oTab = oDoc.Sheets(0)
oZelle = oTab.getCellByPosition(1, 2)
Hat da jemand einen Lösungsansatz? Vielen Dank im voraus.
Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; CODE tags gesetzt
Re: Von Visual Basic aus Calc-Zellen ansprechen
Verfasst: Do, 02.02.2012 14:06
von Frieder D.
Hallo
ich denke du hast das falsche Object:
Code: Alles auswählen
oZelle = oSM.createInstance("com.sun.star.table.CellAddress")
Richtig wäre:
Code: Alles auswählen
oZelle = oSM.createInstance("com.sun.star.table.XCell")
Und hier fehlt die Deklaration:
Muss heißen:
Code: Alles auswählen
oTab=oSM.createInstance("com.sun.star.sheet.XSpreadsheets")
oTab=oDoc.Sheets(0)
Warum arbeitest du mit Visual Basic?
Es ist viel einfacher mit dem Integrierten StarBasic zu arbeiten,
dann musst du nicht alle Sevices un Interfaces manuell aufrufen.
Beispiel:
Code: Alles auswählen
Sub Test
dim oDoc As object
dim oTab As object
dim oZelle As object
oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg)
oTab = oDoc.Sheets(0)
oZelle = oTab.getCellByPosition(1, 2)
oZelle.Value=4.67
oTab.getCellByPosition(0, 2).String="Wert"
'...
End Sub
Gruß Frieder
Re: Von Visual Basic aus Calc-Zellen ansprechen
Verfasst: Do, 02.02.2012 14:42
von Daniel Schneider
Vielen Dank für deine schnelle Antwort. Anhand deiner Antwort habe ich bezhüglich Deklaration etwas grundlegendes dazugelernt, das Problem konnte ich damit aber noch nicht lösen. Oder mache ich irgendetwas falsch? Hier der revidierte Code:
Code: Alles auswählen
Dim oSM
Dim oDesk, oDoc, oTab, oSheet, oZelle As Object
Dim arg(-1) As Object
Dim sURL As String
sURL = "file:///C:/Users/Daniel/Documents/Journalexport vom 01.02.2012 - 23¦57¦44.csv"
oSM = CreateObject("com.sun.star.ServiceManager")
oDesk = oSM.createInstance("com.sun.star.frame.Desktop")
oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg)
oTab = oSM.createInstance("com.sun.star.sheet.XSpreadsheets")
oTab = oDoc.Sheets(0)
oZelle = oSM.createInstance("com.sun.star.table.XCell")
oZelle = oTab.getCellByPosition(1, 5)
oZelle.Value = "Test"
Bei der Zeile
erscheint folgendende Fehlermeldung:
COM-Exception wurde nicht behandelt «Typkonflikt. (Ausnahme von HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))»
Anmerkung: Warum das mit VB mache, ist leicht zu beantworten: Das Programm soll möglichst überall lauffähig sein. Mit obiger Prozedur möchte ich lediglich die Exportfunktion für OpenOffice bereit stellen. Schliesslich werbe ich immer für OpenOffice, da wäre es nicht glaubwürdig, wenn in den eigenen Programmen keine entsprechende Exportfunktion zur Verfügung stünden.[/color]
Re: Von Visual Basic aus Calc-Zellen ansprechen
Verfasst: Do, 02.02.2012 15:50
von Karolus
Hallo
Ein Schuss ins Blaue -(mit null Ahnung von VB-syntax)- was passiert wenn du folgende Zeile auskommentierst:
Code: Alles auswählen
oZelle = oSM.createInstance("com.sun.star.table.XCell")
??
oZelle.Value = "Test" sollte IHMO lauten
oZelle.String = "Test"
Gruß Karo
Re: Von Visual Basic aus Calc-Zellen ansprechen
Verfasst: Do, 02.02.2012 16:11
von Daniel Schneider
Der zweite Tip klingt noch einleuchtend. Der erste hingegen kann keine Lösung sein. Denn schon in den nächsten beiden Zeilen verwende ich ja «oZelle», ergo muss ich es vorher deklarieren.
Ich habe schon so viele Varianten ausproviert, dass ich langsam daran zweifle, ob das ganze überhaupt möglich ist. Auch die Dokumentationen im Internet sind wenig hilfreich, weil sich alles sehr schnell ändert. Eines meiner Bücher bezieht sich auf die Version 3.1 und schon davon stimmt in 3.3 einige nicht mehr....(?!)
Re: Von Visual Basic aus Calc-Zellen ansprechen
Verfasst: Do, 02.02.2012 16:31
von Frieder D.
Hallo
ich habe mir jetzt doch mahl die Mühe gemacht ind VBA installiert(VB6 habe ich nicht)
nach ein wenig Probieren kam folgender lauffähiger Code heraus:
Code: Alles auswählen
Sub Set_Text_To_Cell()
Dim oSM 'Root object for accessing OpenOffice from VB
Dim oDesk, oDoc As Object 'First objects from the API
Dim arg() 'Ignore it for the moment !
Dim oSheet, oCell
'Instanciate OOo : this line is mandatory with VB for OOo API
Set oSM = CreateObject("com.sun.star.ServiceManager")
'Create the first and most important service
Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")
'Create a new doc
Set oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg())
Set oSheet = oDoc.Sheets.GetByIndex(0)
Set oCell = oSheet.getCellByPosition(1, 2)
oCell.setString ("TT")
End Sub
Gruß Frieder
Re: Von Visual Basic aus Calc-Zellen ansprechen
Verfasst: Do, 02.02.2012 16:43
von bst
Auch Hallo,
und FWIW,
Ich hatte das hier auch mit Set oSheet = oDoc.Sheets(index) probiert. Und das geht nun nicht ...
cu, Bernd
Re: Von Visual Basic aus Calc-Zellen ansprechen
Verfasst: Do, 02.02.2012 19:42
von Daniel Schneider
Ganz herlichen Dank. Jetzt endlich geht es. Ich bin sehr erleichtert nach Tage langem Verzweifeln....
Zur Vervollständigung der Dokumentation für alle mit ähnlichen Problemen:
1. Den Befehlt Set gibt es im akutellen Visual Basic nicht mehr, er entfällt ersatzlos.
2. Anscheinend sind die Zahlen für die Positionsangabe zwischen Excel und Calc genau umgkehrt; und bei Calc gilt im Gegensatz zu Excel Basis 0
3. Visual Basic Express ist gratis und man kann damit sehr viel erreichen. (Ich arbeite allerdings mit VB Prof. 2010.)