Word Userform - Suchfeld für Worddateien - Ergebnisausgabe in Listbox
Hallo,
ich habe ein Userform welches ich aus Word starte.
Das Userform greift u.a. auf Excel zu, um zb die Lieferantenadresse eines Lieferanten herauszufiltern.
Die in der Listbox ausgewählte Adresse wird dann an die entsprechenden Textmarken im Worddokument (Name, Anschrift, Ort etc) übergeben- so fülle ich also mit wenig Aufwand die Wordbestellung mit allen wichtigen Kopfdaten.
Jetzt möchte ich ebenfalls über ein Suchfeld Worddateien im Ordner "Q/Bestelltexte" finden und in einer Listbox auflisten.
Der Inhalt (Bestelltext) der ausgewählten Datei soll dann ebenfalls in das Worddokument übergeben werden.
Leider komme ich hier nicht weiter, weil "Application.FileSearch" bei Office 2007 nicht unterstützt wird.
Hier ein Sreenshot zur besseren Erklärung:
Hier der Code für das Suchfeld der Lieferanten:
Vielleicht kann jemand helfen...
Danke vorab
ich habe ein Userform welches ich aus Word starte.
Das Userform greift u.a. auf Excel zu, um zb die Lieferantenadresse eines Lieferanten herauszufiltern.
Die in der Listbox ausgewählte Adresse wird dann an die entsprechenden Textmarken im Worddokument (Name, Anschrift, Ort etc) übergeben- so fülle ich also mit wenig Aufwand die Wordbestellung mit allen wichtigen Kopfdaten.
Jetzt möchte ich ebenfalls über ein Suchfeld Worddateien im Ordner "Q/Bestelltexte" finden und in einer Listbox auflisten.
Der Inhalt (Bestelltext) der ausgewählten Datei soll dann ebenfalls in das Worddokument übergeben werden.
Leider komme ich hier nicht weiter, weil "Application.FileSearch" bei Office 2007 nicht unterstützt wird.
Hier ein Sreenshot zur besseren Erklärung:
Hier der Code für das Suchfeld der Lieferanten:
Private Sub LiefSuche_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Change()
Set m_appExcel = Excel.Application
Set m_wbkExcel = Excel.Workbooks.Open("Q:\LiefStamm.xlsx")
Set m_wksExcel = Excel.Worksheets("LiefStamm")
Set m_rngExcel = m_wksExcel.UsedRange
m_Suchwort = ("*" & BestelldatenWord.LiefSuche.Value & "*")
BestelldatenWord.LiefListBox.Clear
With m_wksExcel.Range("B:B")
Set m_rngExcel = .Find(m_Suchwort, LookIn:=xlValues, lookat:=xlWhole)
If Not m_rngExcel Is Nothing Then
m_strFirstAddress = m_rngExcel.Address
Do
With BestelldatenWord.LiefListBox
.ColumnCount = 1 '5
.AddItem
.List(.ListCount - 1, 0) = m_rngExcel.Text 'LieferantenName
.List(.ListCount - 1, 1) = m_rngExcel.Offset(0, 1).Value 'LiefAnschrift
.List(.ListCount - 1, 2) = m_rngExcel.Offset(0, 2).Value 'LiefLand
.List(.ListCount - 1, 3) = m_rngExcel.Offset(0, 3).Value 'LiefPLZ
.List(.ListCount - 1, 4) = m_rngExcel.Offset(0, 4).Value 'LiefOrt
.ColumnWidths = "8cm" '5cm;1cm;2cm;3cm"
End With
Set m_rngExcel = .FindNext(m_rngExcel)
Loop While Not m_rngExcel Is Nothing And m_rngExcel.Address <> m_strFirstAddress
Else
End If
End With
m_wbkExcel.Close False
m_appExcel.Quit
Set m_appExcel = Nothing
End Sub
Vielleicht kann jemand helfen...
Danke vorab
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 235401
Url: https://administrator.de/contentid/235401
Ausgedruckt am: 26.11.2024 um 12:11 Uhr
21 Kommentare
Neuester Kommentar
Hallo mreske,
das könntest du so machen. In diesem Beispiel heißt das Textfeld in dem das Suchwort steht txtSearch und die Listbox lbResult. Der Ordner wird nach *.docx-Dateien durchsucht und bei einem Treffer des Suchwortes im Dateinamen der Pfad des Dokumentes der Listbox hinzugefügt. Bei einem Doppelklick auf einen Eintrag in der Listbox wird das entsprechende Word Dokument im Hintergrund geöffnet, der Text dessen extrahiert und dann an einer Textmarke(DeineTextmarke / noch anpassen) im aktuellen Dokument eingefügt.
Grüße Uwe
das könntest du so machen. In diesem Beispiel heißt das Textfeld in dem das Suchwort steht txtSearch und die Listbox lbResult. Der Ordner wird nach *.docx-Dateien durchsucht und bei einem Treffer des Suchwortes im Dateinamen der Pfad des Dokumentes der Listbox hinzugefügt. Bei einem Doppelklick auf einen Eintrag in der Listbox wird das entsprechende Word Dokument im Hintergrund geöffnet, der Text dessen extrahiert und dann an einer Textmarke(DeineTextmarke / noch anpassen) im aktuellen Dokument eingefügt.
' Ordner für die Text-Vorlagen
Const DOCFOLDER = "Q:\Bestelltexte"
Private Sub txtSearch_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim doc As Document, fso As Object, file As Object
'Inhalt der Listbox löschen
lbResults.Clear
Set fso = CreateObject("Scripting.FileSystemObject")
For Each file In fso.GetFolder(DOCFOLDER).Files
' nur docx Dokumente durchsuchen
If fso.GetExtensionName(file.Path) = "docx" Then
If InStr(1, file.Name, txtSearch.Text, vbTextCompare) Then
' Wurde ein Treffer gefunden füge den Namen der Datei zur Listbox hinzu
lbResults.AddItem file.Name
End If
End If
Next
Set fso = Nothing
End Sub
Private Sub lbResults_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
If lbResults.ListIndex <> -1 Then
Dim objWord As Word.Application, strDocPath As String, doc As Document
'Neues Word-Objekt erzeugen damit das Dokument unsichtbar geöffnet werden kann
Set objWord = New Word.Application
objWord.Visible = False
objWord.DisplayAlerts = False
' Pfad der aktuell markierten Zeile holen
strDocPath = lbResults.List(lbResults.ListIndex)
'Word Dokument öffnen
Set doc = objWord.Documents.Open(DOCFOLDER & "\" & strDocPath)
'Inhalt mit Formaten kopieren
doc.Content.Copy
' Text an der Stelle einer Textmarke im aktuellen Dokument einfügen
ActiveDocument.Bookmarks("DeineTextmarke").Range.Paste
doc.Close False
objWord.DisplayAlerts = True
objWord.Quit False
End if
End Sub
Zitat von @mreske:
Leider bekomme ich eine Fehlermeldung weil die Variablen "FSO", "file" und "lbResults" nicht
definiert sind.
Hier habe ich jetzt folgenden Code ergänzt:
OK dann hast du Option Explicit am Anfang deines Codesfensters stehen, habe es daraufhin angepasst.Leider bekomme ich eine Fehlermeldung weil die Variablen "FSO", "file" und "lbResults" nicht
definiert sind.
Hier habe ich jetzt folgenden Code ergänzt:
Jetzt kommt zwar keine Fehlermeldung aber es passiert nach Verlassen des Textfeldes garnichts
Vermutlich stimmen die Namen der Listbox und des Suchfeldes noch nicht mit deinen Namen dieser Felder überein (lbResults darfst du nicht deklarieren das ist der Name des Steuerelementes deiner Listbox, wie bereits am Anfang geschrieben). Noch zur Sicherheit als Nachfrage: Willst du nach Dateinamen suchen, oder nach dem Inhalt in den Dateien? Im Moment sucht das Script nur in den Dateinamen! (Im Demo-Dokument das du weiter unten verlinkt findest ist aber eine auskommentierte Funktion enthalten mit der sich auch das realisieren ließe - wenn auch nicht sehr Performant.)Was muss ich ändern, damit in der Listbox nur die Dateinamen (ohne Pfad) angezeigt werden?
ist oben angepasst. (Zeile 13: file.Name ist nur der Name der Datei) / Die Verfügbaren Eigenschaften des File-Objects kannst du hier nachlesen, und eine Referenz des FileSystemObjects hier.Falls du jetzt immer noch nicht klar kommst, kannst du hier das DEMO-DOKUMENT dazu herunterladen. Im Demo-Dokument arbeite ich mit einer versteckten Spalte in der Listbox zum Speichern des Pfades für jeden Eintrag in der Listbox, damit ich nachher damit einfach das Dokument öffnen kann. Bitte den Pfad deiner Dokumente im Quelltext anpassen (ist im Moment auf "Q:\Bestelltexte" festgelegt und die Suche in diesem Ordner auf *.docx-Dateien festgelegt
Grüße Uwe
Guckst du hier :
http://www.0711office.de/word/Bookmark.htm
Es gibt zwei Typen von Textmarken: Bereichs-Textmarken und Positions-Textmarken. Bei einer Positionstextmarke wir der Text hinter der Marke eingefügt, bei einer Bereichsmarke(die ich verwendet hatte) wird der ganze Bereich ersetzt und die Marke dabei gelöscht. Bei einer Bereichsmarke musst du dir also eine Referenz des Range speichern und nach dem Einfügen von Text in den Range erneut ein Bookmark über den Range via Code anlegen.
Grüße Uwe
http://www.0711office.de/word/Bookmark.htm
Es gibt zwei Typen von Textmarken: Bereichs-Textmarken und Positions-Textmarken. Bei einer Positionstextmarke wir der Text hinter der Marke eingefügt, bei einer Bereichsmarke(die ich verwendet hatte) wird der ganze Bereich ersetzt und die Marke dabei gelöscht. Bei einer Bereichsmarke musst du dir also eine Referenz des Range speichern und nach dem Einfügen von Text in den Range erneut ein Bookmark über den Range via Code anlegen.
Sub WriteInBookmark(ByVal sBookmarkName As String, _
ByVal sBookmarkText As String)
'Schreibt einen neuen Wert in ein vorhandenes Bookmark
If ActiveDocument.Bookmarks.Exists(sBookmarkName) Then
Dim r As Range
Set r = ActiveDocument.Bookmarks(sBookmarkName).Range
r.Text = sBookmarkText
ActiveDocument.Bookmarks.Add sBookmarkName, r
End If
End Sub
n'Abend Manfred,
Du musst dann aber jegliche Excel-Konstanten die du in deinem Code verwendest durch die tatsächlichen Werte ersetzen. D.h. z.B. solche wie xlUp, xlDown etc. pp., da diese ja ohne den Import des Verweises Word nicht bekannt sind! Dann klappt das auch ohne Verweis auf die Bibliothek.
Noch als Tipp wie du die tatsächlichen Werte der Konstanten erhältst: Dazu tippst du im VBA Editor von Excel in den Direktbereich debug.print gefolgt vom Namen der Konstanten ein und drückst Enter, und schon wird dir der tatsächliche Wert ausgeben.
Grüße Uwe
Ich habe es mit LateBinding versucht aber ohne Erfolg - weiß da vielleicht jemand weiter?
dazu tippst du folgendes in dein Dokument:Set m_appExcel = CreateObject("Excel.Application")
Noch als Tipp wie du die tatsächlichen Werte der Konstanten erhältst: Dazu tippst du im VBA Editor von Excel in den Direktbereich debug.print gefolgt vom Namen der Konstanten ein und drückst Enter, und schon wird dir der tatsächliche Wert ausgeben.
Grüße Uwe
Zitat von @mreske:
Eigentlich wollte ich noch die Word und Excel Dateien hochladen, aber das scheint nicht zu gehen?
die musst du leider selber irgendwo zum Download bereitstellen ... hier geht es leider nur mit Bildern.Eigentlich wollte ich noch die Word und Excel Dateien hochladen, aber das scheint nicht zu gehen?
Hallo Manfred,
der SaveAsDialog ist speziell und Objektabhängig. Deshalb solltest du diesen auch mit dem Word-Objekt erzeugen da du ja ein Word-Dokument und kein Excel-File speichern möchtest. Den Filterindex für das Format hast du ja schon richtig eingestellt. Dann musst du natürlich am Ende auch den Speichervorgang tatsächlich ausführen, was du mit .Execute machst. Zusätzlich sollte hier eine Abfrage geschehen ob der User wirklich den OK-Button und nicht den Abbrechen-Button gedrückt hat. Zusätzlich setze ich hier bei zu automatisierenden Aufgaben immer das DisplayAlerts = False damit eventuell erscheinende Popup-Warnungen nicht den Script-Ablauf stören. Hinterher bitte aber immer wieder auf True zurücksetzen.
Also insgesamt sieht das dann Beispielsweise so aus:
Das Funktioniert in diversen Anwendungen die hier und beim Kunden laufen einwandfrei ...
Viel Erfolg
Grüße Uwe
der SaveAsDialog ist speziell und Objektabhängig. Deshalb solltest du diesen auch mit dem Word-Objekt erzeugen da du ja ein Word-Dokument und kein Excel-File speichern möchtest. Den Filterindex für das Format hast du ja schon richtig eingestellt. Dann musst du natürlich am Ende auch den Speichervorgang tatsächlich ausführen, was du mit .Execute machst. Zusätzlich sollte hier eine Abfrage geschehen ob der User wirklich den OK-Button und nicht den Abbrechen-Button gedrückt hat. Zusätzlich setze ich hier bei zu automatisierenden Aufgaben immer das DisplayAlerts = False damit eventuell erscheinende Popup-Warnungen nicht den Script-Ablauf stören. Hinterher bitte aber immer wieder auf True zurücksetzen.
Also insgesamt sieht das dann Beispielsweise so aus:
Dim objWord As New Word.Application, fd As FileDialog, doc As Word.Document
objWord.DisplayAlerts = False
Set doc = objWord.Documents.Open("C:\Pfad\demo.docm")
objWord.DisplayAlerts = True
Set fd = objWord.FileDialog(msoFileDialogSaveAs)
With fd
.InitialView = msoFileDialogViewList
.InitialFileName = "c:\Temp\SaveAs.docx"
.AllowMultiSelect = False
.FilterIndex = 0
If .Show = True Then
.Execute
End If
End With
Ich habe schon alles ausprobiert und sämtliche Foren durchsucht, ohne Erfolg.
Dann hast du vermutlich falsch gesucht, das Thema gibt's zig mal im Netz zu finden.Viel Erfolg
Grüße Uwe
da muss bei dir irgendwas in deinem Code durcheinander gekommen sein, anders kann ich mir das nicht erklären. Hast du den Dialog auch wirklich aus dem Word-Objekt und nicht aus dem Excel-Application Objekt erzeugt ?
Hatte damit noch nie Probleme, irgendwo in deinem Code muss der Wurm drin sein, Schlaf nochmal drüber dann kommt dir sicher die Erleuchtung ...hatte ich hier schon oft
Hatte damit noch nie Probleme, irgendwo in deinem Code muss der Wurm drin sein, Schlaf nochmal drüber dann kommt dir sicher die Erleuchtung ...hatte ich hier schon oft
Moin,
wenn du mit dem File zwischen unterschiedlichen Programmversionen hin und her wechselst musst du vor dem Ausführen einmal das vba projekt öffnen den Verweisdialog öffnen, und dann das Dokument nochmal abspeichern und schließen, sonst kann es Inkonsistenzen geben und es geschehen solche merkwürdigen Dinge. Deshalb arbeite ich ungerne mit solchen Verweisen, denn die benötigt man normalweise nicht wenn man die Objekte direkt über CreateObject erzeugt, aber das hatte ich ja bereits oben schon mal erwähnt.
Schönen Feierabend
Grüße Uwe
wenn du mit dem File zwischen unterschiedlichen Programmversionen hin und her wechselst musst du vor dem Ausführen einmal das vba projekt öffnen den Verweisdialog öffnen, und dann das Dokument nochmal abspeichern und schließen, sonst kann es Inkonsistenzen geben und es geschehen solche merkwürdigen Dinge. Deshalb arbeite ich ungerne mit solchen Verweisen, denn die benötigt man normalweise nicht wenn man die Objekte direkt über CreateObject erzeugt, aber das hatte ich ja bereits oben schon mal erwähnt.
Schönen Feierabend
Grüße Uwe
Checke in der spanischen Version bitte auch ob der korrekte Filterindex selektiert ist, dort könnte der Eintrag für xlsx-Dateien an einer anderen Position stehen. Wenn das der Fall ist und du es universell gestallten willst, musst du die Filter mit einer Schleife durchlaufen und nach xlsx suchen. Du kannst mal testweise das DisplayAlerts = False rausnehmen, dann sollte dir eine Warnung angezeigt werden das Makros verloren gehen wenn du als xlsx abspeicherst.
Zur Info: Wenn du ein Dokument automatisiert speichern willst mit document.SaveAs(), unterdrücke mit DisplayAlerts = False eventuelle Dialoge. Arbeitest du aber mit dem SaveAs Dialog mit Userinput solltest du diese aber für diese Phase anzeigen und nicht unterdrücken lassen, damit gab es unter Office 2007 meine ich mal Probleme.
Naja ich habe hier schon sehr viel Geduld aufgebracht, dann wäre es auch von dir mal sehr nett wenn du deine Dokumente mal zur Verfügung stellen könntest (PM, e-Mail), damit wir das ganze hier schneller zu einem Abschluss bringen können ; Ansonsten klinke ich mich hier sonst aus.
Ich versuche hier zu helfen, aber da hilft meistens in solchen Fällen nur Fakten und keine schönen Worte.
Wenn ich immer die Glaskugel bemühen muss ist das ganze doch sehr mühselig. Du solltest mir mit dem Thema "Verweise" vertrauen, da ich das Thema bereits schon x mal beim Kunden hatte und dies nicht zu unterschätzen ist - auch wenn es nicht die Ursache sein sollte ist es unbedingt zu erwähnen !! Deswegen glaube mir und mach dein Dokument universeller, "ohne" zusätzliche Verweise...
Grüße Uwe
Zur Info: Wenn du ein Dokument automatisiert speichern willst mit document.SaveAs(), unterdrücke mit DisplayAlerts = False eventuelle Dialoge. Arbeitest du aber mit dem SaveAs Dialog mit Userinput solltest du diese aber für diese Phase anzeigen und nicht unterdrücken lassen, damit gab es unter Office 2007 meine ich mal Probleme.
Naja ich habe hier schon sehr viel Geduld aufgebracht, dann wäre es auch von dir mal sehr nett wenn du deine Dokumente mal zur Verfügung stellen könntest (PM, e-Mail), damit wir das ganze hier schneller zu einem Abschluss bringen können ; Ansonsten klinke ich mich hier sonst aus.
Ich versuche hier zu helfen, aber da hilft meistens in solchen Fällen nur Fakten und keine schönen Worte.
Wenn ich immer die Glaskugel bemühen muss ist das ganze doch sehr mühselig. Du solltest mir mit dem Thema "Verweise" vertrauen, da ich das Thema bereits schon x mal beim Kunden hatte und dies nicht zu unterschätzen ist - auch wenn es nicht die Ursache sein sollte ist es unbedingt zu erwähnen !! Deswegen glaube mir und mach dein Dokument universeller, "ohne" zusätzliche Verweise...
Grüße Uwe
Oh man, jetzt wo du "Acer" sagst fällt es mir wie Schuppen von dem Augen. Hatte genau das Problem vor ca. 2 Monaten bei jemandem dem ich hier auch geholfen habe und mich dann via Teamviewer aufschalten musste, aber mir viel ums verrecken nicht mehr ein was die Fehlerursache war. Genau dieses Schrott-Acer-Cloud-Addin hat bei demjenigen auch besagtes Verhalten ausgelöst, ich danke dir sehr das du es in eine Ausführliche Anleitung verpackt hast
Das wird sicherlich so manchem viel Frust ersparen ...
Viel Erfolg weiterhin
Grüße Uwe
Das wird sicherlich so manchem viel Frust ersparen ...
Viel Erfolg weiterhin
Grüße Uwe