mreske
Goto Top

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:
30f6710ac55fd9eefca9110cbb95a1b3

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

Content-ID: 235401

Url: https://administrator.de/contentid/235401

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

colinardo
Lösung colinardo 12.04.2014, aktualisiert am 27.05.2014 um 21:22:45 Uhr
Goto Top
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.
' 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
Grüße Uwe
mreske
mreske 12.04.2014 um 23:39:26 Uhr
Goto Top
Hallo Colinardo,
vielen Dank für die schnelle Antwort.
Leider bekomme ich eine Fehlermeldung weil die Variablen "FSO", "file" und "lbResults" nicht definiert sind.
Hier habe ich jetzt folgenden Code ergänzt:

Dim doc As Document
Dim FSO
Dim file
Dim lbResults as Object

Jetzt kommt zwar keine Fehlermeldung aber es passiert nach Verlassen des Textfeldes garnichts

Was mache ich falsch und wie muss ich die Variablen deklarieren?
Was muss ich ändern, damit in der Listbox nur die Dateinamen (ohne Pfad) angezeigt werden?

Vielen Dank vorab und noch einen schönen Abend
colinardo
Lösung colinardo 13.04.2014, aktualisiert am 27.05.2014 um 21:22:32 Uhr
Goto Top
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.

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
mreske
mreske 13.04.2014 um 18:38:45 Uhr
Goto Top
Genial es funktioniert - genauso wie im Demo-Dokument habe ich es mir vorgestellt!

Leider wird die Einfügemarke "DeineTextmarke" überschrieben, d.h. dass das Marko bei einem zweiten Lauf einen Fehler ausgibt, weil er die Textmarke nicht findet.

ActiveDocument.Bookmarks("DeineTextmarke").Range.Paste ' --> beim 2. Lauf findet wird "DeineTextmarke" nicht gefunden.

Die anderen Textmarken (LiefName, LiefAnschrift, LiefPLZ etc) dagenen bleiben bestehen, wenn ich zb den Lieferanten über mein UserForm wechsel.
Liegt das evtl. daran, dass die Lieferanten-Adressdaten einzeilig sind und die Bestelltexte unterschiedlich lang (teilweise über mehrere Seiten)?

Gibt es nicht einen Schutz davor, dass die Textmarken gelöscht werden?

Grüße
Mreske
colinardo
Lösung colinardo 13.04.2014, aktualisiert am 27.05.2014 um 21:22:07 Uhr
Goto Top
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.
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
Grüße Uwe
mreske
mreske 13.04.2014 um 22:27:06 Uhr
Goto Top
Hallo Uwe,
vielen Dank. Damit muss ich mich nächste Woche unbedingt beschäftigen. Wenn ich es mit den Textmarken hinbekommen habe, werde ich den Code online stellen.
Grüße
Manfred
mreske
mreske 14.05.2014 aktualisiert um 23:01:08 Uhr
Goto Top
Hallo Uwe,
zwar etwas spät, aber ich möchte jetzt, wie versprochen die Prozedur online stellen:

01. Die Word-Datei "Breifbestellung.docm" und die Excel-Datei "Lieferanten.xls" bitte in folgendem Ordner ablegen: C:\vbaTest
02. Die Word-Dateien "Text1", Text2", Text3" bitte in diesem Ordner ablegen: C:\vbaTest\Bestelltexte
Hier können beliebig viele weitere Textdateien ergänzt werden
03. Mit ALT+F11 in die VBA-Umgebung wechseln und unter Extras-Verweise die Bibliothek anlegen: MicrosoftExcel xx.0 OjectLibary

Dann das Formular starten, Lieferanten suchen (Enter), Text suchen (Enter) und auf die Schaltfläche "Senden an Word" klicken

Bei mir läuft es einwandfrei
Leider bekomme ich es nicht hin, dass Word die Excel-Bibliothek automatisch lädt. Ich möchte damit vermeiden, dass auf anderen Rechnern immer erst manuell die Bibliothek geladen werden soll. Ich habe es mit LateBinding versucht aber ohne Erfolg - weiß da vielleicht jemand weiter?

Hier noch einmal der ganze Code:
 
Option Explicit
' Ordner für die Text-Vorlagen  

Const DOCFOLDER = "C:\vbaTest\Bestelltexte"  

Dim BoEnter As Boolean
Dim m_appExcel As Excel.Application
Dim m_wbkExcel As Excel.Workbook
Dim m_wksExcel As Excel.Worksheet
Dim m_rngExcel As Excel.Range
Dim m_rngCell As Range
Dim m_strFirstAddress As String
Dim m_Suchwort As String
Dim m_LiefName As String
Dim m_LiefAnschrift As String
Dim m_LiefLand As String
Dim m_LiefPLZ As String
Dim m_LiefOrt As String
Dim m_Bereich As Range
Dim m_rngDoc As Range
Dim m_oDoc As Document
Dim m_LT As String

Private Sub UserForm_Initialize()
Dim DatumHeute As String
DatumHeute = Format(Date, "dd.mm.yyyy")  
BestelldatenWord.BestDatum = DatumHeute
End Sub

Private Sub BestelldatenWord_Activate()
lbResults.Clear
LiefSuche.SetFocus
End Sub

Private Sub LiefSuche_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Set m_appExcel = Excel.Application
Set m_wbkExcel = Excel.Workbooks.Open("C:\vbaTest\Lieferanten.xlsx")  
Set m_wksExcel = Excel.Worksheets("Lieferanten")  
Set m_rngExcel = m_wksExcel.UsedRange
   
m_Suchwort = ("*" & BestelldatenWord.LiefSuche.Value & "*")  
BestelldatenWord.LiefListBox.Clear
With m_wksExcel.Range("F:F")  
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
.AddItem
.List(.ListCount - 1, 0) = m_rngExcel.Text                   'LieferantenName  
.List(.ListCount - 1, 1) = m_rngExcel.Offset(0, 5).Value     'LiefAnschrift  
.List(.ListCount - 1, 2) = m_rngExcel.Offset(0, 1).Value     'LiefLand  
.List(.ListCount - 1, 3) = m_rngExcel.Offset(0, 6).Value     'LiefPLZ  
.List(.ListCount - 1, 4) = m_rngExcel.Offset(0, 7).Value     'LiefOrt  
.ColumnWidths = "8cm"  
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
Private Sub LiefListBox_Click()
Set m_appExcel = Excel.Application
Set m_wbkExcel = Excel.Workbooks.Open("C:\vbaTest\Lieferanten.xlsx")  
Set m_wksExcel = Excel.Worksheets("Lieferanten")  
Set m_rngExcel = m_wksExcel.UsedRange

Dim LiefKontakt As Worksheet
Dim EndeLiefKontakt As Integer
Dim I As Integer
Dim ZahlBed As String

m_LiefName = LiefListBox.List(LiefListBox.ListIndex, 0)
m_LiefAnschrift = LiefListBox.List(LiefListBox.ListIndex, 1)
m_LiefLand = LiefListBox.List(LiefListBox.ListIndex, 2)
m_LiefPLZ = LiefListBox.List(LiefListBox.ListIndex, 3)
m_LiefOrt = LiefListBox.List(LiefListBox.ListIndex, 4)

BestelldatenWord.LiefName = m_LiefName
BestelldatenWord.LiefAnschrift = m_LiefAnschrift
BestelldatenWord.LiefLand = m_LiefLand
BestelldatenWord.LiefPLZ = m_LiefPLZ
BestelldatenWord.LiefOrt = m_LiefOrt

m_wbkExcel.Close False
m_appExcel.Quit
Set m_appExcel = Nothing
End Sub

Private Sub SendenAnWord_Click()
Set m_Bereich = ActiveDocument.Bookmarks("LiefName").Range  
m_Bereich.Text = m_LiefName
ActiveDocument.Bookmarks.Add Name:="LiefName", Range:=m_Bereich  

Set m_Bereich = ActiveDocument.Bookmarks("LiefAnschrift").Range  
m_Bereich.Text = m_LiefAnschrift
ActiveDocument.Bookmarks.Add Name:="LiefAnschrift", Range:=m_Bereich  

Set m_Bereich = ActiveDocument.Bookmarks("LiefLand").Range  
m_Bereich.Text = m_LiefLand
ActiveDocument.Bookmarks.Add Name:="LiefLand", Range:=m_Bereich  

Set m_Bereich = ActiveDocument.Bookmarks("LiefPLZ").Range  
m_Bereich.Text = m_LiefPLZ
ActiveDocument.Bookmarks.Add Name:="LiefPLZ", Range:=m_Bereich  

Set m_Bereich = ActiveDocument.Bookmarks("LiefOrt").Range  
m_Bereich.Text = m_LiefOrt
ActiveDocument.Bookmarks.Add Name:="LiefOrt", Range:=m_Bereich  

Set m_Bereich = ActiveDocument.Bookmarks("BestDatum").Range  
m_Bereich.Text = BestelldatenWord.BestDatum
ActiveDocument.Bookmarks.Add Name:="BestDatum", Range:=m_Bereich  

Set m_Bereich = ActiveDocument.Bookmarks("LT").Range  
m_Bereich.Text = BestelldatenWord.LT
ActiveDocument.Bookmarks.Add Name:="LT", Range:=m_Bereich  

BestelltextEinfügen

Me.Hide
AlleFldAktualisieren
End Sub

Sub BestelltextEinfügen()
If lbResults.ListIndex <> -1 Then
Dim objWord As Word.Application
Dim strDocPath As String
Dim docBestellung As Document
Dim docBestelltext As Document

Dim strBMName   As String   'Textmarkenname  
Dim rngBMRange  As Range    'Textmarkenbereich  
  
Dim strBMText   As String   'Textmarken-Text  
strBMName = "Bestelltext1"  'Textmarkenname  

' Pfad der aktuell markierten Zeile aus der zweiten unsichtbaren Spalte holen  
strDocPath = lbResults.List(lbResults.ListIndex, 1)
        
Set docBestelltext = Documents.Open(strDocPath)
docBestelltext.Content.Copy
docBestelltext.Close True

With ActiveDocument 'docBestellung 'ActiveDocument  
If .Bookmarks.Exists(strBMName) Then
'Verweis auf den Textmarkenbereich setzen  
Set rngBMRange = .Bookmarks(strBMName).Range
'Der Textmarke den Text zuweisen  
rngBMRange.Paste
'Textmarke neu definieren  
.Bookmarks.Add Name:=strBMName, Range:=rngBMRange
End If
End With
End If
End Sub

Private Sub txtSearch_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim doc As Document, fso As Object, file As Object, found As Boolean
'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
found = True
'Wurde ein Treffer gefunden füge den Namen ohne Extension zur Listbox hinzu  
lbResults.AddItem fso.GetBaseName(file.Name)
'Speichere den Pfad der Datei in einer zweiten Spalte der Listbox die in der Eigenschaft die Breite '0' bekommen sollte damit sie nicht sichtbar ist  
lbResults.List(lbResults.ListCount - 1, 1) = file.Path
End If
End If
Next
If Not found Then
MsgBox "Kein Dokument mit dem Suchwort gefunden"  
End If
End Sub

Public Sub AlleFldAktualisieren()
Set m_oDoc = ActiveDocument
For Each m_rngDoc In m_oDoc.StoryRanges
m_rngDoc.Fields.Update
While Not (m_rngDoc.NextStoryRange Is Nothing)
Set m_rngDoc = m_rngDoc.NextStoryRange
m_rngDoc.Fields.Update
Wend
Next m_rngDoc
ActiveDocument.Bookmarks("LiefName").Select  
End Sub
mreske
mreske 14.05.2014 um 22:55:47 Uhr
Goto Top
Eigentlich wollte ich noch die Word und Excel Dateien hochladen, aber das scheint nicht zu gehen?
colinardo
Lösung colinardo 14.05.2014, aktualisiert am 27.05.2014 um 21:21:09 Uhr
Goto Top
n'Abend Manfred,
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")
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
colinardo
colinardo 14.05.2014 aktualisiert um 23:06:18 Uhr
Goto Top
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.
mreske
mreske 20.05.2014 aktualisiert um 21:58:10 Uhr
Goto Top
Vielen Dank Uwe,
ich werde es in den nächsten Tagen wohl erst ausprobieren können.

Erst möchte ich, dass die nun generierte Bestelldatei "Breifbestellung.docm" unter einen anderen Namen und in einem anderen Ordner abgespeichert wird.
Dazu soll sich ein "Speichern unter" Dialogfeld öffnen und den entsprechenden Pfad + Dateinamen voreinstellen.
Das funktioniert auch mit folgendem Code. Wenn ich aber den Button "Speichern" drücke, wird die Datei nicht im gewünschten Ordner abgespeichert (es passiert praktisch nichts). Ich habe schon alles ausprobiert und sämtliche Foren durchsucht, ohne Erfolg.

Sub SpeichernMitBestellnummer()
Dim objWord As Word.Application
Dim Briefbestellung As Document
Dim dialogs As FileDialog

m_PfadBestellung = "C:\vbaTest\Bestellungen\Bestellung1.docx"  

Set dialogs = Application.FileDialog(msoFileDialogSaveAs)
With dialogs
.InitialView = msoFileDialogViewList
.InitialFileName = m_PfadBestellung
.FilterIndex = 0
.Show
End With
End Sub

Beim folgenden Code wird zwar abgespeichert, aber der gewünschte Pfad und Dateiname ist nicht vorgegeben. Stattdessen zeigt das Dialogfeld den Pfad und Namen der Datei "Briefbestellung.docm" unter "C:\vbaTest\" an. Wenn ich hier den Pfad und Dateiname manuell eingebe, wird allerdings zumindest abgespeichert.

ActiveDocument.Shapes(1).TextFrame.TextRange.Select
With dialogs(wdDialogFileSaveAs)
.Name = "C:\vbaTest\Bestellung1.docx"  
.Show
End With

Warum wird die Datei nicht dort abgespeichert wo angegeben wurde?

Vielen Dank vorab
colinardo
Lösung colinardo 21.05.2014, aktualisiert am 27.05.2014 um 21:20:14 Uhr
Goto Top
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:
    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
Das Funktioniert in diversen Anwendungen die hier und beim Kunden laufen einwandfrei ...

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
mreske
mreske 21.05.2014 um 21:30:01 Uhr
Goto Top
Hallo Uwe,

erst mal vielen Dank für die schnellen Rückmeldungen.
Ich habe deinen Code jetzt so, wie oben beschrieben, eingegeben. Allerdings passiert das Gleiche wie vorher auch:

1. Das Dialogfeld "Speichern unter" den gewünschten Pfad + Dateiname korrekt an - speichert diesen aber nicht ab (wie schon zuvor beschrieben).
2, Nun erscheint ein weiteres Dialogfeld "Speichern unter" (wohl ausgeführt durch die .Execute Anweisung), jedoch mit dem Pfad und Dateinamen der Bestelldatei.
Wenn ich hier nun den Pfad und Dateiname manuell eingebe, wird die Datei abgespeichert.

Gruß
Manfred
colinardo
Lösung colinardo 21.05.2014, aktualisiert am 27.05.2014 um 21:20:07 Uhr
Goto Top
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 face-smile
mreske
mreske 22.05.2014, aktualisiert am 26.05.2014 um 20:58:07 Uhr
Goto Top
Hallo Uwe, ich glaube ich weiß jetzt wo der Fehler liegt:
Ich habe den Code aus der UserForm ausgeführt.
Ich muss ihn aber, glaube ich, aus einem Modul starten (und dann auch nicht mit F5 aus der UserForm starten, sondern im Word Register aus der Gruppe Makros aufrufen (ALT+F8).

Ich ändere das mal, sobald ich Zeit habe, und melde mich dann nochmal.

Manchmal ist es wirklich besser, auf die "Erleuchtung" am nächsten Tag zu warten.
Danke nochmal
mreske
mreske 26.05.2014 aktualisiert um 21:25:51 Uhr
Goto Top
Hallo,
noch einmal zu meinem vorherigen Kommentar:
Ich habe es jetzt einmal bei der Arbeit unter Word 2010 getestet und hier läuft der Code einwandfrei, wenn ich ihn wie oben beschrieben aus einem Modul aus aufrufe.
Allerdings läuft es bei meiner Word 2007 Version (in Spanisch) zu Hause nach wie vor nicht, obwohl die Verweise in den Bibliotheken gleich sind. Hier öffnet sich zwar das Dialogfenster mit dem korrekt voreingestellten Pfad und Dateinamen aber nach klicken auf "Speichern" öffnet sich erneut das Dialogfenster mit dem Pfad und Namen des aktuellen Dokumentes. Es kann ja nicht sein, dass Word 2007 die "speichern unter" Funktion nicht unterstützt oder?

b39f6e640464bac403f44039e58e3e7f
colinardo
Lösung colinardo 26.05.2014, aktualisiert am 27.05.2014 um 21:19:56 Uhr
Goto Top
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
mreske
mreske 26.05.2014 aktualisiert um 21:48:55 Uhr
Goto Top
Hallo Uwe,
genau davon lebt doch ein Forum oder? Die Zeit habe ich eigentlich auch nicht, ich nehme sie mir aber und verzichte dafür auf Anderes, in der Hoffung dazuzulernen.
Ich wechsel auch eigentlich nicht mit dem File zwischen den Programmversionen hin und her sondern aktualisiere jeweils nur die Prozeduren. Daher glaube ich nicht, dass es daran liegt.
Ich melde mich, wenn ich die Lösung gefunden habe.
Auch noch einen schönen Feierabend.
colinardo
Lösung colinardo 26.05.2014, aktualisiert am 27.05.2014 um 21:19:45 Uhr
Goto Top
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
mreske
mreske 27.05.2014 um 21:18:38 Uhr
Goto Top
Hallo Uwe,
ich habe die Lösung zum Problem gefunden.

Beim Starten von Word 2007 hat hier anscheinend ein Add-In Namens "AcerCloud Word Addin" versucht auf eine nicht vorhandene Registrierung zuzugreifen,

Hier die Vorgehensweise zur Korrektur:

01. Word OHNE Addins und Templates starten: Windows -> Start -> Ausführen mit: Winword.exe /a
02. Wenn das Marko hier läuft, muss herausgefunden werden, welche Addins existieren (siehe Punkt 03).
03. In Word auf die Office-Schaltfläche -> Word-Optionen -> Anpassen -> im rechten Bereich der Liste "Alle Befehle" auswählen" -> COM-Add-ins HINZUFÜGEN
Somit kann man dann über eine Schaltfläche im Menu die Addins anzeigen lassen
0a406fd3a345c54498c602bb36964a1f

01c27e7b9823cddf9a2eb018b48858fb

Alternativ kann man aus folgenden Code ausführen und sich die Addins per Msgbox anzeigen lassen:
Sub ListAddins()
   Dim MyAddin As COMAddIn
   Dim i As Integer, msg As String

   For Each MyAddin In Application.COMAddIns
      msg = msg & MyAddin.Description & " - " & MyAddin.ProgID & vbCrLf  
   Next
   MsgBox msg
End Sub

04. Dann das entsprechende Addin löschen
6852ac3f4c8267c506adc8b906de3f4f

Jetzt läuft die "Speichern unter" Prozedur perfekt. Vielleicht hat ja mal jemand das gleiche nervtötende Problem.

Ich möchte den Beitrag jetzt abschließen. Vielen Dank für deine Hilfe und Geduld Uwe. Im Gegensatz zu deinen Kenntnissen bin ich ja noch Anfänger. Ich werde deine Ratschläge bezüglich der Verweise anschauen und ggf. hier aktualisieren. Die Beispieldateien verlinke ich demnächst auch hier im Forum.

Viele Grüße
colinardo
colinardo 27.05.2014 aktualisiert um 23:58:43 Uhr
Goto Top
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 face-smile
Das wird sicherlich so manchem viel Frust ersparen ...

Viel Erfolg weiterhin
Grüße Uwe