Ошибка во время выполнения «1004»: Метод «Диапазон» объекта «_Global» не удалось решить проблему с (Диапазон(активная ячейка).Смещение(-10, 1).Выберите)

#excel #vba #offset

Вопрос:

Я пытаюсь создать код vba для excel, который скрывает столбец, если ячейки пусты для 10 прогрессивных ячеек, прежде чем перейти к следующему столбцу, начиная с ячейки m9. Однако у меня возникли проблемы с решением этого сообщения об ошибке. Я новичок в VBA, поэтому не знаю, как поступить. Любая помощь была бы очень признательна. Спасибо.

 Sub HideColumns()
' Assumed if empty cell for 10 progressive cells in the same column, then is empty
' for the entirety of the test

' Our tests start at cell M9, so we will use a conditional loop to use the offset
' method on the range object from there
    StartCell = ActiveSheet.Range("M9").Select
    For i = 1 To 10
        If IsEmpty(ActiveCell.Value) = True Then
            Range(ActiveCell).Offset(i).Select
        ElseIf IsEmpty(ActiveCell.Value) = False Then
            Exit For
        End If
    Next i
    
    If i = 10 Then
            HiddenColoumn = ActiveCell.Column
            Columns("HiddenColoumn:HiddenColoumn").Select
            Selection.EntireColumn.Hidden = True ' now the column is hidden as there is no data for 10 progressive cells
            Range(ActiveCell).Offset(-10, 1).Select
            i = 1 ' reset counter for next loop
    ElseIf i <> 10 Then
            Range(ActiveCell).Offset(-10, 1).Select
            i = 1 ' reset counter for next loop
    End If
       
 

Комментарии:

1. Если i=10, то смещение -10 будет равно нулю, которого не существует

2. Аналогичная проблема возникла бы для ElseIf того, как если i=<10 бы вы компенсировали отрицательное число.

Ответ №1:

Первое: Ничего не выбирайте. Вы можете обратиться к любой ячейке или диапазону, просто указав ее адрес. Во-вторых: задача состоит не в том, чтобы проверить, пусты ли первые 10 ячеек, а в том, есть ли в столбце 10 последовательных пустых ячеек. Что делать, если M9:M10 и M16 имеют значения, но все остальные ячейки пусты? Тогда было бы важно знать, сколько строк на листе, потому что, глядя только на один столбец, вы не можете знать, являются ли 10 ячеек пустыми (внутри листа) или нет (под листом).

Таким образом, вы приходите к другой стратегии кодирования.

 Sub HideColumns()
    ' 257
    ' Assumed if empty cell for 10 progressive cells in the same column, then is empty
    ' for the entirety of the test
    
    Dim Blank           As Integer              ' count blank cells
    Dim Cl              As Long                 ' last used column in the sheet
    Dim Rl              As Long                 ' last used row in the sheet
    Dim C               As Long                 ' loop counter: columns
    Dim R               As Long                 ' loop counter: rows
    
    With Worksheets("Sheet1")                   ' better (meaning safer!) than 'ActiveSheet'
        With .UsedRange
            Cl = .Columns.Count   .Column - 1
            Rl = .Rows.Count   .Row - 1
        End With
        
        ' Our tests start at cell M9,
        For C = .Columns("M").Column To Cl
            Blank = 0
            For R = 9 To Rl
                If .Cells(R, C).Value = "" Then
                    Blank = Blank   1
                    If Blank > 9 Then Exit For
                Else
                    Blank = 0
                End If
            Next R
            .Columns(C).Hidden = (Blank = 10)
        Next C
    End With
End Sub
 

Комментарии:

1. Спасибо за вашу помощь! Если бы я хотел выйти из цикла, как только он достигнет столбца AB, использовал бы я условный оператор для разрыва цикла?

2. Вы могли бы сделать это, или вы могли бы просто установить Cl = 28 или Cl = WorksheetFunction.Max(.Columns.Count .Column - 1, 28) .