Requirement:
The user needs to be able to search through our document folders and search word documents for a specific string and return the file names.
Solution:
This will have issues with some Word macros depending on security and embedded SQL code.
Sub Main()
Dim p$, fn$, i As Long, j As Long, z As Long, r As Long, c As Integer
Dim a, b, d, e, rr As Range, cc As Range
Dim ws As Worksheet, o As Object, oW As Object, s$
Dim fso As Object 'New Scripting.FileSystemObject
'******************* INPUTS **********************************
'p = ThisWorkbook.Path & "\" 'Parent folder
Set ws = Worksheets(1)
ws.[B1] = ThisWorkbook.Path
'Parent folder value
p = ws.[B1]
If Right(p, 1) <> "\" Then p = p & "\"
'List of words to find in DOC files
Set rr = ws.Range("A3", ws.Cells(Rows.Count, "A").End(xlUp))
'******************* END INPUTS ******************************
'On Error GoTo EndSub
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set oW = CreateObject("Word.Application")
oW.DisplayAlerts = 0 'wdAlertsNone
a = aFFs(p & "*.doc", , True)
If Not IsArray(a) Then Exit Sub
d = a 'd will contain only base filename.
Set fso = CreateObject("Scripting.FileSystemObject")
'Array b to hold "x" value if file contains contents of column A.
ReDim b(1 To rr.Cells.Count, 1 To UBound(a) + 1)
z = -1
For Each e In a
Set o = GetObject(e)
With o.Content.Find
j = j + 1 'File counter, column
z = 0 'cell content counter, row
d(z) = fso.GetFile(CStr(e)).Name
For Each cc In rr
z = z + 1
.clearformatting
.Text = cc
.MatchCase = False
.matchwholeword = False
.Execute
If .found Then
b(z, j) = "x"
Else
b(z, j) = ""
End If
Next cc
o.Close False
End With
Next e
'Clear row 2, doc filenames.
ws.Rows(2).ClearContents
'Add base file names starting at B1 and to right.
ws.[B2].Resize(, UBound(a) + 1) = d
'Add array b, x's if found content in DOC files from column A.
ws.[B3].Resize(rr.Cells.Count, UBound(a) + 1) = b
'Fomat columns with filenames
With ws.[B2].Resize(, UBound(a) + 1)
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 90
.EntireColumn.ColumnWidth = 3.35
End With
EndSub:
Set fso = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
'MyDir should end in a "\" character unless searching by wildcards, e.g. "x:\test\t*
'Command line switches for the shell's Dir, http://ss64.com/nt/dir.html
Function aFFs(myDir As String, Optional extraSwitches = "", _
Optional tfSubFolders As Boolean = False) As Variant
Dim s As String, a() As String, v As Variant
Dim b() As Variant, i As Long
If tfSubFolders Then
s = CreateObject("Wscript.Shell").Exec("cmd /c dir " & _
"""" & myDir & """" & " /b /s " & extraSwitches).StdOut.readall
Else
s = CreateObject("Wscript.Shell").Exec("cmd /c dir " & _
"""" & myDir & """" & " /b " & extraSwitches).StdOut.readall
End If
a() = Split(s, vbCrLf)
If UBound(a) = -1 Then
Debug.Print myDir & " not found.", vbCritical, "Macro Ending"
Exit Function
End If
ReDim Preserve a(0 To UBound(a) - 1) As String 'Trim trailing vblfcr
For i = 0 To UBound(a)
If Not tfSubFolders Then
s = Left$(myDir, InStrRev(myDir, "\"))
'add the folder name
a(i) = s & a(i)
End If
Next i
aFFs = sA1dtovA1d(a)
End Function
Function sA1dtovA1d(strArray() As String) As Variant
Dim varArray() As Variant, i As Long
ReDim varArray(LBound(strArray) To UBound(strArray))
For i = LBound(strArray) To UBound(strArray)
varArray(i) = CVar(strArray(i))
Next i
sA1dtovA1d = varArray()
End Function
Obtained from the OzGrid Help Forum.
Solution provided by Kenneth Hobson.
See also: Index to Excel VBA Code and Index to Excel Freebies and Lesson 1 - Excel Fundamentals and Index to how to… providing a range of solutions and Index to new resources and reference sheets
See also:
| How to search for a word inside a workbook and open that sheet as active sheet |
| How to resize word charts/pictures in excel |
| How to reference a cell that contains a word to into a cell that has a sentence |
| How to delete rows containing certain keywords in cells |
| How to add a password to a macro |
Click here to visit our Free 24/7 Excel/VBA Help Forum where there are thousands of posts you can get information from, or you can join the Forum and post your own questions.