2

我正在使用在上一个问题中得到帮助的代码:(VBA Excel 查找和替换而不替换已替换的项目

我有以下代码用于替换列中的项目:Sub Replace_Once() Application.ScreenUpdating = False

LastRow = Range("A" & Rows.Count).End(xlUp).Row
Range("A1:A" & LastRow).Interior.ColorIndex = xlNone
    For Each Cel In Range("B1:B" & LastRow)
        For Each C In Range("A1:A" & LastRow)
            If C.Value = Cel.Value And C.Interior.Color <> RGB(200, 200, 200) Then
            C.Interior.Color = RGB(200, 200, 200)
            C.Value = Cel.Offset(0, 1).Value
        End If
    Next
Next

这适用于小文件,但是当 A 列的长度接近 3800 并且 B 和 C 大约有 280 次 Excel 崩溃时,我收到以下错误:

运行时错误'-2147417848(800810108)':

对象“内部”的方法“颜色”失败

任何想法为什么会发生这种情况?

编辑:只是为了澄清错误似乎发生在该行

If C.Value = Cel.Value And C.Interior.Color = RGB(200, 200, 200) Then
4

1 回答 1

2

我对你的代码做了一些优化。

  1. 声明变量/对象
  2. 减少你的循环时间。早些时候,您的代码是循环201924100时间(14210 Col A Rows X 14210 Col B Rows)。您不必这样做,因为从前B236是空的。现在循环只运行3339350几次。(14210 列 A 行 X 235 列 B 行
  3. 整个代码在1 Min 53 Seconds. 见Output in Immediate window文末。

试试这个。这对我有用。在 Excel 2013 中对其进行了测试。

Sub Replace()
    Dim ws As Worksheet
    Dim A_LRow As Long, B_LRow As Long
    Dim i As Long, j As Long

    Application.ScreenUpdating = False

    Debug.Print "process started at " & Now

    Set ws = ThisWorkbook.Sheets("Sheet1")

    With ws
        '~~> Get Col A Last Row
        A_LRow = .Range("A" & .Rows.Count).End(xlUp).Row
        '~~> Get Col B Last Row
        B_LRow = .Range("B" & .Rows.Count).End(xlUp).Row

        .Range("A1:A" & A_LRow).Interior.ColorIndex = xlNone

        For i = 2 To B_LRow
            For j = 2 To A_LRow
                If .Range("A" & j).Value = .Range("B" & i).Value And _
                .Range("A" & j).Interior.Color <> RGB(200, 200, 200) Then
                    .Range("A" & j).Interior.Color = RGB(200, 200, 200)
                    .Range("A" & j).Value = .Range("B" & i).Offset(0, 1).Value
                    DoEvents
                End If
            Next j
        Next i
    End With

    Application.ScreenUpdating = True

    Debug.Print "process ended at " & Now
End Sub

在立即窗口中输出

process started at 10/18/2013 6:29:55 AM
process ended at 10/18/2013 6:31:48 AM
于 2013-10-18T01:22:44.907 回答