在整个工作簿中查找和替换

时间:2021-06-16 09:12:48

标签: excel vba

我使用这个函数来查找和替换整个工作簿中的字符串。

但我不知道为什么 "run time error: Object variable or with block variable not set" 上会出现错误 rngCheck = Me.Range("A2:A37")

我尝试了很多来找到问题,但没有找到您的帮助将不胜感激。

Sub FndRplce(fnd As String, rplc As String)

Dim sht As Worksheet
Dim boolStatus As Boolean

boolStatus = Application.ScreenUpdating
Application.ScreenUpdating = False

For Each sht In ActiveWorkbook.Worksheets

sht.Cells.Replace what:=fnd, Replacement:=rplc, _
LookAt:=xlPart, LookIn:=xlValues, MatchCase:=False, _
SearchFormat:=False, ReplaceFormat:=False

Next sht
Application.ScreenUpdating = boolStatus

End Sub




Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngCheck As Range
Dim strOld As String
Dim strNew As String

rngCheck = Me.Range("A2:A37")

If Target.Count > 1 Then Exit Sub

If Intersect(Target, rngCheck) Is Nothing Then Exit Sub

Application.ScreenUpdating = False
Application.EnableEvents = False

strNew = Target.Value

Application.Undo
strOld = Target.Value

Call FndRplce(strOld, strNew)

Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

1 个答案:

答案 0 :(得分:1)

请尝试下一段代码:

1.在Sheet1代码模块中复制这个:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rngCheck As Range, strOld As String, strNew As String, lastR As Long

    'Now, it calculates the last existing value in column "A:A":
    'no need to adapt the code after adding records
    lastR = Me.Range("A" & Me.Rows.Count).End(xlUp).Row
    Set rngCheck = Me.Range("A2:A" & lastR)
    
    If Target.Count > 1 Then Exit Sub

    If Intersect(Target, rngCheck) Is Nothing Then Exit Sub
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    strNew = Target.Value

    Application.Undo:  strOld = Target.Value

    Call FndRplce(strOld, strNew)
    
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
  1. 复制标准模块中的下一个 Sub。但请注意删除现有的同名...
Sub FndRplce(fnd As String, rplc As String)
    Dim sht As Worksheet, boolStatus As Boolean

    boolStatus = Application.ScreenUpdating
    Application.ScreenUpdating = False
    
    For Each sht In ActiveWorkbook.Worksheets
        sht.Cells.Replace what:=fnd, Replacement:=rplc, _
            LookAt:=xlPart, MatchCase:=False, _
            SearchFormat:=False, ReplaceFormat:=False
    Next sht
    Application.ScreenUpdating = boolStatus
End Sub

请测试并发送一些反馈。