Von Visual Basic aus Calc-Zellen ansprechen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Von Visual Basic aus Calc-Zellen ansprechen

Re: Von Visual Basic aus Calc-Zellen ansprechen

von Daniel Schneider » Do, 02.02.2012 19:42

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.)

Re: Von Visual Basic aus Calc-Zellen ansprechen

von bst » Do, 02.02.2012 16:43

Auch Hallo,

und FWIW,

Code: Alles auswählen

  Set oSheet = oDoc.Sheets.GetByIndex(0)
:o

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

von Frieder D. » Do, 02.02.2012 16:31

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

von Daniel Schneider » Do, 02.02.2012 16:11

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

von Karolus » Do, 02.02.2012 15:50

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

von Daniel Schneider » Do, 02.02.2012 14:42

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

Code: Alles auswählen

oZelle = oTab.getCellByPosition(1, 5)
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

von Frieder D. » Do, 02.02.2012 14:06

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:

Code: Alles auswählen

oTab = oDoc.Sheets(0)
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

Von Visual Basic aus Calc-Zellen ansprechen

von Daniel Schneider » Do, 02.02.2012 11:42

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

Nach oben