Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Excelautomation

Begonnen von herb54, Januar 30, 2023, 19:09:34

⏪ vorheriges - nächstes ⏩

herb54

Hallo zusammen,

ich habe vor einiger Zeit eine Wordautomation mit Access gemacht. Das hat auch super geklappt. Jetzt habe ich versucht auf gleicher Basis eine Excelautomation zu machen. Ich habe eine Accessdatenbank erstellt und wollte zuerst mal nur ein Feld in Excel übertragen.
Zuerst habe ich eine Exceldatei "ExcelAutotext" erstellt mit der Textmarke "name" in Zelle A2. In dieses Zelle wollte ich das Feld Nachname aus einer Accessdatei einfügen. Folgenden Code habe ich (eigentlich nur umgeschrieben aus meiner Wordautomation):


Private Sub Befehl0_Click()
Const Pfad As String = "C:\Users\Username\DokUser\Desktop\"
' Pfadbeginn wo die neu erstellte Excel Datei gespeichert wird
' ***********************************************************

Const xlDialogFileSaveAs = 84
' = Dialogfenster "Speichern"
' ************************************

Dim appExcel As Object, xlExcel As Object
' =  xlExcel = Excelvorlage,  appExcel = neu erstellte Exceldatei
' ******************************************************

Set appExcel = CreateObject("excel.application")
appExcel.Visible = True
' =  Erstellen von appExcel als Excel-Dokument
' =  soll anschließend sichtbar sein
' ******************************************
Set xlExcel = appExcel.Documents.Add("C:\Users\Username\Documents\ExcelAutotext.xlsx")

' = xlExcel = appExcel = haben die gleichen Daten (und Pfadangabe zum Excelvorlagedokument)
'    damit die Originalvorlage xlExcel unverändert bleibt
' ***************************************************************************************



' ********************************************************************************
With xlExcel
   .Bookmarks("name").range = Me!Nachname
End With
' = Routine zum Übertragen der Accesstextfelder in die Word Textmarken von xlExcel
' = in die Originalvorlage wird das Textfeld von Access geschrieben.
' = da ja xlExcel und appExcel gleich sind wird auch in appExcel dies geschrieben
' ********************************************************************************


appExcel.ChangeFileOpenDirectory ("C:\Users\Username\DokUser\Desktop\Kundenliste")
With appExcel.Dialogs(xlDialogFileSaveAs)
   .Name = Format(Date, "yyyy-mm-dd")
   .Show
   End With
' = Routine zum Abspeichern und öffnen des neuen Dokuments
' ********************************************************


Bereinigung:
   xlExcel.Close
   appExcel.Quit
   Set xlExcel = Nothing
   Set appExcel = Nothing

' = Routine zum Aufräumen (Bereinigung) - bei allen If Abfragen sollte nicht auf Exit Sub
' sondern hierher gesprungen werden mit GoTo Bereinigung - sonst evtl Absturz
' ***************************************************************************************

End Sub

Es öffnet sich ein leeres Exceldokument und ich erhalte folgende Fehlermeldung:
Laufzeitfehler 438
Objekt unterstützt diese Eigenschaft oder Methode nicht

in folgender Zeile:
Set xlExcel = appExcel.Documents.Add("C:\Users\Username\Documents\ExcelAutotext.xlsx")

Kann mir da jemand weiterhelfen? Im Voraus vielen Dank!

Grüße
Herbert



 

ebs17

Set xlExcel = appExcel.Workbooks.Add("C:\Users\Username\Documents\ExcelAutotext.xlsx")Excel hat begreiflicherweise ein anderes Objektmodell als Word, und damit sollte man sich schon beschäftigen.

Nützlich wäre es, zu Beginn mit Early Binding, also mit gesetztem Verweis, zu arbeiten. Mit dem Verweis hast Du auch direkten Zugang zum Objektkatalog (mit F2 aus dem VBA-Editor heraus).
Mit freundlichem Glück Auf!

Eberhard

herb54

Super vielen Dank, hat einwandfrei geklappt! Leider habe ich jetzt einen weiteren Fehler in der Zeile:

  .Bookmarks("name").range = Me!Nachname

Objekt unterstützt diese Methode nicht. Ich vermute mal bei Excel heißt das nicht Bookmarks.
Ist das schon wieder ein rein Wordspezifische Angabe?

Grüße
Herbert

Köbi

Hallo Herbert

Hier ein kleines Beispiel für eine Excel-Automation. Vielleicht hilft es dir weiter.

herb54

Hallo Köbi,

super vielen Dank! Leider funktioniert bei mir Early Binding nicht. Deshalb auch die etwas "altmodische" Art und Weise. Ich dachte halt es funktioniert ähnlich wie bei WORD d.h. man setzt Textmarken und kann diese dann
mit Daten aus Access füllen.

Grüße
Herbert

Köbi

Weshalb soll bei dir Early Binding nicht funktionieren? Im Code steht ja
Verweis auf Microsoft Excel 9.0 Object Library (oder höher) muss gesetzt sein.
Also wenn du diesen Verweis setzt, dann sollte es funktionieren. Bei mir sieht das so aus wie im beiliegenden Bild.


ebs17

In Excel gibt es keine Textmarken, wofür auch?
Eine Arbeitsmappe hat Arbeitsblätter, ein Arbeitsblatt hat durchgehend Zeilen und Spalten. Damit lässt sich jeder Ort (Zelle) supergenau adressieren.

Du hast schon mal Excel gesehen und damit gearbeitet?
Mit freundlichem Glück Auf!

Eberhard

herb54

Hallo vielen Dank für die Antworten,
ja mit Excel kenne ich mich schon aus. Eigentlich wollte ich nur ausprobieren, ob man mit Textmarken in Excel exakt genauso arbeiten kann wie mit Word. Ich frage mich für was Textmarken bei Excel eigentlich gut sind?

Das mit Early Binding hat seltsamerweise bei mir noch nie funktioniert. Auf meinem vorhergehenden Rechner
konnte ich nicht mal den Verweis setzen.
Ich muss das jetzt mal auf meinem neuen Rechner ausprobieren.
Grüße
Herbert

Beaker s.a.

Hallo,
Ich bin gewiss kein Excelspezialist, aber m.E. kann das
.Bookmarks("name").range = Me!Nachnameja auch nicht funktionieren, ob es nun Bookmarks gibt oder nicht, -
die .Range erwartet doch einen Zellbezug.
Und, wie Eberhard schon anmerkte, lässt sich in Excel jede Zelle
ganz präzise ansprechen, - nämlich über die .Range
.Range("A2") = Me!Nachname(kann's nicht testen, hab' kein Excel)

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

Beispiele für vollständige Adressierung
Set xlExcel = appExcel.Workbooks.Add("C:\Users\Username\Documents\ExcelAutotext.xlsx")
With xlExcel     ' xlWorkbook wäre sinniger
   .Worksheets(1).Cells(2, 1).Value = Me!Nachname
   ' .Worksheets("Moritz").Range("A2").Value = Me!Nachname
End With
Wie gesagt, eine Zelle befindet sich in einem Arbeitsblatt, nicht "im Excel" an sich.
Die Value-Eigenschaft ist zwar Standard und muss nicht zwingend angegeben werden. In Zellen werden aber auch gerne Formeln eingegeben, und da wird die optische Klarstellung häufig angewandt.

ZitatIch frage mich für was Textmarken bei Excel eigentlich gut sind?
Diese Frage würde sich erst stellen, wenn man deren Existenz (generell und konkret im Fall) bejahen kann. Aber Du liebst diesen Gedanken (Augen zu und durch).
Mit freundlichem Glück Auf!

Eberhard

Köbi

Hallo Herbert
Ich verstehe nicht, weshalb du so an den Textmarken klebst.
ZitatDas mit Early Binding hat seltsamerweise bei mir noch nie funktioniert. Auf meinem vorhergehenden Rechner
konnte ich nicht mal den Verweis setzen.
Ich muss das jetzt mal auf meinem neuen Rechner ausprobieren.
Ja, mach das. Es ist für mich nicht nachvollziehbar, weshalb Early Binding mit dem richtigen Verweis nicht funktionieren soll.

Ich habe hier ein Beispiel mit Late Binding.


herb54

Hallo zusammen,
vielen Dank für eure Antworten! Das war mir halt nicht klar, dass man eigentlich
die Textmarken (die man ja in Excel anlegen) kann nicht als Zellbezug verwenden kann.
Ich werde mal ein bisschen mit Early- und Late Binding probieren und euch später Bescheid geben.
Nochmals vielen Dank!
Grüße
Herbert
PS: Dieses Forum ist einfach super!

markusxy

Zitat von: herb54 am Februar 01, 2023, 09:52:47Das war mir halt nicht klar, dass man eigentlich
die Textmarken (die man ja in Excel anlegen) kann nicht als Zellbezug verwenden kann.

Wurde hier nicht schon erwähnt, dass es in Excel kein Bookmark Klasse gibt.
Wenn man wissen will, ob so eine Klasse existiert schaut man im Objektkatalog und weiß nach 10 Sekunden Bescheid.
Einfach irgend etwas völlig konzeptlos eingeben, kann man sich also ersparen.
Zielgerichtet in der Doku nachsehen ist da schwer zu bevorzugen. Vor allem sieht man auch gleich was eine Klasse - wenn es sie den gibt - wirklich kann.


Josef P.

Hallo!

@herb54:
Kann es sein, dass du mit "Textmarken" die Benennung von Zellen meinst - also die Namen, die man im Namensmanager sieht.
Diese Namen kannst du ebenso als Index für Range verwenden.

Gruß
Josef