#excel #vba #loops #label
#excel #vba #циклы #метка
Вопрос:
Я назвал столбцы в своей книге Excel. Затем я написал скрипт VBA для анализа данных, и я начинаю с маркировки именованных столбцов (Game, Hole и Dte в примере 1 ниже). Затем я запускаю цикл for и if для данных. Когда я запускаю цикл в главном подразделении, как в примере 1, он работает нормально. Однако, когда я запускаю цикл в своем собственном подразделе (пример 2 ниже) Я получаю «определяемую приложением или объектом ошибку», потому что он не распознает «Дыру» в моем столбце. Столбец ‘Hole’ является шестым в таблице Excel, поэтому, когда я изменяю код в примере 2, чтобы ссылаться на » If Sheets («37 раундов в стопке»).Ячейки (i, 6) < 4 » тогда это работает, поэтому, очевидно, я теряю маркировку столбца, когда у меня есть цикл в подразделе, где я не определяю столбцы.
Кто-нибудь может помочь мне понять, почему и как это исправить?
Пример 1:
Sub DRVE()
Game = Range("Round").Column
Hole = Range("Hole").Column
Dte = Range("Date").Column
Dim x As Long
x = 0
For i = 2 To 739
If Sheets("37 Rounds Stacked").Cells(i, Hole) < 4 Then
x = x 1
End If
Next i
End Sub
Пример 2:
Sub DRVE()
Game = Range("Round").Column
Hole = Range("Hole").Column
Dte = Range("Date").Column
End Sub
Sub DRVE2()
Dim x As Long
x = 0
For i = 2 To 739
If Sheets("37 Rounds Stacked").Cells(i, Hole) < 4 Then
x = x 1
End If
Next i
End Sub
Комментарии:
1. Это проблема области видимости.
DRVE2
ничего не знает оHole
inDRVE
. Возможно, вы захотите начать с чтения этого . Вы также должны добавитьOption Explicit
в начало модуля и объявить все переменные.2. @BigBen большое спасибо, я прочитал это, добавил опцию Explicit и объявил отверстие как строку в самом начале модуля. У меня это все равно не сработало, а затем я даже попытался изменить код в примере 2 на следующий и все равно получил ту же ошибку. Опять же, это работает, если я использую 6 вместо отверстия. Это как-то связано с использованием переменной в качестве идентификатора столбца? Код изменен на:
Dim x As Long Dim i As Long Dim Hole As String Hole = Range("Hole").Column x = 0 For i = 2 To 738 If Sheets("37 Rounds Stacked").Cells(i, Hole) < 18 Then x = x 1 End If Next i
3. Какое значение в немедленном окне, если вы
Debug.Print Hole
перед попыткой его использовать? Кроме того,Hole
должен быть aLong
.4. @BigBen большое спасибо за помощь. Когда я меняю его на Dim Hole as Long в самом начале модуля, он работает отлично. Значение в немедленном окне было 6, что, я думаю, вы ожидали (или надеялись!). Есть идеи, почему это не сработало, когда я определил его как String?
5. Потому что вы передавали ему строку, которая выглядела как число, а не фактическое число.