#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)
.