VBA Excel - невозможно использовать эту команду при перекрывающихся выборках - PullRequest
0 голосов
/ 19 апреля 2019

Мой код работает, но он выделяет мою последнюю строку кода и говорит: «Ошибка времени выполнения« 1004 »: невозможно использовать эту команду при перекрывающихся выборках».

Я пробовал несколько различныхизменения, которые я нашел в Интернете, но не могу исправить ошибку.

Sub Delete_EEE()

Dim Wrds As Variant, Gwrds As Variant, i As Long, Fnd As Range, fAdr As String

Gwrds = Array("jan", "m123", "06014", "06015", "06016", "t49", "m39", "cwr", "rnc", "d55", "rer", "rlr", "rwr", "M55", "5962")

Wrds = Array("ohm", "resistor", "semiconductor", "MCKT", "MICKT", "microcircuit", "inductor", "xfmr", "eeprom", "oscillator")

'Application.ScreenUpdating = False

For i = LBound(Gwrds) To UBound(Gwrds)
    Set Fnd = Range("G:G").Find(Gwrds(i), , , xlPart, , , False)
    If Not Fnd Is Nothing Then
        fAdr = Fnd.Address
        Fnd.Value = "#N/A"
        Do
            Set Fnd = Range("G:G").FindNext(Fnd)
            If Fnd Is Nothing Then Exit Do
            If Fnd.Address = fAdr Then Exit Do
            Fnd.Value = "#N/A"
        Loop
    End If
Next i

For i = LBound(Wrds) To UBound(Wrds)
    Set Fnd = Range("E:E").Find(Wrds(i), , , xlPart, , , False)
    If Not Fnd Is Nothing Then
        fAdr = Fnd.Address
        Fnd.Value = "#N/A"
        Do
            Set Fnd = Range("E:E").FindNext(Fnd)
            If Fnd Is Nothing Then Exit Do
            If Fnd.Address = fAdr Then Exit Do
            Fnd.Value = "#N/A"
        Loop
    End If
    Set Fnd = Range("I:I").Find(Wrds(i), , , xlPart, , , False)
    If Not Fnd Is Nothing Then
        fAdr = Fnd.Address
        Fnd.Value = "#N/A"
        Do
            Set Fnd = Range("I:I").FindNext(Fnd)
            If Fnd Is Nothing Then Exit Do
            If Fnd.Address = fAdr Then Exit Do
            Fnd.Value = "#N/A"
        Loop
    End If
Next i

Range("E:I").SpecialCells(xlCellTypeConstants, xlErrors).EntireRow.Delete

'Application.ScreenUpdating = True

End Sub

1 Ответ

1 голос
/ 19 апреля 2019

Проблема, с которой вы столкнулись - Range.Areas. В вашем случае функция .SpecialCells создала число Areas, и одна или несколько из этих областей перекрываются. Например, если в какой-либо из ваших строк произошла ошибка в более чем одном столбце, у вас будут перекрывающиеся области (т. Е. Две или более областей, каждая из которых содержит одну и ту же строку). Вы не можете запустить метод Delete в перекрывающихся областях.

Есть много способов решить эту проблему, но простой однострочник будет Intersect ячейками листа с вашим диапазоном. Такого рода принуждает Excel удалить наложения.

Итак, ваша последняя строка может быть просто:

Intersect(Sheet1.Cells, Sheet1.Range("E:I").SpecialCells(xlCellTypeConstants, xlErrors).EntireRow).Delete

Вы заметите, что я уточнил диапазоны, используя объект листа. Возможно, вы захотите следовать этому протоколу, так как он предотвращает непреднамеренный запуск кода на неправильном рабочем листе.

Кстати, если вас интересуют только столбцы "E" и "I", тогда ваше определение диапазона будет следующим:

Intersect(Sheet1.Cells, Sheet1.Range("E:E,I:I").SpecialCells(xlCellTypeConstants, xlErrors).EntireRow).Delete
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...