MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Word
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 06.11.2019, 18:39   #1
kibit on sight
MOF User
MOF User
Standard VBA - Dateiname und Pfad über mehrere Zeilen selektieren

Hallo zusammen,
ich exportiere aus einer Access Datenbank mehrere Felder, unter anderem auch Textfelder, in denen der Dateiname einer Worddatei mit Pfad gespeichert sind. Unglücklicherweise kann der String über mehrer Zeilen gehen:
N:FPxxxx-productlineFPxxxxFPxxxx_Process_description_customer_spec_ph.docx

Nach dem Export sollen in der Worddatei mehrere andere Worddateien eingelesen werden, was auch ganz gut funktioniert.

Jedoch sobald der String mehr als eine Zeile umfasst, komme ich mit meiner Methode nicht weiter.

Code:

Sub FindText_ImportFile()


    ' cursor an den Anfang des Dokumnents, um von dort die Suche zu starten
    Selection.HomeKey Unit:=wdStory
    ' Zuweisung des Suchtexts
    Selection.Find.Text = "n:"

    ' suchen bis alles gefunden wurde
    Do While Selection.Find.Execute = True


' hier muss von n: bis zu docx alles markiert werden, im Moment ist nur die Zeile markiert
' *************************************************************

    'ganze Zeile markieren
    Selection.Expand wdLine
    'falsches blank am Ende wegschneiden, das macht word :(
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
'    MsgBox Selection

' *************************************************************

    'Importieren starten
    Call import_file
    
    'zum Ende der Zeile springen
'    Selection.Collapse wdCollapseStart
    
    'neue Zeile
    Selection.TypeParagraph
    
    Loop
    
'    MsgBox "import of all objects finished"
    ' zum Anfang springen
    ActiveDocument.Range(0, 0).Select

End Sub
Die sub import_file funktioniert.

Kann mir jemand sagen, wie ich den mehrzeiligen Dateinamen auslesen kann?

Für Tipps bin ich jetzt schon dankbar

__________________

who said that life is easy ???
kibit on sight ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 06.11.2019, 20:23   #2
Luschi
MOF Meister
MOF Meister
Standard

Hallo kibit on sight,

warum in Word per Vba etwas suchen, wenn aus Access Daten importiert werden. Leider zeigst Du diesem Import-Code nicht, aber das geht ja per Recordset, und da kennt man die Datensatz-Spalte, in der Deine gewünschten Infos stehen, die kann man doch in Variablen speichern und muß nicht im total unstrukturierten Word-Dokument per Krampf suchen.

Gruß von Luschi
aus klein-Paris
Luschi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 07:44   #3
kibit on sight
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo und danke für die Antwort, aber das bringt mich nicht weiter ...

leider geht das nicht anders, ich muss ein Word Dokument erzeugen, das sich aus unterschiedlichen anderen Word Dokumenten aufbaut, zusätzlich kommen natürlich Felder aus der Datenbank, jeweils variabel, je nachdem wie der Benutzer konfiguriert. Das Dokument wird dann bis zu 30 andere Dokumente importiert haben.
Da die Dokumente formatiert sind, habe ich nur diese Methode gefunden.

Also nochmals:

Aufbau in Word

n:LangerPfadMehrAlsEineZeileDateiname1.docx
TextAusAccess
TextAusAccess
etc.

n:LangerPfadMehrAlsEineZeileDateiname2.docx
TextAusAccess
TextAusAccess
etc.

Hier noch der code Schnipsel aus Access
Code:

Public Function ExportWord_LateBinding(qry_Name As String, Optional Doc_Name As String)


Dim objWord As Object, db As DAO.Database, objDocument As Object, Page_Number As Integer

'Doc_Name = "n:coversheets_templatesTecSpec_auto_import_VBA_03.docm"

Doc_Name = DLookup("[path_file]", "t_DatabaseSpec", "[description_file] = 'coversheet'") & _
            DLookup("[Name_file]", "t_DatabaseSpec", "[description_file] = 'coversheet'")
            

' Seite, ab der der Export stattfindet

Page_Number = DLookup("[number]", "t_DatabaseSpec", "[description_file] = 'start_pagenumber'")

    Dim rst As DAO.Recordset
    Set db = CurrentDb
    ' Abfrage aus der die Daten kommen
    Set rst = db.OpenRecordset(qry_Name, dbOpenDynaset)
 
    'See if Word is already running
    On Error Resume Next
    Set objWord = GetObject(, "Word.Application")
 
    If Err.Number <> 0 Then
        'Launch a new instance of Word
        Err.Clear
        On Error GoTo Error_Handler
        Set objWord = CreateObject("Word.Application")
'        objWord.Visible = True 'Make the application visible to the user (if wanted)
    End If
    
    
    With objWord
        .Visible = True
'       open a new document
'        Set objDocument = .Documents.Add

        ' open the worddocument including vba macros, maybe changed to a template document later
        .Documents.Open Doc_Name
        .Selection.GoTo 1, 2, , Page_Number
        
        
        ' send the general process description file to word, then CrLf and do the rest
            .Selection.TypeText rst!machine_path_general_process_description & vbCrLf
            ' Hier kommt der lange Dateiname noch richtig an
'            MsgBox rst!machine_path_general_process_description
        
            Do While Not rst.EOF

            .Selection.TypeText rst!base_module_description & vbCrLf _
                & rst!base_module_short_description & vbCrLf _
                & rst!base_module_path_object_TecSpec & vbCrLf _
                & rst!base_module_path_object_Offer & vbCrLf _
                & rst!base_module_path_object_Picture _
                & vbCrLf _
                & "-----------------------------------------------------------" _
                & vbCrLf

            rst.MoveNext

        Loop
        
        ' start word macro to import the files into the document
        
        objWord.Application.Run "Doc_Name!NatecWord_VBA_in_docm.FindText_ImportFile"

    End With

'    objWord.Quit
    Set objWord = Nothing
    
    MsgBox "data sent to word file, please save this with a different name"
    
    
Exit Function
 
Error_Handler:
    MsgBox "MS Access has generated the following error" & vbCrLf & vbCrLf & "Error Number: " & _
    Err.Number & vbCrLf & "Error Source: LaunchWord" & vbCrLf & "Error Description: " & _
    Err.Description, vbCritical, "An Error has Occured!"
    Exit Function
    
End Function

__________________

who said that life is easy ???
kibit on sight ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 07.11.2019, 15:00   #4
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo kibit,

wenn der Pfad immer mit "N:\ beginnt und mit "docx" endet, kann der Suchstring doch einfach so lauten:

.text = "N:\\*docx"

Dann ist es egal, über wieviele Zeilen der gesuchte String geht. Achtung:
Dabei müssen die Wildcards aktiviert sein (matchWildcards = true).

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 08.11.2019, 08:51   #5
kibit on sight
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo Gerhard, das teste ich mal in meiner Anwendung. Zusätzlich habe ich auch jpg Files im Pfad, aber müsste ja machbar sein.
Danke schon mal, melde mich
Peter

__________________

who said that life is easy ???
kibit on sight ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 08.11.2019, 09:35   #6
kibit on sight
Threadstarter Threadstarter
MOF User
MOF User
Strahlen

Hallo Gerhard, habe einen Teilerfolg, jedoch macht mir die Mischung der unterschiedlichen Dateien Sorgen, das Dokument sieht ungefähr so aus, die Leerzeilen kann ich aus Access steuern, es gibt keine Regel wie die Dateien kommen (also docx und jpg ist eher zufällig gemischt:

Code:

Anfang Dokument
Überschrift Position 1
N:test.jpg


Überschrift Position 2
N:slice.docx


Überschrift Position 3
N:test.jpg


Überschrift Position 4
N:document_1.docx


Überschrift Position 5
N:document_7.docx


Ende Dokument
Das heisst ich muss eine Schleife bauen, die von der aktuellen Cursorposition bis zum ersten Auftreten von "n:abc.docx" sucht, den Bereich in einer Variable speichern und dann nach der Endung "n:abc.jpg" suchen?

Der Hintergrund ist der, dass ich aus Access heraus gesteuert ein riesiges Dokument bauen muss, welches jpg und docx Dateien importiert, deren Dateinamen aus Access heraus kommen.
In Access VBA bin ich realtiv fit, jedoch Word VBA macht mir bisschen Sorgen.
Vielleicht hast du eine Idee, wie die Schleife aufgebaut werden muss.

Schönen Dank schon mal, der erste Tipp schon mal gut

__________________

who said that life is easy ???
kibit on sight ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 08.11.2019, 12:32   #7
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo kibit,

notfalls machst du halt zwei Suchdurchgänge, einen für die docx und einen für die jpg.

Aber dein neues Beispiel lässt mich vermuten, dass die Pfade zwar mehrzeilig sein können, aber jeweils in 1 eigenen Absatz stehen (d.h. automatischer Zeilenumbruch im Absatz). Dann könntest du wie folgt beides in einem Aufwasch suchen:
Code:

Sub suchdieStrings()
Dim suchbereich As Range, fundbereich As Range
Dim suchString As String

Set suchbereich = ActiveDocument.Range

    With suchbereich.Find
        .MatchWildcards = True
        .Text = "N:*^13"
            Do While .Execute
                'hier tust du, was du tun willst, z.B.
                Set fundbereich = suchbereich
                suchString = fundbereich.Text
                 'evtl für die Weiterverarbeitung die letzte Absatzmarke eliminieren
                suchString = Left(suchString, Len(suchString) - 1)
                MsgBox suchString
            Loop
    End With

End Sub
Kleines Musterdokument im Anhang.
Ob es so einfach geht, hängt davon ab, was du mit den Fundstellen vorhast. Das ist mir noch nicht klar geworden.
Angehängte Dateien
Dateityp: docm docxUndJpg.docm (36,0 KB, 1x aufgerufen)

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 08.11.2019, 18:31   #8
kibit on sight
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo Gerhard, danke vielmals für das Beispiel, werde das am WE austesten.

Tja, mit den Fundstellen importiere ich andere Dateien in das Masterdokument, der VBA code wird aus Access heraus in Word gestartet:


Code:

        objWord.Application.Run "Doc_Name!Word_VBA_in_docm.FindText_ImportFile"
Also im Prinzip Export Dateiname nach Word, dann importieren der Dateien in das Masterdokument.

Ich persönlich finde das nicht so toll, aber es soll eine Interimslösung werden und da gehe ich dann solche Dinge auch mal mit.

In Access gibt es Stammdaten, wo Dokumente und Bilder per Pfad/Dateiname hinterlegt werden.
Aus den Stammdaten kann dann der Benutzer über einen Konfigurator auswählen, und sich dann so ein komplexes Dokument erstellen.
Das System ist relativ komplex und enthält viele unterschiedliche Dateien an diversen Stellen im Netzwerk ...

Ich wünsche ein schönes Wochenende

Peter

__________________

who said that life is easy ???
kibit on sight ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.11.2019, 09:07   #9
kibit on sight
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo Gerhard,
der code funktioniert super, jedoch habe ich jetzt ein weitergehendes Problem:

An der Stelle, wo der Dateiname gefunden wurde, soll das Dokument oder Bild eingefügt werden.
Wenn ich das so mache:

Code:

Sub FindText_ImportFile()

Dim suchbereich As Range, fundbereich As Range
Dim suchString As String
Dim DateiName As String


Set suchbereich = ActiveDocument.Range

    With suchbereich.Find
        .MatchWildcards = True
        .Text = "N:*^13"
            Do While .Execute
                'hier tust du, was du tun willst, z.B.
                Set fundbereich = suchbereich
                suchString = fundbereich.Text
                 'evtl für die Weiterverarbeitung die letzte Absatzmarke eliminieren
                DateiName = Left(suchString, Len(suchString) - 1)
                Call import_file(DateiName)
            Loop
    End With

End Sub
dann werden die Dokumente zwar richtig importiert, jedoch am Ende des Masterdokuments.
Im Prinzip möchte ich das Dokument Zeile für Zeile durchlaufen, und genau der Stelle, wo der Dateinamen gefunden wird, das gefundene Dokument importieren, dann den Pfad und Dateiname löschen und weitersuchen.

Hier mal mein Import Code, vielleicht hast du noch eine Idee...

Code:

Sub import_file(DateiName As String)

Dim DateiendungErmitteln As String, DateiEndung As String

On Error GoTo ErrorHandler

    If DateiName <> "" Then
        DateiendungErmitteln = Mid(DateiName, InStrRev(DateiName, ".") + 1)
'        MsgBox DateiendungErmitteln
        If DateiendungErmitteln = "docx" Then
            DateiEndung = "word"
        End If
        If DateiendungErmitteln = "jpg" Then
            DateiEndung = "picture"
        End If
    End If
    

    Select Case DateiEndung
    ' beim Einfügen wird der selektierte Dateiname automatisch entfernt
    Case "word"
        Selection.InsertFile FileName:=DateiName, _
        Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False
    Case "picture"
        Selection.InlineShapes.AddPicture FileName:=DateiName, LinkToFile:= _
        False, SaveWithDocument:=True
    Case Else
        MsgBox "one or more documents are not found or having a wrong file extension"
    End Select
    
    ' neue Zeile
'    Selection.TypeParagraph
    
    Exit Sub
    
ErrorHandler:
    MsgBox Err.Description
    Resume Next
           
End Sub
VG Peter

__________________

who said that life is easy ???
kibit on sight ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.11.2019, 09:13   #10
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo Peter,

schau mal, ob das so passt. Ich hab die jeweilige Fundstelle selektieren lassen, damit sie auch überschrieben wird.
Code:

Sub FindText_ImportFile()

Dim suchbereich As Range, fundbereich As Range
Dim suchString As String
Dim dateiname As String

Set suchbereich = ActiveDocument.Range

    With suchbereich.Find
        .MatchWildcards = True
        .Text = "C:*^13"
            Do While .Execute
            
                Set fundbereich = suchbereich
                fundbereich.Select
                suchString = fundbereich.Text
                suchString = Left(suchString, Len(suchString) - 1)
                MsgBox suchString
                Call import_file(suchString)
            Loop
 End With
 End Sub
 
 Sub import_file(dateiname As String)
  Dim dateiendungErmitteln As String, dateiEndung As String
  
     If dateiname <> "" Then
        dateiendungErmitteln = Mid(dateiname, InStrRev(dateiname, ".") + 1)
          MsgBox dateiendungErmitteln
            If dateiendungErmitteln = "docx" Then
                dateiEndung = "word"
            End If
            If dateiendungErmitteln = "jpg" Then
                dateiEndung = "picture"
            End If
    End If
    
    Select Case dateiEndung
    ' beim Einfügen wird der selektierte Dateiname automatisch entfernt
    Case "word"
        Selection.InsertFile FileName:=dateiname, _
        Range:="", ConfirmConversions:=False, Link:=False, Attachment:=False
    Case "picture"
       
        Selection.InlineShapes.AddPicture FileName:=dateiname, LinkToFile:= _
        False, SaveWithDocument:=True
    Case Else
        MsgBox "one or more documents are not found or having a wrong file extension"
    End Select

End Sub
Beachte, dass ich die Pfade an meine Testumgebung angepasst habe.
Angehängte Dateien
Dateityp: docm Das ist das Quelldokument.docm (37,4 KB, 0x aufgerufen)

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.11.2019, 11:24   #11
kibit on sight
Threadstarter Threadstarter
MOF User
MOF User
Standard


Hallo Gerhard,
super, das funktioniert, genau so sollte es sein.
Da lerne ich jetzt auch ein bisschen Word VBA

Vielen Dank hierfür, wünsche eine gute Woche

Peter

__________________

who said that life is easy ???
kibit on sight ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.