Discussion:
VB.NET und Office Programme
(zu alt für eine Antwort)
Thomas Ellinger
2004-04-27 09:52:59 UTC
Permalink
Hallo NG,

Programmiere ein DB Programm mit Excel und Word Export Funktionen. Da ich
auf meinem Entwicklungsrechner Office XP installiert habe, funktionieren die
Funktionen bei Office 97 und 2000 nicht obwohl ich einen "korrekten"
Installer erstellt habe. Wird wohl daran liegen, dass ich die Excel und Word
Object Libraries 10.0 von Office XP verteile.

Jetzt die Frage: was muss ich tun dass mein Programm alle Word und Excel
Versionen unterstützt. Ich kann nicht 100%ig sagen welche Office Versionen
die Anwender installiert haben.

Bin dankbar über jede Hilfe

Thomas
Volker Biedermann
2004-04-27 10:13:57 UTC
Permalink
Hallo Thomas,
Post by Thomas Ellinger
Hallo NG,
Programmiere ein DB Programm mit Excel und Word Export Funktionen. Da ich
auf meinem Entwicklungsrechner Office XP installiert habe, funktionieren die
Funktionen bei Office 97 und 2000 nicht obwohl ich einen "korrekten"
Installer erstellt habe. Wird wohl daran liegen, dass ich die Excel und Word
Object Libraries 10.0 von Office XP verteile.
Jetzt die Frage: was muss ich tun dass mein Programm alle Word und Excel
Versionen unterstützt. Ich kann nicht 100%ig sagen welche Office Versionen
die Anwender installiert haben.
Schau dir mal bitte
http://www.google.de/groups?hl=de&lr=&ie=UTF-8&oe=UTF-8&selm=089201c42549%247cef3bb0%24a501280a%40phx.gbl
an. Erst vor wenigen Tagen hatten wir hier das Thema.

Gruß
Volker
Thomas Ellinger
2004-04-27 11:18:25 UTC
Permalink
Danke für den Tip! Dann muss ich jetzt wohl meine Word und Excel Klassen
nochmal umschreiben....
Post by Volker Biedermann
Hallo Thomas,
Post by Thomas Ellinger
Hallo NG,
Programmiere ein DB Programm mit Excel und Word Export Funktionen. Da ich
auf meinem Entwicklungsrechner Office XP installiert habe, funktionieren
die
Post by Thomas Ellinger
Funktionen bei Office 97 und 2000 nicht obwohl ich einen "korrekten"
Installer erstellt habe. Wird wohl daran liegen, dass ich die Excel und
Word
Post by Thomas Ellinger
Object Libraries 10.0 von Office XP verteile.
Jetzt die Frage: was muss ich tun dass mein Programm alle Word und Excel
Versionen unterstützt. Ich kann nicht 100%ig sagen welche Office Versionen
die Anwender installiert haben.
Schau dir mal bitte
http://www.google.de/groups?hl=de&lr=&ie=UTF-8&oe=UTF-8&selm=089201c42549%24
7cef3bb0%24a501280a%40phx.gbl
Post by Volker Biedermann
an. Erst vor wenigen Tagen hatten wir hier das Thema.
Gruß
Volker
Thomas Ellinger
2004-04-27 12:03:35 UTC
Permalink
stehe jetzt vor dem Problem dass ich nicht weiß wie ich die Objekte aus
meiner alten Klasse instanzieren soll.

dim wdRng as Object
wie instanziere ich es?

hatte in meiner alten Klasse noch ein Objekt vom Typ Word.Table:
Dim wdTabelle As Word.Table
jetzt: dim wdTabelle as Object
wie instanziere ich dies?

Danke
Post by Volker Biedermann
Hallo Thomas,
Post by Thomas Ellinger
Hallo NG,
Programmiere ein DB Programm mit Excel und Word Export Funktionen. Da ich
auf meinem Entwicklungsrechner Office XP installiert habe, funktionieren
die
Post by Thomas Ellinger
Funktionen bei Office 97 und 2000 nicht obwohl ich einen "korrekten"
Installer erstellt habe. Wird wohl daran liegen, dass ich die Excel und
Word
Post by Thomas Ellinger
Object Libraries 10.0 von Office XP verteile.
Jetzt die Frage: was muss ich tun dass mein Programm alle Word und Excel
Versionen unterstützt. Ich kann nicht 100%ig sagen welche Office Versionen
die Anwender installiert haben.
Schau dir mal bitte
http://www.google.de/groups?hl=de&lr=&ie=UTF-8&oe=UTF-8&selm=089201c42549%24
7cef3bb0%24a501280a%40phx.gbl
Post by Volker Biedermann
an. Erst vor wenigen Tagen hatten wir hier das Thema.
Gruß
Volker
Volker Biedermann
2004-04-27 12:15:05 UTC
Permalink
Hallo Thomas,
Post by Thomas Ellinger
stehe jetzt vor dem Problem dass ich nicht weiß wie ich die Objekte aus
meiner alten Klasse instanzieren soll.
dim wdRng as Object
wie instanziere ich es?
Dim wdTabelle As Word.Table
jetzt: dim wdTabelle as Object
wie instanziere ich dies?
IMHO ist "as Object" richtig. Durch LateBinding wirst du da kaum eine
Alternative haben. Auch die "Intellisense" der Officeobjekte hast du dann
nicht. Auch Option Strict Off geht dann nicht. aber die entsprechenden
Methoden und Funktionen der Office-Objekte sind dir ja schon bekannt.

HTH

Gruß Volker
Peter Fleischer
2004-04-27 12:55:56 UTC
Permalink
Volker Biedermann wrote:
...
Post by Volker Biedermann
IMHO ist "as Object" richtig. Durch LateBinding wirst du da kaum eine
Alternative haben. Auch die "Intellisense" der Officeobjekte hast du
dann nicht. Auch Option Strict Off geht dann nicht. ...
Volker,
wie ist der letzte Satz zu verstehen?

Peter
Volker Biedermann
2004-04-27 13:10:53 UTC
Permalink
Hallo Peter,
Post by Peter Fleischer
Post by Volker Biedermann
dann nicht. Auch Option Strict Off geht dann nicht. ...
Volker,
wie ist der letzte Satz zu verstehen?
Super, klassiche Freud'sche Fehlleistung meinerseits. ;-) Sollte natürlich
Option Strict On (habe ich immer) heisen.
Was bin ich froh, das ich mich (vorerst) nicht mit Office-Automation
beschäftigen, darf. :-)

Gruß
Volker
Peter Fleischer
2004-04-27 12:21:27 UTC
Permalink
Post by Thomas Ellinger
stehe jetzt vor dem Problem dass ich nicht weiß wie ich die Objekte
aus meiner alten Klasse instanzieren soll.
dim wdRng as Object
wie instanziere ich es?
Thomas,
dazu gibt es immer noch GetObject und CreateObject.
Post by Thomas Ellinger
Dim wdTabelle As Word.Table
jetzt: dim wdTabelle as Object
wie instanziere ich dies?
Indem du dir einen Verweis aus der entsprechenden Eigenschaft des
übergeordneten Objektes des Objektmodells holst. "Word.Table" gehört zum
Documents-Object.

Peter
Thomas Ellinger
2004-04-27 13:16:00 UTC
Permalink
Hallo nochmal,

irgendwie will das bei mir nicht funktionieren. Ich verwende den folgenden
Code:
wdApp = CreateObject("Word.Application")
'wdApp = New Word.Application()
wdApp.Visible = False
wdDoc = wdApp.Documents.Add
wdTable = GetObject(, "Word.Table")
bei wdTable = GetObject(, "Word.Table") erhalte ich die Fehlermeldung:
Active-X Komponente kann nicht erzeugt werden.

Obwohl das Word Objekt eigentlich bereits erstellt sein müsste.

Habs auch schon mit wdTable = CreateObject("Word.Table")
CreateObject("wdDoc") bzw. GetObject("Word.Table") und
GetObject("wdDoc.Table") versucht.
Post by Volker Biedermann
Post by Thomas Ellinger
stehe jetzt vor dem Problem dass ich nicht weiß wie ich die Objekte
aus meiner alten Klasse instanzieren soll.
dim wdRng as Object
wie instanziere ich es?
Thomas,
dazu gibt es immer noch GetObject und CreateObject.
Post by Thomas Ellinger
Dim wdTabelle As Word.Table
jetzt: dim wdTabelle as Object
wie instanziere ich dies?
Indem du dir einen Verweis aus der entsprechenden Eigenschaft des
übergeordneten Objektes des Objektmodells holst. "Word.Table" gehört zum
Documents-Object.
Peter
Peter Fleischer
2004-04-27 14:02:57 UTC
Permalink
Thomas Ellinger wrote:
...
Post by Thomas Ellinger
wdDoc = wdApp.Documents.Add
wdTable = GetObject(, "Word.Table")
Active-X Komponente kann nicht erzeugt werden.
Obwohl das Word Objekt eigentlich bereits erstellt sein müsste.
Habs auch schon mit wdTable = CreateObject("Word.Table")
CreateObject("wdDoc") bzw. GetObject("Word.Table") und
GetObject("wdDoc.Table") versucht.
...

Thomas,
ich empfehle dir, dich mal ausgiebiger mit der Nutzung von Klassen,
Eigenschaften, Methoden usw. zu beschäftigen.

"Word.Table" ist ein Object, welches dem Document-Object untergeordnet ist
(s. Objektmodell von Word). Mit CreateObject bzw. GetObject holst du dir den
Verweis auf eine Instanz eines automatisierbaren Objektes. Das ist die
Word-Anwendung. In der Anwendung selbst kannst du über die
Documents-Auflistung auf die von Word geöffneten Dokumente zugreifen. Über
die Tables-Auflistung kannst du auf die im geöffneten Dokument vorhandenen
Table-Objekte zugreifen.

Da du mit einem neuen Dokument arbeitest, musst du die Add-Methode des
Document-Objektes nutzen, um implizit ein neues Table-Objekt zu erzeugen.
Das könnte so aussehen:

Dim wdApp As Object
Dim wdDoc As Object
Dim wdRng As Object
Dim wdTbl As Object
Dim i As Integer, k As Integer

Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

Set wdDoc = wdApp.Documents.Add(Template:="Normal")

Set myRng = wdDoc.Range(Start:=0, End:=0)
Set wdTbl = wdDoc.Tables.Add(Range:=myRng, NumRows:=3, NumColumns:=4)

For i = 1 To 4
For k = 1 To 3
wdTbl.Columns(i).Cells(k) = "Zelle " & CStr(i) & " - " & CStr(k)
Next k
Next i

Peter
Peter Fleischer
2004-04-27 14:09:16 UTC
Permalink
Peter Fleischer wrote:
...
...

Thomas,
das Beispiel war aus dem falschen Film. Hier das richtige:

...
Dim wdApp As Object
Dim wdDoc As Object
Dim wdRng As Object
...
wdApp = CreateObject("Word.Application")

' Tabelle erstellen
Dim tb As Object
Dim I As Integer, k As Integer
wdApp = CreateObject("Word.Application")
wdDoc = wdApp.Documents.Add(Template:="Normal")
wdRng = wdDoc.Range
wdDoc.Tables.Add(wdRng, 100, 4)
For I = 1 To 100
For k = 1 To 4
setfield(1, I, k, "test")
Next k
Next I
wdApp.Visible = True
...
Sub setfield(ByVal I As Integer, ByVal row As Integer, _
ByVal col As Integer, ByVal txt As Object)
wdDoc.Tables(I).Cell(row, col).row.Height = (0.4)
wdDoc.Tables(I).Cell(row, col).Range.Text = txt
End Sub

Peter
Thomas Ellinger
2004-04-27 15:01:40 UTC
Permalink
Danke Peter,

Kaum macht mans richtig, schön läufts :-).

Bin da wohl durch CreateObject und GetObject etwas durcheinandergekommen.
Beim Early Binding erstellt man ja auch nur eine Instanz vom
Word.Application Object und erstellt das Word Document über die Add Methode
des erzeugten Word.Application Objects.

Bin seither um CreateObject herumgekommen. Wenn man hauptsächlich DB
Programmierung macht wohl auch kein Wunder. Aber man lernt halt nie aus -
zum Glück gibts solche Versionsprobleme mit Office Produkten beim early
binding ;-)

Dann schau ich jetzt mal weiter wie ich die Performance noch verbessern
kann. In einem Thread stand dass das Range Objekt schneller als das
Selection Objekt ist (oder wars andersrum?). Schaun mr mal...

Viele Grüsse

Thomas
Post by Volker Biedermann
...
...
Thomas,
...
Dim wdApp As Object
Dim wdDoc As Object
Dim wdRng As Object
...
wdApp = CreateObject("Word.Application")
' Tabelle erstellen
Dim tb As Object
Dim I As Integer, k As Integer
wdApp = CreateObject("Word.Application")
wdDoc = wdApp.Documents.Add(Template:="Normal")
wdRng = wdDoc.Range
wdDoc.Tables.Add(wdRng, 100, 4)
For I = 1 To 100
For k = 1 To 4
setfield(1, I, k, "test")
Next k
Next I
wdApp.Visible = True
...
Sub setfield(ByVal I As Integer, ByVal row As Integer, _
ByVal col As Integer, ByVal txt As Object)
wdDoc.Tables(I).Cell(row, col).row.Height = (0.4)
wdDoc.Tables(I).Cell(row, col).Range.Text = txt
End Sub
Peter
Peter Fleischer
2004-04-27 16:23:35 UTC
Permalink
Thomas Ellinger wrote:
...
verbessern kann. In einem Thread stand dass das Range Objekt
schneller als das Selection Objekt ist (oder wars andersrum?). Schaun
mr mal...
Thomas,
lass die Finger vom Selection-Objekt. Langsam! Und der Anwender kann stören!

Peter
Thomas Ellinger
2004-04-28 22:54:08 UTC
Permalink
alles klar Peter, werde das Selection Objekt verbannen...

Danke für alles!!!
Post by Volker Biedermann
...
verbessern kann. In einem Thread stand dass das Range Objekt
schneller als das Selection Objekt ist (oder wars andersrum?). Schaun
mr mal...
Thomas,
lass die Finger vom Selection-Objekt. Langsam! Und der Anwender kann stören!
Peter
Lesen Sie weiter auf narkive:
Loading...