简体   繁体   中英

Loop through all sheets to find cells which contain special characters

I have this macro to replace special characters in any sheet in my workbook.

It gets rid of these characters: ! @ # $ % ^ & () /

Sub Macro3()

Dim splChars As String
Dim ch As Variant
Dim splCharArray() As String

splChars = "! @ # $ % ^ & () /" splCharArray = Split(splChars, " ")

For Each ch In splCharArray
    Cells.Replace What:="~" & ch, Replacement:="", LookAt:=xlPart, SearchOrder:= _
      xlByRows, MatchCase:=True
Next ch

End Sub

I need a second macro which would do Cells.Find for every cell in every worksheet then create a new sheet to list all cell addresses and special characters found.

On the web I found:

Public Sub SearchForText()
    Dim rngSearchRange As Range
    Dim vntTextToFind As Variant
    Dim strFirstAddr As String
    Dim lngMatches As Long
    Dim rngFound As Range
  
    On Error GoTo ErrHandler
    vntTextToFind = Application.InputBox( _
      Prompt:="Enter text to find:", _
      Default:="Search...", _
      Type:=2 _
      )
    If VarType(vntTextToFind) = vbBoolean Then Exit Sub
  
    On Error Resume Next
    Set rngSearchRange = Application.InputBox( _
      Prompt:="Enter range for search:", _
      Default:=ActiveCell.Parent.UsedRange.Address, _
      Type:=8 _
      )

    On Error GoTo ErrHandler
    If rngSearchRange Is Nothing Then Exit Sub
    Set rngFound = rngSearchRange.Find( _
      What:=CStr(vntTextToFind), _
      LookIn:=xlValues, _
      LookAt:=xlPart _
      )
  
    If rngFound Is Nothing Then
        MsgBox "No matches were found.", vbInformation
    Else
        With ThisWorkbook.Sheets.Add
            With .Range("A1:B1")
                .Value = Array("Cell", "Value")
                .Font.Bold = True
            End With
            strFirstAddr = rngFound.Address
            Do
                lngMatches = lngMatches + 1
                .Cells(lngMatches + 1, "A").Value = rngFound.Parent.Name & "!" _
                                          & rngFound.Address(0, 0)
                .Cells(lngMatches + 1, "B").Value = rngFound.Value
                Set rngFound = rngSearchRange.FindNext(rngFound)
            Loop Until (rngFound.Address = strFirstAddr)
            .Columns("A:B").AutoFit
        End With
    End If
    Exit Sub
  
ErrHandler:
    MsgBox Err.Description, vbExclamation
End Sub

This code works. My problem is, I need to set a range in which it searches every time and it can only be one sheet, so essentially if I have 10 sheets I need to run this macro 10 times to get the desired result.

I would like to search for each character in every worksheet of my workbook, then create a new sheet and return the address of every cell in an entire workbook which contains any of my declared characters.

I thought I could declare new variable ws as worksheet and loop through all worksheets with the same range selected using for each.

Try this. You just need another loop for the worksheets, and a loop for the Find.

This code doesn't do any replacing.

Sub Macro3()

Dim splChars As String
Dim ch As Variant
Dim splCharArray() As String
Dim r As Range, s As String
Dim ws As Worksheet

splChars = "! @ # $ % ^ & () /"
splCharArray = Split(splChars, " ")

Sheets.Add().Name = "Errors" 'to list characters and location

For Each ch In splCharArray
    For Each ws In Worksheets
        If ws.Name <> "Errors" Then
            Set r = ws.Cells.Find(What:=ch, Lookat:=xlPart, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False)
            If Not r Is Nothing Then
                s = r.Address
                Do
                    Sheets("Errors").Range("A" & Rows.Count).End(xlUp)(2) = ch 'character
                    Sheets("Errors").Range("B" & Rows.Count).End(xlUp)(2) = r.Address(external:=True)
                    Set r = ws.Cells.FindNext(r)
                Loop Until r.Address = s 'loop until we are back to the first found cell
            End If
        End If
    Next ws
Next ch

End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM