разобрался сам, подскажи другому
вот ооочень простой пример на котором можно увидеть разницу в использовании решеток
#вкратце - с решетками предкомпиляция (если правильно назвал) выполняется не во всех блоках программы, а только "по ходу выполнения программы" на развилках условных операторов следуя только по линии где выполняется условие, если непонятно, читаем дальше, написал до тошноты подробно. Рассмотрим на примере, нам понадобится какая-нибудь ошибка о которую будет спотыкаться компилятор, в нашем примере мы будем использовать Option Explicit и не объявленную переменную. Строка -
Option Explicit - в частности требует, чтобы все переменные, которые используются в коде, были объявлены (Dim b as integer) но мы специально не объявляем b, из-за этого, если мы попытаемся запустить наш первый вариант, то он не сработает, а компилятор остановится на строке b=2, хотя очевидно, что условие
if "пробежит" по ветке ИСТИНА, (т.е. там где
а=1), а блок
else (там где b=2 ) выполнен не будет, и некоторые спросят - а каким образом "вылезла" ошибка, если в процессе выполнения кода мы никогда не попадем в то место где у нас есть ошибка? Дело в том, что VBA перед нашим запуском выполнил компиляцию нашего кода, т.е. пробежал по коду (причем по всем веткам, независимо от выполнения условия) и нашел (или не нашел) ошибки. В нашем случае он нашел не объявленную переменную. Во втором случае мы использовали решетки, которые указывают, что предварительную компиляцию следует выполнять только по пути выполнения программы игнорируя остальные ветки. Во втором примере наша ошибка находится в ветке куда программа не зайдет, поэтому компилятор пропустит ее и программа выполнится без проблем, хотя там есть ошибка, но она находится в ветке куда код "не заходил", но стоит нам "подложить" ошибку компилятору "под ноги" и он "споткнется". например поменяем знак больше на меньше (вариант3), что "повернет" ход выполнения программы в ветку else.
вариант1, остановится на строке b=1? т.к. она не объявлена
Код |
---|
Option Explicit
Sub test1()
Dim a As Integer
If 1 > 0 Then
a = 1
Else
b = 2
End If
MsgBox a
End Sub |
вариант2, выполнится и появится msgbox с цифрой 1
Код |
---|
Option Explicit
Sub test2()
Dim a As Integer
#If 1 > 0 Then
a = 1
#Else
b = 2
#End If
MsgBox a
End Sub
|
пример3, споткнется на строке b=2
Код |
---|
Option Explicit
Sub test2()
Dim a As Integer
#If 1 < 0 Then
a = 1
#Else
b = 2
#End If
MsgBox a
End Sub |