![]() |
|
#11
|
||||
|
||||
|
Assuming the data errors you discovered in the other thread are the issue for this one also, try the following:
Code:
Sub Demo()
Application.ScreenUpdating = False
Dim wdDoc As Document, i As Long, j As Long, k As Long
Dim StrPri As String, StrSec As String, StrTmp As String, StrTxt As String, StrOut As String
StrSec = InputBox("What is the Secondary Text Array to Find?" _
& vbCr & "Use the '|' character to separate array elements.")
If Trim(StrSec) = "" Then Exit Sub
Set wdDoc = Documents.Open(File:="Drive:\FilePath\SearchList.doc", Visible:=False, AddToRecentFiles:=False)
StrPri = Replace(wdDoc.Range.Text, vbLf, vbCr)
wdDoc.Close False
Set wdDoc = Nothing
While InStr(StrPri, vbCr & vbCr) > 0
strFnd = Replace(StrPri, vbCr & vbCr, vbCr)
Wend
StrPri = Left(StrPri, Len(StrPri) - 1)
With ActiveDocument.Range
j = .End
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "^94[!^94]"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchWildcards = True
.Execute
End With
Do While .Find.Found = True
With .Duplicate
.Start = .Start + 1
.MoveEndUntil Cset:="^", Count:=wdForward
'Within each found block, check for a primary extraction string
For i = 0 To UBound(Split(StrPri, vbCr))
'If found, look for all the secondary strings
If InStr(.Text, Split(StrPri, vbCr)(i)) > 0 Then
For j = 0 To UBound(Split(StrSec, "|"))
If InStr(.Text, Split(StrSec, "|")(j)) > 0 Then
'Extract the text on the secondary string's line
StrTmp = Split(.Text, Split(StrSec, "|")(j))(1)
StrTmp = Split(StrTmp, vbCr)(0)
StrOut = StrOut & vbCr & StrTmp
End If
Next
Exit For
End If
Next
If .End = x Then Exit Do
End With
.Collapse wdCollapseEnd
.Find.Execute
Loop
'Clean up the output string, removing unwanted spaces and capitalising words
StrTmp = StrOut
StrOut = ""
For i = 0 To UBound(Split(StrTmp, "/"))
For j = 0 To UBound(Split(Trim(Split(StrTmp, "/")(i)), ","))
StrTxt = Trim(Split(Trim(Split(StrTmp, "/")(i)), ",")(j))
StrOut = StrOut & UCase(Left(StrTxt, 1)) & Right(StrTxt, Len(StrTxt) - 1) & ","
Next
StrOut = Left(StrOut, Len(StrOut) - 1) & "/"
Next
End With
If StrOut = "" Then Exit Sub
Call ExcelOutput(StrOut)
Application.ScreenUpdating = True
End Sub
Sub ExcelOutput(StrIn As String)
Dim xlApp As Object, xlWkBk As Object, xlWkSht As Object
Dim StrTmp As String, i As Long, j As Long
'Start a new Excel session
Set xlApp = CreateObject("Excel.Application")
If xlApp Is Nothing Then
MsgBox "Can't start Excel.", vbExclamation
Exit Sub
End If
Set xlWkBk = xlApp.Workbooks.Add
' Ppopulate the workbook, with one row per line and
' separate columns for each /-delineated 'field'
With xlWkBk.Worksheets(1)
For i = 0 To UBound(Split(StrIn, vbCr))
StrTmp = Split(StrIn, vbCr)(i)
For j = 0 To UBound(Split(StrTmp, "/")) - 1
If Split(StrTmp, "/")(j) <> "" Then
.Cells(i, j).Value = Split(StrTmp, "/")(j)
End If
Next
Next
End With
'Show the Excel workbook
xlApp.Visible = True
' Release Excel object memory
Set xlWkBk = Nothing: Set xlApp = Nothing
End Sub
With the above code, you'll still be asked for the secondary string, which should be input like 'NAM|ID' (without the single quotes).
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] Last edited by macropod; 09-20-2012 at 10:23 PM. |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
Find, copy and paste into a new page
|
jperez84 | Word VBA | 24 | 09-20-2012 11:34 AM |
| Trying to find and copy all headings at the same time | WaltR | Word | 7 | 08-21-2012 03:12 PM |
How to find exact phrase
|
CabbageTree | Outlook | 2 | 05-14-2012 11:24 AM |
Bad view when using Find and Find & Replace - Word places found string on top line
|
paulkaye | Word | 4 | 12-06-2011 11:05 PM |
| Find and Replace Macro - A Better Way | Tribos | Word VBA | 0 | 10-08-2008 03:22 AM |