Tabellendarstellung FAQ:2363

Endlich habe ich mich hinter FAQ 2363 gemacht und wollte versuchsweise ein paar markierte Felder aus einer xls-Tabelle in W-W-W einfügen. Bei der Ausführung des Makros Bereich2W_W_W() erhielt ich bei Dim Kurz As DataObject (in der vierten Zeile des Makros) folgende Fehlermeldung:
„Fehler beim Kompilieren: Benutzerdefinierter Typ nicht definiert.“
Wenn ich umgekehrt eine von Thomas Ramel mit FAQ 2363 erstellte Tabelle von W-W-W mit dem Makro W_W_W2Bereich() ins Excel übernehmen möchte, erhalte ich die gleiche Fehlermeldung.
Ist dieser Fehler hier im Forum schon einmal besprochen worden?
Für Eure Hilfe jetzt schon herzlichen Dank.
Niclaus
PS Ich arbeite mit Excel 2003 (SP 2) und mit Visual Basic 6.0.

Hallo Niclaus,

Bereich2W_W_W() erhielt ich bei Dim Kurz As DataObject (in der
vierten Zeile des Makros) folgende Fehlermeldung:
„Fehler beim Kompilieren: Benutzerdefinierter Typ nicht
definiert.“
Wenn ich umgekehrt eine von Thomas Ramel mit FAQ 2363
erstellte Tabelle von W-W-W mit dem Makro W_W_W2Bereich() ins
Excel übernehmen möchte, erhalte ich die gleiche
Fehlermeldung.
Ist dieser Fehler hier im Forum schon einmal besprochen
worden?

hast du den Verweis gesetzt?

PS Ich arbeite mit Excel 2003 (SP 2) und mit Visual Basic
6.0.

Nein :smile: du hast Vba 10 oder 11, weiß grad nicht auswendig, richtig ist, es hat eine Teilmenge und paar Zusätze von/zu Vb6.0.
Aber nicht wichtig.

Aus verschiedenen Gründen habe ich einiges am Gesamtcode neu geschrieben,
Ist aber noch in der Testphase, wenn du magst:

http://www.hostarea.de/server-03/Maerz-eb30fd9489.zip

Entpacke die zip, sind 4 Codemodule drin, im Editor Rechtsklick auf Personl.xls, Datei importieren und hol nacheinander die 4 Dateien rein.
Les dir durch was in den Modulkommentaren steht und mach das, also mit Workbooks_Open usw.

Excel schließen, neu starten, dann kannst du testen mit Strg+w den markierten Tabelleberich in w-w-w einzufügen, oder auch mit Strg+t eine z.B. von Thomas gepostete tabelle in w-w-w in das aktuelle Blatt in Excel einzufügen.

Gruß
Reinhard

Aus verschiedenen Gründen habe ich einiges am Gesamtcode neu
geschrieben,
Ist aber noch in der Testphase, wenn du magst:

http://www.hostarea.de/server-03/Maerz-eb30fd9489.zip
Gruß Reinhard

Grüezi Reinhard
Mit Deiner neuen Version klappt es bestens. xls2www und www2xls.
Vielen Dank.
Eine Bitte noch: Könntest Du nicht schauen, dass FAQ:2363 zu einem internationalen Standard erklärt wird. Das würde doch das Arbeiten mit Tabellen im Internet weltweit wesentlich (www) erleichtern.
Noch einmal herzlichen Dank und viele Grüsse aus dem wunderbar frühlingshaften Zürich.
Niclaus

Hi Reinhard

Hallo Niclaus,

Bereich2W_W_W() erhielt ich bei Dim Kurz As DataObject (in der
vierten Zeile des Makros) folgende Fehlermeldung:
„Fehler beim Kompilieren: Benutzerdefinierter Typ nicht
definiert.“
Ist dieser Fehler hier im Forum schon einmal besprochen
worden?

hast du den Verweis gesetzt?

Ev. könntest Du hier aud ‚late binding‘ umstellen, dann muss der Verweis nicht händich gesetzt werden und auch die Excel-Version speilt dann keine so grosse Rolle mehr.

Aus verschiedenen Gründen habe ich einiges am Gesamtcode neu
geschrieben,
Ist aber noch in der Testphase, wenn du magst:

http://www.hostarea.de/server-03/Maerz-eb30fd9489.zip

Les dir durch was in den Modulkommentaren steht und mach das,
also mit Workbooks_Open usw.

Excel schließen, neu starten, dann kannst du testen mit Strg+w
den markierten Tabelleberich in w-w-w einzufügen, oder auch
mit Strg+t eine z.B. von Thomas gepostete tabelle in w-w-w in
das aktuelle Blatt in Excel einzufügen.

Das Auslesen klappt schon mal recht gut - aber mit dem Einlesen einer hier kopierten Tabelle kann ich noch nicht so viel anfangen - das war in der vorherigen Verison IMO besser.

Momentan wird beim Einlesen nicht die komplette kopierte Tabelle eingelesen sondern irgendwas zerstückeltes und es wird auch die temporäre Dummy-Tabelle in die Mappe eingefügt.

Tabellenblatt: [MAPPE1]!Tabelle1
 │ A │ B │ C │ D │
───┼───┼───┼───┼───┤
 1 │ 5 │ 5 │ 5 │ 5 │
───┼───┼───┼───┼───┤
 2 │ 5 │ 5 │ 5 │ 5 │
───┼───┼───┼───┼───┤
 3 │ 5 │ 5 │ 5 │ 5 │
───┼───┼───┼───┼───┤
 4 │ 5 │ 5 │ 5 │ 5 │
───┼───┼───┼───┼───┤
 5 │ 5 │ 5 │ 5 │ 5 │
───┴───┴───┴───┴───┘
A1:smiley:5
haben das Zahlenformat: Standard

Tabellendarstellung erreicht mit dem Code in FAQ:2363


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüezi Thomas, Niclaus,

hast du den Verweis gesetzt?

Ev. könntest Du hier aud ‚late binding‘ umstellen, dann muss
der Verweis nicht händich gesetzt werden und auch die
Excel-Version speilt dann keine so grosse Rolle mehr.

okay, muß ich schauen wie man das macht, hab zwar schon mehrfach die Begriffe early & late binding gesehen aber noch nicht so mit beschäftigt.

Aus verschiedenen Gründen habe ich einiges am Gesamtcode neu
geschrieben,
Ist aber noch in der Testphase, wenn du magst:

http://www.hostarea.de/server-03/Maerz-eb30fd9489.zip

Das Auslesen klappt schon mal recht gut -

aber mit dem
Einlesen einer hier kopierten Tabelle kann ich noch nicht so
viel anfangen - das war in der vorherigen Verison IMO besser.
Momentan wird beim Einlesen nicht die komplette kopierte
Tabelle eingelesen sondern irgendwas zerstückeltes und es wird
auch die temporäre Dummy-Tabelle in die Mappe eingefügt.

Bei meinen Tests trat das nicht auf, deine Beispieltabelle hier wurde sauber in einem Excelblatt ausgegeben.
Wegen der Dummytabelle, wirf den Call-Befehl aus der Prozedur „w_w_w2Excel“ hinaus.

Der Hintergrund daß der Callbefehl drin stand ist, ich brauch ja etwas Tabellenartiges in der Zwischenablage um zu testen.
Und der Hintergrund des Hintergrundes ist, ich habe da, wo ich den Code schreibe/teste kein Internet, was die Sache für mich grad nicht vereinfacht.

Deshalb auch das Hilfsblatt wenn man eine Tabelle von Excel nach w-w-w überträgt, ich muß ja ohne Internet ansehen können was denn übertragen worden wäre.
Quasi eine spezielle Art der Vorschau. Da Notepad standardmäßig eine nichtproportionale Schriftart hat, habe ich jetzt auch noch Notepad in die Anzeige eingebaut, siehe nachstehenden Code der „Excel2W_W_W“.

Und wegen evtl. Fehlern wie von dir gesagt, diese Tabelle wurde mittels „Excel2w-w-w“ hier eingestellt:

Tabellenblatt: F:\[Bereich2www2.xls]!Tabelle1
 │ A │ B │ C │ D │ E │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
 3 │ 0 │ │ │ │ aa │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
 4 │ │ │ │ │ aa │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
 5 │ t │ #DIV/0! │ 0 │ │ 6 │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
 6 │ 6 km │ │ │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
 7 │ 1 │ │ 15 │ │ 1234689z │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
 8 │ a │ 7,77778E+12 │ │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
 9 │ #DIV/0! │ eee │ eee │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
10 │ 01.01.2008 │ │ 0 │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
11 │ #BEZUG! │ │ │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
12 │ 2 │ │ 1,23457E+11 │ #DIV/0! │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
13 │ a │ │ │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
14 │ zzzzzzzzzzzzzzzz │ 0 │ │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
15 │ │ │ │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
16 │ │ │ │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
17 │ │ │ │ │ │
───┼──────────────────┼─────────────┼─────────────┼─────────┼──────────┤
18 │ │ │ │ │ │
───┴──────────────────┴─────────────┴─────────────┴─────────┴──────────┘
Benutzte Formeln:
A3 : =100\*eeee
A9 : =5/0
A11: =tab7!A1
B14: =hhhh
C5 : =G55
C7 : =100\*Mwst
C10: =ggg
D12: =SUMME(uzuuu)
E3 : ="aa"
E4 : ="aa"
E5 : =SUMME(A4:A6)

Benutzte Matrixformeln:
B5 : {=SUMME(A1:A100)}
(Matrixformeln nicht mit "Enter" sondern mit "Strg+Shift+Enter" eingeben.
Die Spezialklammern nicht manuell eingeben, sie werden von Excel erzeugt.)

Festgelegte Namen:
aa : =Tabelle1!A2 \*rel. Name, unbenutzt in Selektion.
aaa : =Tabelle1!$A$2, unbenutzt in Selektion.
bbbb : =Tabelle1!$C$5, unbenutzt in Selektion.
ccc : =Tabelle1!$A$3:blush:D$12, unbenutzt in Selektion.
dddd : =Tabelle1!$D$3, \*versteckter Name, unbenutzt in Selektion.
eeee : =Tabelle1!C4 \*rel. Name, so gültig in A3
ffff : =Tabelle1!$A$13, unbenutzt in Selektion.
ggg : =Tabelle1!B1 \*rel. Name, so gültig in C10
gggggggg: =Tabelle1!$C$5, unbenutzt in Selektion.
hhhh : =Tabelle1!$B$14
iiii : =Tabelle1!$A$2, unbenutzt in Selektion.
jjj : =Tabelle1!$B$4, unbenutzt in Selektion.
Mwst : =0,15
rrr : =Tabelle1!A2:A6 \*rel. Name, unbenutzt in Selektion.
Test : =NAMEN(;3), unbenutzt in Selektion.
test2 : =NAMEN.AUFLISTEN(), unbenutzt in Selektion.
uzuuu : =Tabelle1!$A$6:blush:C$14

Zahlenformate der Zellen im gewählten Bereich:
A3:A5,A7:A9,A11:A18,B3:B18,C3:C18,D3:smiley:18,E3:E18
haben das Zahlenformat: Standard
A6
haben das Zahlenformat: 0 "km"
A10
haben das Zahlenformat: TT.MM.JJJJ
Bedingte Formatierung(en):
A4 : 1.te Bedingung: Zellwert ist zwischen 3 und 3
 : 2.te Bedingung: Zellwert ist ungleich 56 
B4 : 1.te Bedingung: Formel ist =A6="gzgz"
 : 2.te Bedingung: Zellwert ist zwischen 67 und 567
 : 3.te Bedingung: Zellwert ist zwischen 4 und 7
B13: 1.te Bedingung: Zellwert ist größer gleich 700 

Zirkelbezug in Zelle: B14

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Gruß
Reinhard

Sub Excel2W\_W\_W()
' Programm zum formatierten Darstellen von Tabellenblattbereichen bei wer-weiss-was.
' Getestet auf XL97, entwickelt Nov. 2006, geändert Feb.2008 by Reinhard
' Code am besten in Modul1 der personl.xls (personal.xls bei engl. Excel) einfügen.
' Wie man Vba-Code einfügt und ausführt siehe FAQ:4712
' Benutzung: gewünschten Tabellenblattbereich per Maus oder Tastatur markieren und Makro
' ausführen lassen. Im Eingabefeld von w-w-w dann Strg+V drücken.
' Versionen höher als XL8.0 (=XL97) benötigen den Verweis auf "Microsoft Forms 2.0 Object Library"
' Der Verweis wird benötigt für "DataObject"
' Mit folgendem Code wird das Makro dem Tastenkürzel "Strg+w" zugewiesen, es empfiehlt sich
' den Code ins Modul "DiesArbeitsmappe" der Personl.xls zu kopieren, dann steht das tastenkürzel
' in allen Dateien zur Verfügung
' Private Sub Workbook\_Open()
' Application.OnKey "^t", "w\_w\_w2Excel"
' Application.OnKey "^w", "Excel2W\_W\_W"
' End Sub
'
Dim objkurz As New DataObject, N
Set wksAltesBlatt = ActiveSheet
Call BereichEinlesen
If bytFehl = 255 Then Exit Sub
Call ZeilenErzeugen
Call TabelleinSatzEinfügen
objkurz.SetText strSatz
objkurz.PutInClipboard
Set objkurz = Nothing
'
' ab hier kann der nachfolgende Code (bis auf End Sub!) dieser Prozedur gelöscht werden,
' wenn man keine Kontrollausgabe in einem Hilfsblatt oder/und Notepad haben möchte
'
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* Ausgabe in Hilfsblatt \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
On Error Resume Next
Application.DisplayAlerts = False
ActiveWorkbook.Worksheets("Testxyz").Delete
Application.DisplayAlerts = True
Worksheets.Add after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "Testxyz"
With Columns(1).Font
 .Name = "Courier New"
 .Size = 10
End With
Range("A1").Select
ActiveSheet.Paste
ActiveSheet.Buttons.Add(244.5, 123.75, 111.75, 42.75).Select
With Selection
 .OnAction = "PERSONL.XLS!BlattLoeschen"
 .Characters.Text = "Dieses Blatt löschen"
End With
Range("A1").Select
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* Ausgabe in Notepad \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
strSatz = Application.WorksheetFunction.Substitute(strSatz, Chr(13), "")
strSatz = Application.WorksheetFunction.Substitute(strSatz, Chr(10), Chr(13) & Chr(10))
objkurz.SetText strSatz
objkurz.PutInClipboard
Application.SendKeys "^v"
N = Shell(Environ("systemroot") & "\notepad.exe", vbMaximizedFocus)
End Sub

Fortsetzung…
…und dann von w-w-w in ein Tabellenblatt mittel W_W_W2Excel gebracht, von dort aus mit Excel2W_W_W wieder hierhin:

Tabellenblatt: [Mappe3]!Tabelle1
 │ A │ B │ C │ D │ E │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
 1 │ │ │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
 2 │ │ │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
 3 │ 0 │ │ │ │ aa │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
 4 │ │ │ │ │ aa │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
 5 │ t │ #DIV/0! │ 0 │ │ 0 │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
 6 │ 6 km │ │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
 7 │ 1 │ │ 15 │ │ 1234689z │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
 8 │ a │ 7,78E+17 │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
 9 │ #DIV/0! │ eee │ eee │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
10 │ 01.01.2008 │ │ 0 │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
11 │ #BEZUG! │ │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
12 │ 2 │ │ 1,23E+16 │ #DIV/0! │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
13 │ a │ │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
14 │ zzzzzzzzzzzzzzzz │ 0 │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
15 │ │ │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
16 │ │ │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
17 │ │ │ │ │ │
───┼──────────────────┼──────────┼──────────┼─────────┼──────────┤
18 │ │ │ │ │ │
───┴──────────────────┴──────────┴──────────┴─────────┴──────────┘
Benutzte Formeln:
A3 : =100\*eeee
A9 : =5/0
A11: =tab7!A1
B14: =hhhh
C5 : =G55
C7 : =100\*Mwst
C10: =ggg
D12: =SUMME(uzuuu)
E3 : ="aa"
E4 : ="aa"
E5 : =SUMME(A4:A6)

Zahlenformate der Zellen im gewählten Bereich:
A1:A18,B1:B7,B9:B18,C1:C11,C13:C18,D1:smiley:18,E1:E18
haben das Zahlenformat: Standard
B8,C12
haben das Zahlenformat: 0,00E+00

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Wie man sieht ist die Ausgangsttabelleim wesentlichen erhalten geblieben.

Gruß
Reinhard

San’s grüasst Reinhard

hast du den Verweis gesetzt?

Ev. könntest Du hier aud ‚late binding‘ umstellen, dann muss
der Verweis nicht händich gesetzt werden und auch die
Excel-Version speilt dann keine so grosse Rolle mehr.

okay, muß ich schauen wie man das macht, hab zwar schon
mehrfach die Begriffe early & late binding gesehen aber noch
nicht so mit beschäftigt.

Magst Du lieber ein paar Links zum Thema oder aktive Unterstützung?

aber mit dem
Einlesen einer hier kopierten Tabelle kann ich noch nicht so
viel anfangen - das war in der vorherigen Verison IMO besser.
Momentan wird beim Einlesen nicht die komplette kopierte
Tabelle eingelesen sondern irgendwas zerstückeltes und es wird
auch die temporäre Dummy-Tabelle in die Mappe eingefügt.

Bei meinen Tests trat das nicht auf, deine Beispieltabelle
hier wurde sauber in einem Excelblatt ausgegeben.
Wegen der Dummytabelle, wirf den Call-Befehl aus der Prozedur
„w_w_w2Excel“ hinaus.

Ja, das hatte ich schon gemacht. :wink:

Da Notepad
standardmäßig eine nichtproportionale Schriftart hat, habe ich
jetzt auch noch Notepad in die Anzeige eingebaut, siehe
nachstehenden Code der „Excel2W_W_W“.

OK, das baue ich dann gleich mal später ein.

Und wegen evtl. Fehlern wie von dir gesagt, diese Tabelle
wurde mittels „Excel2w-w-w“ hier eingestellt:

Wenn ich diese einlese und auf den Butteon (einen solchen habe ich mir dazu angelegt) klicke wird ein Tabellenblatt ‚Ausgabexyz‘ angelegt, in dem dann die Daten eingelesen werden - wenn das Absicht ist schweige ich wieder :wink:


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Pfüati Reinhard

…und dann von w-w-w in ein Tabellenblatt mittel W_W_W2Excel
gebracht, von dort aus mit Excel2W_W_W wieder hierhin:

Wie man sieht ist die Ausgangsttabelleim wesentlichen erhalten
geblieben.

OK, ich glaub ich kriegs langsam in den Griff - Du hattest einige Bezüge zu anderen Blättern drin, die ich hier natürlich nicht hatte - da wirds dann halt etwas chaotisch beim einlesen und die Formeln liefern unerwartete Werte.

Du liest absichtlich in ein neu eingefügtes Tabellenblatt ein um bestehende Daten nicht zu überschreiben?


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüezi Thomas,

Magst Du lieber ein paar Links zum Thema oder aktive
Unterstützung?

an sich nur die Lösung wie ich denn den verweis auf die Forms per late binding setze weil der Hinweis im Codetext ist wohl zuwenig *grummel* :smile:

Und wegen evtl. Fehlern wie von dir gesagt, diese Tabelle
wurde mittels „Excel2w-w-w“ hier eingestellt:

Wenn ich diese einlese und auf den Butteon (einen solchen habe
ich mir dazu angelegt) klicke wird ein Tabellenblatt
‚Ausgabexyz‘ angelegt, in dem dann die Daten eingelesen werden

  • wenn das Absicht ist schweige ich wieder :wink:

Ja, noch ist es Absicht, aber wichtiger ist die Funktionalität, also Tabellen nach w-w-w zu bringen und wieder auszulesen.
Und da freue ich mich über jeden Hinweis was nicht richtig klappt.
Und was bei dir nicht klappte ist mir unklar:frowning:

btw: Was m.E. zwar blöd ist, aber eine sehr gute Schule ist um zu erkennen was man dann doch nicht so genau nicht weiß, ist, wie ich, manchmal im Inetcafe an PCs zu sitzen die gar kein Excel haben.
Und dann, auch wenns nur wenig Code ist, den so zu schreiben daß er dann auch funtioniert ohne Testmöglichkeit,Syntaxüberprüfung usw. ist schon eine echte Herausforderung.
Und an dem einen PC hier wo Excel drauf ist, fehlt die vba-Hilfe, da nur Standardinstallation:frowning:
Auch eine Herausforderung anderer Art.
Mannomann werde ich froh sein wieder Internet zuhause zu haben…

Gruß
Reinhard

hast du den Verweis gesetzt?

Ev. könntest Du hier aud ‚late binding‘ umstellen, dann muss
der Verweis nicht händich gesetzt werden und auch die
Excel-Version speilt dann keine so grosse Rolle mehr.

okay, muß ich schauen wie man das macht, hab zwar schon
mehrfach die Begriffe early & late binding gesehen aber noch
nicht so mit beschäftigt.

Magst Du lieber ein paar Links zum Thema oder aktive
Unterstützung?

Grüezi Thomas,

du stellst aber auch Fragen*gg*, magst du einige Kochbücher oder würde es dir gefallen wenn ich für dich koche, logo das Letztere :smile:))

PS: habe ich hier /t/excel2000-und-hyperlinks/4510616/2
late binding benutzt?, wenn ja hab ichs einigermaßen kapiert.
Nur, da spielt die Excelversion immer noch eine Rolle.

Soweit ich jetzt weiß, ist der Vorteil von Early binding, also ich setzte vorher den Verweis, daß mir dann im Code die Intellisense zur Verfügung steht, bei late binding halt nicht.

Und late binding ist wohl auch sowas:
xyz=createobject(„word.application“)
sodaß dann
xyz.documents…
funktioniert, auch ohne den Verweis auf microssoft word 8.0 object library gesetzt zu haben.

So ganz sicher bin ich mir nicht ob ich da alles richtig verstanden habe.

Was lieb wäre, wenn du mir sagts ob ich im o.g. Link late binding benutzt habe, und die Links die du sagtest kannste auch sehr gerne posten.

Wegen Late binding im Fall der FAQ habe ich andernorts eine Anfrage laufen, aber wenn kommt da nur was Fallbezogenes, also wie ich einen bestimmten Verweis per late binding setzen kann, deshalb nehme ich deine Links gerne und auch deine Aussage ob ich im Link late binding habe.

Gruß
Reinhard

Grüezi Reinhard

Ev. könntest Du hier auch ‚late binding‘ umstellen, dann muss
der Verweis nicht händich gesetzt werden und auch die
Excel-Version speilt dann keine so grosse Rolle mehr.

okay, muß ich schauen wie man das macht, hab zwar schon
mehrfach die Begriffe early & late binding gesehen aber noch
nicht so mit beschäftigt.

Magst Du lieber ein paar Links zum Thema oder aktive
Unterstützung?

du stellst aber auch Fragen*gg*, magst du einige Kochbücher
oder würde es dir gefallen wenn ich für dich koche, logo das
Letztere :smile:))

Danke für die Einladung - wenn ich das nächste Mal in deiner Nähe bin melde ich mich im voraus :wink:

PS: habe ich hier
/t/excel2000-und-hyperlinks/4510616/2
late binding benutzt?, wenn ja hab ichs einigermaßen kapiert.

Nein, da hast du per VBA-Code einen Verweis ‚hart‘ gesetzt, das ist nicht dasselbe. Prinzipiell klappt das aber wohl auch, doch wird der Speicher mit dem Verweis auf die Applikation besetzt, auch wenn diese ev. nicht benutzt wird.

Soweit ich jetzt weiß, ist der Vorteil von Early binding, also
ich setzte vorher den Verweis, daß mir dann im Code die
Intellisense zur Verfügung steht, bei late binding halt nicht.

Ja, das ist korrekt - für die Programmierung von Remote-Steuereungen anderer Applikationen oder auch bestimmter ActiveX-Komponenten ist der gesetzte Verweis mit der dadruch möglichen Intellisense sehr wertvoll.

Der Nachteil ist halt dann, dass dieser Verweis gebrochen ist, wenn eine Mappe z.B. in einer höheren Office-Version bearbeitet und gespeichert wurde und dann wieder in einer älteren geöffnet wird.

Und late binding ist wohl auch sowas:
xyz=createobject(„word.application“)
sodaß dann
xyz.documents…
funktioniert, auch ohne den Verweis auf microssoft word 8.0
object library gesetzt zu haben.

Ja, das ist late bindig - die Verbindung zum Objekt wird erst dann hergestellt wenn es instanziert wird.

Was hier dann wegfällt sind die Konstanten die mit dem ‚harten‘ Verweis zur Verfügung stehen.
Ich lege dann in aller Regel eine Daklaration derselben an und weise ihnen den Long-Wert zu, den sie in der Mutter-Applikation haben.

Dann läuft der Code sauber durch ob nun mit gesetzem Verweis oder ‚late binding‘.

Was lieb wäre, wenn du mir sagts ob ich im o.g. Link late
binding benutzt habe, und die Links die du sagtest kannste
auch sehr gerne posten.

Dann hier also noch die Links:

http://word.mvps.org/faqs/interdev/EarlyvsLateBindin…
http://support.microsoft.com/default.aspx?scid=kb%3B…
http://support.microsoft.com/default.aspx?scid=kb;EN…
http://support.microsoft.com/?scid=kb;en-us;201710
http://www.online-excel.de/excel/singsel_vba.php?f=41


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Grüzie Thomas,

ich gehe sehr davon aus, du kennst Nepumuk, er hat mir aufgrund meiner Anfrage das Nachfolgende geschrieben.
Und von deinen Links habe ich jetzt nur die Seite von Peter und deren Folgeseiten gelesen.
Early binding ist für mich abgehakt, daß heißt ich setze vor dem Prozeduraufruf einen Verweis.
Aber bei late binding habe ich noch immense Verstehensschwierigkeiten.
Setzte ich CreateObject() ein so ist das late binding, okay, mag so sein.
Setzte ich zur Laufzeit des Codes einen Verweis, so ist das kein late binding, sondern ein harter verweis wie du sagst. Das kapier ich nicht.
Und Nepumuks Antwort verwirrt mich noch zusätzlich :frowning:

Gruß
Reinhard

du könntest den Verweis beim öffnen der Mappe prüfen und wenn er fehlt oder defekt ist neu setzen.

Das ganze funktioniert allerdings nur, wenn du in der Open-Routine keine Prozedur aufrufst, in welcher der Verweis schon benötigt wird, sonst erzeugst du einen Kompilierungsfehler. Beim Öffnen einer Mappe wird zuerst, so ein Open-Event oder ein Activate-Event abläuft das Modul „DieseArbeitsmappe“ kompiliert.

Rufst du in dieser per Call eine Routine in einem Modul auf, wird dieses Modul auch kompiliert. Rufst du in diesem kompilierten Modul auch wieder per Call Routinen in weiteren Modulen auf, werden auch diese kompiliert.

Abschotten kannst du das nur, indem du im Modul „DieseArbeitsmappe“ alle weiteren Routinen per Application.Run aufrufst. Denn darin ist der Prozedurname als String vorhanden, und das Modul in dem sich die angesprochene Routine befindet wird erst kompiliert wenn die Prozedur wirklich aufgerufen wird.

Hier die Routine zum setzen des Verweises:

Public Sub prcCheckReverence()
 Dim intIndex As Integer
 Dim blnFound As Boolean
 With ThisWorkbook.VBProject.References
 For intIndex = 1 To .Count
 If .Item(intIndex).GUID = "{0D452EE1-E08F-101A-852E-02608C4D0BB4}" Then
 blnFound = True
 If .Item(intIndex).IsBroken Then
 .Remove .Item(intIndex)
 .AddFromGuid GUID:="{0D452EE1-E08F-101A-852E-02608C4D0BB4}", \_
 Major:=2, Minor:=0
 End If
 End If
 Next
 If Not blnFound Then \_
 .AddFromGuid GUID:="{0D452EE1-E08F-101A-852E-02608C4D0BB4}", \_
 Major:=2, Minor:=0
 End With
End Sub

Grüss dich Reinhard

ich gehe sehr davon aus, du kennst Nepumuk,

Ja, ich habe sogar schon mal ein Bier mit ihm getrunken :smile:

Und von deinen Links habe ich jetzt nur die Seite von Peter
und deren Folgeseiten gelesen.

Schau dir die anderen auch noch an, die sind IMO noch etwas spezifischer.

Early binding ist für mich abgehakt, daß heißt ich setze vor
dem Prozeduraufruf einen Verweis.

Ja, genau - die Verbingung zum Objekt wird dann schon beim öffnen der Mappe hergestellt.

Aber bei late binding habe ich noch immense
Verstehensschwierigkeiten.
Setzte ich CreateObject() ein so ist das late binding, okay,
mag so sein.
Setzte ich zur Laufzeit des Codes einen Verweis, so ist das
kein late binding, sondern ein harter verweis wie du sagst.
Das kapier ich nicht.

Eigentlich ist es ganz einfach:

Wenn Du einen Verweis setzt - egal nun ob über den vorgesehenen Dialog oder per VBA - hat Du immer ‚eraly binding‘. Erkennen kannst Du das daran, dass der Verweis im Dialog unter Extras/Verweise mit dem haken gesetzt ist und dass Du beim Programmieren Intellisense zur Verfügung hast. Erschwerend am Setzen eines Verweises per VBA ist zudem, dass Du die genaue GUID der Bibliiothek kennen musst.

Erzeugst Du ein Objekt erst wenn es benötigt wird mit CreateObject() so wird kein Verweis gesetzt (der Haken im Dialog ist anschliessend nicht da und auch Intellisense funktionert nicht), aber Du hast Zugriff auf das Objekt, das Du auf diese Weise instanziert hast.

Was fehlt ist die Übersetzungstabelle der jeweiligen Konstanten in die entsprechenden Long-Werte - die steht nur bei einem direkten Verweis zur Verfügung. Daher lege ich wie beschrieben einen Deklarationsblock an und weise den jeweiligen Konstanten den Long-Wert zu.

So kann ich bequem mit Intellisense und gesetztem Verweis programmieren und am Ende nur noch den Verweis entfernen und die CreateObject()-Zeile einfügen - der Code an sich bleibt sich dann derselbe.

Wichtig ist hier dann jeweils am Ende der Subs die Objekte auch wieder in umgekehrter Reihenfolge zu vernichten, sonst bleibt am Ende die Applikationsleiche im Speicher hängen und muss über den Taskmanager abgeschossen werden.

Ich habe vergangenes Jahr aus Addess heraus Excel komplett so fergesteuert um eine HTML-Rangliste für eine Schweizer Meisterschaft im Kegeln zu erstellen. Das hat wunderbar geklappt und ich musste mir keine Gedanken darüber machen, welche Excel-Version denn da wohl zur Verfügung stehen würde.

Ich hoffe ich konnte etwas Licht ins Dunkel bringen und wünsche dir einen schönen Abend.


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -