View Single Post
 
Old 01-06-2016, 12:13 AM
macropod's Avatar
macropod macropod is offline Windows 7 64bit Office 2010 32bit
Administrator
 
Join Date: Dec 2010
Location: Canberra, Australia
Posts: 22,467
macropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond reputemacropod has a reputation beyond repute
Default

Once you start getting into variable Find/Replace parameters that might include wildcards and formatting, you should consider having a separate column for each of them. In that case, rather than using a Word table, I'd be inclined to use an Excel workbook. The following macro is designed around such an approach, with the:
• Find expression in Column A
• Replace expression in Column B
• Wildcard switch in Column C
• Format switch in Column D
• Find font formats in columns E-H
• Replace font formats in columns I-L
If the Format switch in Column D isn't set, none of the Find & Replace font formats will take effect.
Code:
Sub BulkFindReplaceWithParameters()
Application.ScreenUpdating = True
Dim xlApp As Object, xlWkBk As Object, StrWkBkNm As String, StrWkSht As String
Dim bStrt As Boolean, iDataRow As Long, bFound As Boolean, i As Long
Dim xlFExpr, xlRExpr, xlFWild, xlFFrmt, xlFBold, xlFItal, xlFUnln, xlFPnts, xlRBold, xlRItal, xlRUnln, xlRPnts
StrWkBkNm = "C:\Users\" & Environ("Username") & "\Documents\BulkFindReplace.xls"
StrWkSht = "Sheet1"
If Dir(StrWkBkNm) = "" Then
  MsgBox "Cannot find the designated workbook: " & StrWkBkNm, vbExclamation
  Exit Sub
End If
' Test whether Excel is already running.
On Error Resume Next
bStrt = False ' Flag to record if we start Excel, so we can close it later.
Set xlApp = GetObject(, "Excel.Application")
'Start Excel if it isn't running
If xlApp Is Nothing Then
  Set xlApp = CreateObject("Excel.Application")
  If xlApp Is Nothing Then
    MsgBox "Can't start Excel.", vbExclamation
    Exit Sub
  End If
  ' Record that we've started Excel.
  bStrt = True
End If
On Error GoTo 0
'Check if the workbook is open.
bFound = False
With xlApp
  'Hide our Excel session
  If bStrt = True Then .Visible = False
  For Each xlWkBk In .Workbooks
    If xlWkBk.FullName = StrWkBkNm Then ' It's open
      Set xlWkBk = xlWkBk
      bFound = True
      Exit For
    End If
  Next
  ' If not open by the current user.
  If bFound = False Then
    ' Check if another user has it open.
    If IsFileLocked(StrWkBkNm) = True Then
      ' Report and exit if true
      MsgBox "The Excel workbook is in use." & vbCr & "Please try again later.", vbExclamation, "File in use"
      If bStrt = True Then .Quit
      Exit Sub
    End If
    ' The file is available, so open it.
    Set xlWkBk = .Workbooks.Open(FileName:=StrWkBkNm)
    If xlWkBk Is Nothing Then
      MsgBox "Cannot open:" & vbCr & StrWkBkNm, vbExclamation
      If bStrt = True Then .Quit
      Exit Sub
    End If
  End If
  ' Process the workbook.
  With xlWkBk
      With .Worksheets(StrWkShtNm)
      ' Find the last-used row in column A.
      ' Add 1 to get the next row for data-entry.
      iDataRow = .Cells(.Rows.Count, 1).End(-4162).Row ' -4162 = xlUp
      ' Get the Find/Replace parameters.
      For i = 2 To iDataRow
        ' Skip over empty fields to preserve the underlying cell contents.
        If Trim(.Range("A" & i)) <> vbNullString Then
          xlFExpr = xlFExpr & "|" & Trim(.Range("A" & i))
          xlRExpr = xlRExpr & "|" & Trim(.Range("B" & i))
          xlFWild = xlFWild & "|" & Trim(.Range("C" & i))
          xlFFrmt = xlFFrmt & "|" & Trim(.Range("D" & i))
          xlFBold = xlFBold & "|" & Trim(.Range("E" & i))
          xlFItal = xlFItal & "|" & Trim(.Range("F" & i))
          xlFUnln = xlFUnln & "|" & Trim(.Range("G" & i))
          xlFPnts = xlFPnts & "|" & Trim(.Range("H" & i))
          xlRBold = xlRBold & "|" & Trim(.Range("I" & i))
          xlRItal = xlRItal & "|" & Trim(.Range("J" & i))
          xlRUnln = xlRUnln & "|" & Trim(.Range("K" & i))
          xlRPnts = xlRPnts & "|" & Trim(.Range("L" & i))
        End If
      Next
    End With
    If bFound = False Then xlWkBk.Close False
    If bStrt = True Then .Quit
End With
' Release Excel object memory
Set xlWkBk = Nothing: Set xlApp = Nothing
'Process each word from the F/R List
For i = 1 To UBound(Split(xlFExpr, "|"))
  With ActiveDocument.Range
    With .Find
      .ClearFormatting
      .Replacement.ClearFormatting
      .Format = CBool(Split(xlFFrmt, "|")(i))
      .MatchWildcards = False
      .MatchWholeWord = True
      .MatchCase = True
      If CBool(Split(xlFWild, "|")(i)) = True Then
        .MatchWildcards = True
        .MatchWholeWord = False
        .MatchCase = False
      End If
      With .Font
        If Split(xlFBold, "|")(i) <> "" Then .Bold = CBool(Split(xlFBold, "|")(i))
        If Split(xlFItal, "|")(i) <> "" Then .Italic = CBool(Split(xlFItal, "|")(i))
        If Split(xlFUnln, "|")(i) <> "" Then .Underline = CBool(Split(xlFUnln, "|")(i))
        If Split(xlFPnts, "|")(i) <> "" Then .Size = Split(xlFPnts, "|")(i)
      End With
      With .Replacement.Font
        If Split(xlRBold, "|")(i) <> "" Then .Bold = CBool(Split(xlRBold, "|")(i))
        If Split(xlRItal, "|")(i) <> "" Then .Italic = CBool(Split(xlRItal, "|")(i))
        If Split(xlRUnln, "|")(i) <> "" Then .Underline = CBool(Split(xlRUnln, "|")(i))
        If Split(xlRPnts, "|")(i) <> "" Then .Size = Split(xlRPnts, "|")(i)
      End With
      .Wrap = wdFindContinue
      .Text = Split(xlFExpr, "|")(i)
      .Replacement.Text = Split(xlRExpr, "|")(i)
      .Execute Replace:=wdReplaceAll
    End With
  End With
Next
ErrExit:
Application.ScreenUpdating = True
End Sub
 
Function IsFileLocked(strFileName As String) As Boolean
  On Error Resume Next
  Open strFileName For Binary Access Read Write Lock Read Write As #1
  Close #1
  IsFileLocked = Err.Number
  Err.Clear
End Function
__________________
Cheers,
Paul Edstein
[Fmr MS MVP - Word]
Reply With Quote