2016-06-08 13 views
0

Ich versuche ein VBA-Skript zu machen, das ein Word-Dokument öffnet, nach einem Wort sucht, das wie "TPXXXX" aussieht, wobei "X" Zahlen sind, und fügt das dann ein Text in eine Excel-Tabelle. Ich kann das Word-Dokument öffnen, aber ich habe Schwierigkeiten, den benötigten Text auszuwählen und zu finden. So weit für diesen Teil habe ich:Word-Dokument öffnen, bestimmten Text kopieren, in Excel-Tabelle einfügen

Sub Copy() 

'Create variables 
Dim Word As New Word.Application 
Dim WordDoc As New Word.Document 
Dim Doc_Path As String 
Dim WB As Workbook 
Dim WB_Name As String 

Doc_Path = "C:\Path\To\File.docx" 
Set WordDoc = Word.Documents.Open(Doc_Path) 

'Find text and copy it (part that I am having trouble with) 
Selection.Find.ClearFormatting 
With Selection.Find 
    .Text = "TP" 
    .Format = False 
    .MatchCase = False 
    .MatchWholeWord = False 
    .MatchWildcards = False 
End With 
Selection.Find.Execute 
Selection.EscapeKey 
Selection.MoveLeft Unit: wdCharacter , Count:=2 
Selection.MoveRight Unit: wdCharacter , Count:=4 
Selection.Copy 

'Open excel workbook and paste 
WB_Name = Application.GetOpenFilename(",*.xlsx") 
Set WB = Workbooks.Open(WB_Name) 

WB.Sheets("Sheet1").Select 
Range("AB2").Select 
ActiveSheet.Paste 
WordDoc.Close 
Word.Quit 

End Sub 

Kann mir jemand einige Hinweise geben?

Antwort

1

Hier ist die Excel-Version hilft:

Sub CopyTPNumber() 

    'Create variables 
    Dim Word As New Word.Application 
    Dim WordDoc As New Word.Document 
    Dim r As Word.Range 
    Dim Doc_Path As String 
    Dim WB As Excel.Workbook 
    Dim WB_Name As String 

    Doc_Path = "C:\temp\TestFind.docx" 
    Set WordDoc = Word.Documents.Open(Doc_Path) 
    ' Set WordDoc = ActiveDocument 

    ' Create a range to search. 
    ' All of content is being search here 
    Set r = WordDoc.Content 

    'Find text and copy it (part that I am having trouble with) 
    With r 
     .Find.ClearFormatting 
     With .Find 
      .Text = "TP[0-9]{4}" 
      .Format = False 
      .MatchCase = False 
      .MatchWholeWord = False 
      .MatchWildcards = True 
      .Execute 
     End With 
     .Copy 
     ' Debug.Print r.Text 
    End With 


    'Open excel workbook and paste 
    WB_Name = Excel.Application.GetOpenFilename(",*.xlsx") 
    Set WB = Workbooks.Open(WB_Name) 

    WB.Sheets("Sheet1").Select 
    Range("AB2").Select 
    ActiveSheet.Paste 
    WordDoc.Close 
    Word.Quit 

End Sub 
+0

Das funktioniert perfekt! Weißt du, wie ich eine Schleife erstellen würde, um alle TP-Nummern zu finden? – electronicaneer

+0

Statt '.Execute' können Sie eine Schleife ausführen:' Do While .Execute'. Ein Beispiel finden Sie [hier] (http://superuser.com/questions/1009085/find-all-instances-of-a-text-and-make-it-a-hyperlink-with-a-macro). – xidgel

+0

Noch eine Sache, wie würde ich die Schleife stoppen, wenn es keine TPXXXX-Nummern mehr gibt? Die Anzahl der TP-Nummern variiert von jedem Dokument, aus dem ich sie kopieren muss, und das Einzige, woran ich denken kann, ist vielleicht die Anzahl der TP-Nummern zu zählen und dann eine For-Schleife zu verwenden, um diese mehrmals zu wiederholen. – electronicaneer

0

Dies könnte Ihnen den Einstieg:

Selection.Find.ClearFormatting 
With Selection.Find 
    .Text = "TP[0-9]{4}" 
    .Format = False 
    .MatchCase = False 
    .MatchWholeWord = False 
    .MatchWildcards = True 
    .Execute 
End With 
Selection.Copy 

Ich habe Platzhalter verwendet .MatchWildcards = True entsprechen. Das übereinstimmende Muster wird durch .Text = "TP[0-9]{4}" angegeben --- entspricht "TP" gefolgt von genau vier Ziffern. Wenn die Anzahl der Ziffern in Ihrer Anwendung variiert, ersetzen Sie {4} durch sagen {3,5}.

Hoffnung, die

+0

Oops --- der obige Codeausschnitt läuft in Word, aber nicht von Excel. Siehe unten für die Excel-Version. – xidgel

+0

Wie unterscheidet sich VBA-Code beim Wechseln zwischen Excel und Word? – electronicaneer

+0

Wenn der VBA-Code von Word ausgeführt wird, können Sie auf das Objekt 'Selection' in Word zugreifen. Wenn ich von Excel aus laufe, habe ich keinen Zugriff auf "Selection" von Word (zumindest weiß ich nicht, wie es geht). Deshalb habe ich ein 'Word.Range' Objekt verwendet. – xidgel