查找和替换不断崩溃

时间:2017-12-03 22:40:34

标签: excel vba excel-vba replace find

我使用的是查找和替换,简单的VBA代码,如下所示:

Sub MultiFindNReplace()
'Update 20140722
Dim Rng As Range
Dim InputRng As Range, ReplaceRng As Range
xTitleId = "KutoolsforExcel"
Set InputRng = Application.Selection
Set InputRng = Application.InputBox("Original Range ", xTitleId, 
InputRng.Address, Type:=8)
Set ReplaceRng = Application.InputBox("Replace Range :", xTitleId, Type:=8)
Application.ScreenUpdating = False
For Each Rng In ReplaceRng.Columns(1).Cells
InputRng.Replace what:=Rng.Value, replacement:=Rng.Offset(0, 1).Value
Next
Application.ScreenUpdating = True
End Sub

但是,数据集超过685,000个值,这会使我的Excel文档崩溃。我已经尝试过使用错误捕获和其他方法来查找和替换。

两列都在sheet2中。要更换的列是第10列,列和替换在第17和18列中。

数据看起来像这样

银行时间 银行时间 转换后的分数

999               999                 5
5                 1                   4
27                2                   4
3                 3                   2
...               ...                 ...
999               207                 1.3

希望用第2列中每个第2列的转换得分(第3列)替换所有包含686950个条目的第一列,其中包含80个不同月度条目的银行时间。

1 个答案:

答案 0 :(得分:0)

您可能有一个基于替换hte工作表中的值的计算周期。这可能是由于在任何打开的工作簿中引用inputRng中的一个或多个单元格或易失性公式(例如,INDIRECT,ADDRESS,TODAY,NOW等)的先例公式。您可能还在工作表的代码表(例如Worksheet_Change等)或工作簿的代码页(例如Workbook_SheetChange等)中包含依赖于事件的代码。

在关闭屏幕更新的同时关闭计算并禁用事件。

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

'... all of the processing code

Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

您的子程序也可能受益于在记忆中工作'并且在执行所有替换后替换值 en masse 。使用以下方法,我在i5 Surface Pro上的效率提高了约30%。

Option Explicit

Sub multiFindNReplace2()
    Dim rng As Variant, xTitleId As String, r As Long
    Dim dataRng As Variant, mtch As Variant, inputRng As Range, replaceRng As Range

    xTitleId = "KutoolsforExcel"
    Set inputRng = Application.InputBox(PROMPT:="Original Range:", Title:=xTitleId, Default:=Selection.Address, Type:=8)
    rng = Application.InputBox(PROMPT:="Replacement Range:", Title:=xTitleId, Default:="$M$2:$N$81", Type:=8).Value2
    dataRng = inputRng.Value2


    Debug.Print Timer
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    For r = LBound(rng, 1) To UBound(rng, 1)
        mtch = Application.Match(rng(r, 1), dataRng, 0)
        Do While Not IsError(mtch)
            dataRng(mtch, 1) = rng(r, 2)
            mtch = Application.Match(rng(r, 1), dataRng, 0)
        Loop
    Next r

    inputRng.Resize(UBound(dataRng, 1), UBound(dataRng, 2)) = dataRng

    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Debug.Print Timer

End Sub