Excel VBA метод ‘диапазон’ объекта’_global ‘ ошибка 1004

I can’t for the life of my figure out why i’m getting»‘ Range’ of object’_global ‘failed» on my do while statement. Это похоже на то, что диапазон с именем RC3 не распознается. Любая помощь очень ценится.

Sub DeleteBlankRows()

Dim Allrws As Range
Dim Rws As Range
Dim RC2 As Range
Dim RC3 As Range
Dim I As Integer
Dim CopyRange As Range
Dim LastRow As Long

With Application

'.ScreenUpdating = False ' don't spam the interface with selections

    With ActiveSheet

        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row ' Put the number of the last row in LastRow

    End With

    Set Allrws = Range("A2:S" & CStr(LastRow))  ' set range to be observed

    For Each Rws In Allrws.Rows   ' for each row in the range of Allrws call it Rws and do the following with it

        Set RC2 = Rws.Offset(0, 3).Resize(1, 1)      ' move and resize the range of RC2 to include only the cell under column D
        Set RC3 = Rws.Offset(0, 7).Resize(1, 1)      ' move and resize the range of RC3 to include only the cell under column I        
        I = 0   ' initilize the rows deleted counter

            Do While (Range(RC3).Value <> "" And I < 30)    ' as long as RC points to a empty cell and we haven't removed more then 30 rows keep removing rows                                                             

                If (range(RC2).Value = "Permit & Design" Or range(RC2).Value = "Miscellanious") Then 'don't delete row if Permit & Design or Miscellanious is in the cell under column D

                  I = 30        ' escape the loop if true

                Else

                  Selection.EntireRow.Delete      ' delete the selected row if false

                  I = I + 1                       ' add 1 to the counter

                End If        

            Loop                                   ' Go back to the start of the Do While

    Next Rws                    ' go back to the For Each and put the next row in Rws

    .ScreenUpdating = True      ' now update the interface with the changes

end with

end sub

1 ответ

  1. Do While (Range(RC3).Value <> "" And I < 30)
    

    RC3 является Rangeобъектом . То, что Range(SomeRangeObject)делает, действительноRange(SomeRangeObject.Value), поэтому, если RC3.Valueне содержит допустимую строку адреса диапазона, этот безусловный Rangeвызов взорвется.

    Примечание без оговорок: ваш код неявно работает ActiveSheet:

    Set Allrws = Range("A2:S" & CStr(LastRow))
    

    Всякий Rangeраз, когда используется , как это, это неявно делаетActiveSheet.Range, через _Globalскрытый модуль.

    БезусловныеRange,Cells,Rows, Columnsи Namesзвонки все неявно ссылаются наActiveSheet, и непонимание этого факта является причиной каждого «связанного» вопроса в боковой панели (те, которые я проверил в любом случае), и есть еще тысячи того же самого на этом сайте: это чрезвычайно распространенный источник ошибок. Таким образом, квалифицировать вызовы членов рабочего листа и избежать проблем.

    Ваш код работает (ну, учитывая вышеуказанную модификацию). Если With ActiveSheetбы блок был изменен наWith Sheet12, вы бы начали видеть проблемы, вытекающие из всех неквалифицированных Rangeвызовов.