Страницы: 1
RSS
VBA как в константу записать значение по условию?
 
Здравствуйте, уважаемые.
Появилась необходимость записать значение в константу по условию, но, похоже, что это извращение и VBA не даёт этого сделать либо делает вопреки моей хотелки. :)))
Приведу примеры, как я пытался это сделать:
так компилятор допускает написать, но всегда возвращает 2

а так компилятор посылает меня лесом
Гуглить пытался, но увы.
И да, про переменные я в курсе, но именно возникла необходимость в константе.
Скорее всего, что моё извращение недопустимо и чтобы не простаивать я пойду другим путём, но было бы не плохо услышать мнение экспертов и светом ваших знаний развеять тьму моего невежества. ;)
Спасибо.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
константа на то и константа, - постоянная... Используйте две (или сколько надо), а по условию, выбирайте, какая нужна.
зы.
А что делает #?
 
Михаил С., спасибо за Ваш совет. Но, увы, мне именно нужно было только в одной константе значение по условию прописать.
Цитата
Михаил С. написал: А что делает #?
Это.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, На эксперта не претендую, но против
Цитата
Михаил С. написал:
константа на то и константа, - постоянная...
ничего не сказать. На самом деле , не думаю что в VBA смысл константы более чем в невозможности изменить значение в процессе работы кода.  Могу допустить, что будет чуть быстрее и оптимальнее , как в случае с компиляторами, но даже там основной упор в удобстве и исключении ошибок в дальнейшем. Даже в документации:
Note Constants can make your programs self-documenting and easy to modify. Unlike variables, constants can't be inadvertently changed while your program is running.
Цитата
JayBhagavan написал:
но именно возникла необходимость в константе
- просто интересно , в чем эта необходимость?
По вопросам из тем форума, личку не читаю.
 
JayBhagavan,
Код
Sub const_by_condition1()
#Const tfFlag = True
    #If tfFlag = True Then
        Const Const1 As Long = 1
    #Else
        Const Const1 As Long = 2
    #End If
    Debug.Print Const1
End Sub
 
Казанский, спасибо за Ваше участие в данной теме. Но такой подход равносилен ручному изменению значения константы, если я ничего не путаю.
То есть tfFlag - должна быть переменной.
Но, всё одно, я Вам благодарен за участие.

БМВ, спасибо за Ваше участие. Скажем так, так мне было бы проще, но я могу сделать иначе, о чём сообщил сразу же. Пример приведу позже.

Акцентирую внимание. Мне нужно понимать можно ли так сделать:
условие - обязательно переменная;
объявить константу обязательно по условию.
Если да, то как именно?
Если нет - так нет, но хотелось бы с объяснением, чтобы понять и осознать.
Спасибо.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Псевдонаука.
Здесь имеем два значения слова "константа" - неизменяемое значение в процедуре (Const) и постоянное значение (число, текст)
Код
Const i As Long = 25
Dim i As Long: i = 25

В двух показанных случаях имеем константу 25. Ведь если в дальнейшем переменная i не меняется - она константа!
Но если в первом варианте это неизменяемая переменная (такое вот определение родилось), то во втором строке переменной можно присвоить другую константу (другое постоянное значение)
Вывод: если в коде значение  нужно менять (еще одно определение - временная константа :) ), используем Dim, если нет - Const (заодно не допустим возможность случайных изменений). И вряд ли редактор VBA будет в восторге от того, что его пытаются обмануть.

Во накрутил, философ (авторство определений надо бы зарегистрировать, а то ведь уведут) :)
Ну и где-то слышал (видел, читал?), что Const обрабатывается быстрее (информация может быть ошибочной).
 
Возвращаемся к #1. Записываем так:
Код
Sub const_by_condition1()
    #If tfFlag = 1 Then
        Const Const1 As Long = 1
    #Else
        Const Const1 As Long = 2
    #End If
    Debug.Print Const1
End Sub

Возвращается, естественно, 2.
Теперь заходим в свойства проекта (Tools/VBAProject Properties) и в окно "Conditional Compilation Arguments" заносим:
Код
tfFlag = 1

Запускаем макрос - чудо свершилось!
Последующие эксперименты полезно провести самостоятельно.
Владимир
 
Простите, что снова вмешиваюсь, но константа в отличии от переменной интерпретатором или компилятором  заменяется на указанное значение равносильно замене в коде Const1 на  1 или 2  в зависимости от того что определено для этой константы и  именно определено, а не присвоено. Это происходит перед исполнением кода а не каждый раз. Я б это сравнил скорее с синонимом (Alias) , чем с названием переменной.
Изменено: БМВ - 10.11.2018 14:05:42
По вопросам из тем форума, личку не читаю.
 
константа, способная получать разные значения в зависимости от условий - ведет себя как типичная переменная
я бы предложил остановиться на этом
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Здравствуйте, коллеги! Я просто проиллюстрировал возможности условной компиляции. В больших проектах этот инструмент может пригодиться.
Владимир
 
vikttur, спасибо за Ваше участие в теме. Попробую осмыслить.
sokol92, спасибо за предложенный Вами вариант, но, увы, в данном варианте в качестве условия константа.
Цитата
JayBhagavan написал: условие - обязательно переменная;

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1
Наверх