Страницы: 1
RSS
Решетка "#" в коде, что значит?
 
встретил кое-что, чего не видел до этого:
Код
#If VBA7 Then
'код
#Else
'код
#End If
Что значат решетки и как работает, нигде не нашел
Помогли? отпишись, а то мы же волнуемся )))
 
Это нужно для API функций. В разных версиях Excel'я разный синтаксис у API функций. В синтаксисе API функции могут использоваться слова, которых может не быть в какой-то версии Excel'я. При запуске макроса, макрос увидит незнакомые слова и выдаст ошибку. Чтобы можно было записывать слова, неизвестные какой-то версии Excel'я, и используются решетки.
#If VBA7 означает версию 2010 и более новую. Соответственно для версии 2010 и более новых один синтаксис API функций, для остальных версий другой.
 
Не обязательно для API функций. Вы можете менять части своего кода в зависимости от каких-то условий, например код для 2003/код для 2007 или стабильная версия/бета версия.
F1 - Understanding Conditional Compilation, #If...Then...#Else Directive, #Const Directive
В общем, как обычно в VBA - поставьте курсор в незнакомое слово и нажмите F1 :)
Изменено: Казанский - 11.11.2016 18:31:02
 
Казанский, со справкой не догадался  :oops:  смешно, но как то вылетело..... ладно, спасибо, дальше сам
Помогли? отпишись, а то мы же волнуемся )))
 
guzen_pilot, я сейчас посмотрел справку, в ней нет описания для Вашего вопроса, а именно для VBA7, поэтому справка Вам бы не помогла. Думаю, что в гугле можно было бы найти информацию.
И фраза из справки "Условно компилирует выбранные блоки кода Visual Basic" вряд ли раскрывает смысл этого. Я бы не понял, о чем речь. Вот если бы был понятный пример, то была бы польза от справки.
Изменено: Karataev - 11.11.2016 18:46:10
 
Karataev, VBA7 по стольку, по скольку попал, меня интересовали решетки, справки хватило чтобы уловить смысл, еще раз спасибо  :)
Помогли? отпишись, а то мы же волнуемся )))
 
разобрался сам, подскажи другому :) вот ооочень простой пример на котором можно увидеть разницу в использовании решеток #
вкратце - с решетками предкомпиляция (если правильно назвал) выполняется не во всех блоках программы, а только "по ходу выполнения программы" на развилках условных операторов следуя только по линии где выполняется условие, если непонятно, читаем дальше, написал до тошноты подробно. Рассмотрим на примере, нам понадобится какая-нибудь ошибка о которую будет спотыкаться компилятор, в нашем примере мы будем использовать 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
Изменено: guzen_pilot - 12.11.2016 00:34:18
Помогли? отпишись, а то мы же волнуемся )))
Страницы: 1
Наверх