Probleme mit Excel VBA
23.06.2022 09:30:45
Unknown_User
ich hoffe ihr könnt mir helfen. Ich habe globale variablen und folgende Prozedur, womit ich Textmarken in Word ansprechen möchte:
'Word Dokument erstellen, ausfüllen, speichern, Bilder hinzufügen, mailen
Sub Create()
Dim newTextLink As String, newTextGrund
Set wks = ThisWorkbook.Worksheets("Tabelle1")
'Textfelder in Word zu Zellen in Excel zuordnen
bez = wks.Range("bez").Column
wkz = wks.Range("wkz").Column
fanr = wks.Range("fanr").Column
kd = wks.Range("kd").Column
fehler = wks.Range("fehler").Column
ursache = wks.Range("ursache").Column
stck = wks.Range("stck").Column
bearbeiter = wks.Range("bearbeiter").Column
mkurz = wks.Range("mkurz").Column
mlang = wks.Range("mlang").Column
zuständig = wks.Range("zuständig").Column
entsch = wks.Range("entsch").Column
entscheider = wks.Range("entscheider").Column
wirksam = wks.Range("wirksam").Column
start = wks.Range("start").Column
weitere = wks.Range("weitere").Column
abschlussd = wks.Range("abschlussd").Column
lastsigned = wks.Range("lastsigned").Column
endemdate = wks.Range("endemdate").Column
pverant = wks.Range("pverant").Column
fm = wks.Range("fm").Column
dstart = wks.Range("dstart").Column
state = wks.Range("state").Column
lastperson = wks.Range("lastperson").Column
stückzahl_a = wks.Range("stückzahl_a").Column
tstart = wks.Range("tstart").Column
Zeile = ActiveCell.Row
d = wks.Cells(Zeile, dstart)
t = wks.Cells(Zeile, tstart).Text
'Zuweisung Pfad für interne Fehlermeldungen
Path = "Q:\QS_Baecker\Interne Fehlererfassung\" & Year(Now) & "\"
'Dateinamen Worddokument aus Excel-Zellen erzeugen
aName = wks.Cells(Zeile, 1).Value & "-" & wks.Cells(Zeile, bez) & ".docx"
'prüfen, ob ein Dateiordner mit aktuellem Jahr vorhanden, ansonsten anlegen
If Dir(Path, vbDirectory) = "" Then
MkDir (Path)
End If
'Sub um / durch - ersetzen (benötigt für Zelle mit Artikelbezeichnung)
Call ReplaceSign
'Dateidefinition aus Dateipfad und Dateiname
File = Dir(Path & aName)
'prüfen, ob bereits eine Fehlermeldung angelegt wurde, wenn nicht neues Dokument aus Vorlage erstellen
Select Case File
Case Is = ""
Path = "\\aps\pak_daten\QM-Dokumentation\4 Formblätter\"
File = Dir(Path & "FB 6-11_Interne_Fehlermeldung_*.docx")
GoTo FileCheck
Case Else
FileCheck:
'prüfen ob Vorlage/interne Fehlermeldung bereits geöffnet, wenn nicht, Hinweis ausgeben
If IsFileOpen(Path & File) Then
UserForm2.Show
Exit Sub
Else
'Prüfen ob Word gestartet ist und ggf. öffnen
On Error Resume Next
Set Wdoc = GetObject(Path & File)
Set wrd = Wdoc.Application
If Err.Number = 429 Then
Err.Clear
Set wrd = CreateObject("Word.Application")
Wdoc = wrd.Documents.Open(Path & File)
If Err.Number = 429 Then
Err.Clear
MsgBox "Es konnte nicht auf Word zugegriffen werden! Vielleicht ist Word nicht installiert!", vbExclamation, "Fehler beim Zugriff auf MS Word"
End If
End If
On Error GoTo 0
With wrd
.Visible = True
.Activate
'.ScreenUpdating = False
End With
'Textmarken in Word ansprechen und Excel-Zellen zuordnen
ReSetBookmark Wdoc, TMName:="reklanr", TMInhalt:=wks.Cells(Zeile, 1).Value & "-" & Year(Now)
'ReSetBookmark Wdoc, TMName:="date", TMInhalt:=d & " / " & t
'ReSetBookmark Wdoc, TMName:="bez", TMInhalt:=wks.Cells(Zeile, bez).Value
'ReSetBookmark Wdoc, TMName:="wkz", TMInhalt:=wks.Cells(Zeile, wkz).Value
'ReSetBookmark Wdoc, TMName:="ordernr", TMInhalt:=wks.Cells(Zeile, fanr).Value
'ReSetBookmark Wdoc, TMName:="kd", TMInhalt:=wks.Cells(Zeile, kd).Value
'ReSetBookmark Wdoc, TMName:="fehler", TMInhalt:=wks.Cells(Zeile, fehler).Value
'ReSetBookmark Wdoc, TMName:="ursache", TMInhalt:=wks.Cells(Zeile, ursache).Value
'ReSetBookmark Wdoc, TMName:="stck", TMInhalt:=wks.Cells(Zeile, stck).Value
'ReSetBookmark Wdoc, TMName:="bearbeiter", TMInhalt:=wks.Cells(Zeile, bearbeiter).Value
'ReSetBookmark Wdoc, TMName:="mkurz", TMInhalt:=wks.Cells(Zeile, mkurz).Value
'ReSetBookmark Wdoc, TMName:="mlang", TMInhalt:=wks.Cells(Zeile, mlang).Value
'ReSetBookmark Wdoc, TMName:="zuständig", TMInhalt:=wks.Cells(Zeile, zuständig).Value
'ReSetBookmark Wdoc, TMName:="entsch", TMInhalt:=wks.Cells(Zeile, entsch).Value
'ReSetBookmark Wdoc, TMName:="entscheider", TMInhalt:=wks.Cells(Zeile, entscheider).Value
'ReSetBookmark Wdoc, TMName:="wirksam", TMInhalt:=wks.Cells(Zeile, wirksam).Value
'ReSetBookmark Wdoc, TMName:="start", TMInhalt:=wks.Cells(Zeile, start).Value
'ReSetBookmark Wdoc, TMName:="weitere", TMInhalt:=wks.Cells(Zeile, weitere).Value
'ReSetBookmark Wdoc, TMName:="abschlussd", TMInhalt:=wks.Cells(Zeile, abschlussd).Value
'ReSetBookmark Wdoc, TMName:="lastsigned", TMInhalt:=wks.Cells(Zeile, lastsigned).Value
'ReSetBookmark Wdoc, TMName:="endemdate", TMInhalt:=wks.Cells(Zeile, endemdate).Value
'ReSetBookmark Wdoc, TMName:="pverant", TMInhalt:=wks.Cells(Zeile, pverant).Value
'ReSetBookmark Wdoc, TMName:="stückzahl_a", TMInhalt:=wks.Cells(Zeile, stückzahl_a).Value
'wrd.WindowState = 1
'Dokumenten-Link mit Erstellungsjahr in Excel-Zelle eintragen
Call AddLink
'Excel-Dokument speichern
ActiveWorkbook.Save
'Word Dokument speichern
Wdoc.SaveAs "Q:\QS_Baecker\Interne Fehlererfassung\" & Year(Now) & "\" & aName
'aufräumen
Wdoc.Close
wrd.Quit
Set Wdoc = Nothing
Set wrd = Nothing
End If
End Select
Set wks = Nothing
End Sub
Bei Resetbookmark erhalte ich den Fehler 91, Objektvariable oder With-Blockvariable nicht festgelegt.Ich verstehe das gerade nicht.
'Textmarken in Word neu setzen
Public Sub ReSetBookmark(ByVal Wdoc As Object, ByVal TMName As String, ByVal TMInhalt As String)
Dim bm As Object
Dim rng As Object
On Error Resume Next
If .Bookmarks.Exists(TMName) Then
Set bm = .Bookmarks(TMName)
Set rng = bm.Range
rng.Text = TMInhalt
.Bookmarks.Add Name:=TMName, Range:=rng
End If
Set rng = Nothing
Set bm = Nothing
End Sub
Ich habe in einem anderen Excel-Dokument folgenden Code:
'Word Dokument erstellen, ausfüllen, speichern, Bilder hinzufügen, mailen
Sub Create()
Dim newTextLink As String, newTextGrund
Set wks = ThisWorkbook.Worksheets("Tabelle1")
'Textfelder in Word zu Zellen in Excel zuordnen
bez = wks.Range("bez").Column
wkz = wks.Range("wkz").Column
fanr = wks.Range("fanr").Column
kd = wks.Range("kd").Column
fehler = wks.Range("fehler").Column
ursache = wks.Range("ursache").Column
stck = wks.Range("stck").Column
bearbeiter = wks.Range("bearbeiter").Column
mkurz = wks.Range("mkurz").Column
mlang = wks.Range("mlang").Column
zuständig = wks.Range("zuständig").Column
entsch = wks.Range("entsch").Column
entscheider = wks.Range("entscheider").Column
wirksam = wks.Range("wirksam").Column
start = wks.Range("start").Column
weitere = wks.Range("weitere").Column
abschlussd = wks.Range("abschlussd").Column
lastsigned = wks.Range("lastsigned").Column
endemdate = wks.Range("endemdate").Column
pverant = wks.Range("pverant").Column
fm = wks.Range("fm").Column
dstart = wks.Range("dstart").Column
state = wks.Range("state").Column
lastperson = wks.Range("lastperson").Column
stückzahl_a = wks.Range("stückzahl_a").Column
tstart = wks.Range("tstart").Column
Zeile = ActiveCell.Row
'Zuweisung Pfad für interne Fehlermeldungen
Path = "Q:\QS_Baecker\Interne Fehlererfassung\" & Year(Now) & "\"
'Word-Dokument-Namen aus Excel-Zellen erzeugen
aName = wks.Cells(Zeile, 1).Value & "-" & wks.Cells(Zeile, bez) & ".docx"
'prüfen, ob ein Dateiordner mit aktuellem Jahr vorhanden, ansonsten anlegen
If Dir(Path, vbDirectory) = "" Then
MkDir (Path)
End If
'Sub um / durch - ersetzen (benötigt für Zelle mit Artikelbezeichnung)
Call ReplaceSign
'Dateidefinition aus Dateipfad und Dateiname
File = Dir(Path & aName)
'prüfen, ob bereits eine Fehlermeldung angelegt wurde, wenn nicht neues Dokument aus Vorlage erstellen
Select Case File
Case Is = ""
Path = "\\aps\pak_daten\QM-Dokumentation\4 Formblätter\"
File = Dir(Path & "FB 6-11_Interne_Fehlermeldung_*.docx")
GoTo FileCheck
Case Else
FileCheck:
'prüfen ob Vorlage/interne Fehlermeldung bereits vorhanden, wenn nicht, Hinweis ausgeben
If IsFileOpen(Path & File) Then
UserForm2.Show
Exit Sub
Else
'Word-Dokument erstellen und Textmarken füllen
Set wrd = CreateObject("Word.Application")
d = wks.Cells(Zeile, dstart)
t = wks.Cells(Zeile, tstart).Text
Call Sleep(100)
wrd.Visible = True
wrd.Activate
Set Wdoc = wrd.Documents.Open(Path & File)
'Textmarken in Word ansprechen und Excel-Zellen zuordnen
ReSetBookmark Wdoc, TMName:="reklanr", TMInhalt:=wks.Cells(Zeile, 1).Value & "-" & Year(Now)
ReSetBookmark Wdoc, TMName:="date", TMInhalt:=d & " / " & t
ReSetBookmark Wdoc, TMName:="bez", TMInhalt:=wks.Cells(Zeile, bez).Value
ReSetBookmark Wdoc, TMName:="wkz", TMInhalt:=wks.Cells(Zeile, wkz).Value
ReSetBookmark Wdoc, TMName:="ordernr", TMInhalt:=wks.Cells(Zeile, fanr).Value
ReSetBookmark Wdoc, TMName:="kd", TMInhalt:=wks.Cells(Zeile, kd).Value
ReSetBookmark Wdoc, TMName:="fehler", TMInhalt:=wks.Cells(Zeile, fehler).Value
ReSetBookmark Wdoc, TMName:="ursache", TMInhalt:=wks.Cells(Zeile, ursache).Value
ReSetBookmark Wdoc, TMName:="stck", TMInhalt:=wks.Cells(Zeile, stck).Value
ReSetBookmark Wdoc, TMName:="bearbeiter", TMInhalt:=wks.Cells(Zeile, bearbeiter).Value
ReSetBookmark Wdoc, TMName:="mkurz", TMInhalt:=wks.Cells(Zeile, mkurz).Value
ReSetBookmark Wdoc, TMName:="mlang", TMInhalt:=wks.Cells(Zeile, mlang).Value
ReSetBookmark Wdoc, TMName:="zuständig", TMInhalt:=wks.Cells(Zeile, zuständig).Value
ReSetBookmark Wdoc, TMName:="entsch", TMInhalt:=wks.Cells(Zeile, entsch).Value
ReSetBookmark Wdoc, TMName:="entscheider", TMInhalt:=wks.Cells(Zeile, entscheider).Value
ReSetBookmark Wdoc, TMName:="wirksam", TMInhalt:=wks.Cells(Zeile, wirksam).Value
ReSetBookmark Wdoc, TMName:="start", TMInhalt:=wks.Cells(Zeile, start).Value
ReSetBookmark Wdoc, TMName:="weitere", TMInhalt:=wks.Cells(Zeile, weitere).Value
ReSetBookmark Wdoc, TMName:="abschlussd", TMInhalt:=wks.Cells(Zeile, abschlussd).Value
ReSetBookmark Wdoc, TMName:="lastsigned", TMInhalt:=wks.Cells(Zeile, lastsigned).Value
ReSetBookmark Wdoc, TMName:="endemdate", TMInhalt:=wks.Cells(Zeile, endemdate).Value
ReSetBookmark Wdoc, TMName:="pverant", TMInhalt:=wks.Cells(Zeile, pverant).Value
ReSetBookmark Wdoc, TMName:="stückzahl_a", TMInhalt:=wks.Cells(Zeile, stückzahl_a).Value
wrd.WindowState = 1
'Application.ScreenUpdating = True
'Dokumenten-Link mit Erstellungsjahr in Excel-Zelle eintragen
Call AddLink
'Excel-Dokument speichern
ActiveWorkbook.Save
'Word Dokument speichern
Wdoc.SaveAs "Q:\QS_Baecker\Interne Fehlererfassung\" & Year(Now) & "\" & aName
'aufräumen
Wdoc.Close
wrd.Quit
Set Wdoc = Nothing
Set wrd = Nothing
End If
End Select
End Sub
Und dieser läuft durch. Ich habe vielleicht einen Fehler eingebaut bei der Prüfung, ob das Word bereits geöffnet ist.Aber leider verstehe ich nicht, wie ich es machen muss, damit es funktioniert.
Ich hoffe es kann jemand ohne Datei-Upload verstehen, sonst muss ich die komplett überarbeiten wegen des Datenschutzes.
Danke im Voraus.