Нулевые значения для переменных в VBA

#ms-access #vba

#ms-access #vba

Вопрос:

Как мне определить нулевую строку, дату или целое число в VBA?

Мне нужно иметь возможность присваивать нулевое значение некоторым полям для определенных записей, когда данные неполны или неактуальны, но если я объявляю переменную как строку, дату или целое число, я получаю ошибки при попытке присвоить нулевое значение.

Является ли единственным решением использовать Variant? Если это так, то в чем смысл всех других типов данных в VBA?

Ответ №1:

 Dim x As Variant
x = Null
  

Значение может содержать только тип данных Variant Null .

Вариант — это специальный тип данных, который может содержать данные любого типа […] Вариант также может содержать специальные значения Empty, Error, Nothing и Null.

«Смысл» всех других типов данных как раз в том, что они не могут содержать никаких данных старого типа. У этого есть два преимущества, о которых я могу подумать:

  • Программисту сложнее присвоить переменной данные непреднамеренного типа по ошибке, поскольку это будет обнаружено во время компиляции. Это может помочь предотвратить ошибки и прояснить ситуацию для вас и следующего пользователя, который будет поддерживать ваш код.
  • Узкие типы данных экономят место в памяти. Помещение целых чисел в Variant (16 байт) занимает намного больше памяти, чем помещение их в Int (2 байта). Это становится важным, если у вас большие массивы.

Конечно, варианты имеют свое место, как обсуждают другие темы на этом сайте.

Комментарии:

1. Я программирую VBA уже долгое время, но меня все еще расстраивает всякий раз, когда я читаю, что вариант может принимать три разных специальных значения, которые звучат абсолютно одинаково: Empty, Nothing и Null.

2. Возможно, это из-за моего опыта работы с SQL и PHP, но я не считаю, что Null — это «какие-либо старые данные», и это допустимое значение для большинства типов данных SQL… ну что ж, тогда варианты.

3. Я слышал, что в Office 2013 Variant также будут приниматься значения Void , Absent , Unspecified None , Vacuum и, ,.

4. @Joel, я думаю, там есть какая-то история. Разве Empty (как в «неинициализированном Variant значении») в семействе языков VB не предшествует Nothing (как в «ссылке на объект, которая ни на что не указывает»)? И, как говорит @HorusKol, Null это конкретное значение (и я почти уверен, что Null в VBx всегда предполагалось, что значение «database» равно нулю).

5. Было бы неплохо, если бы VBA могла хотя бы добавить опцию int? (или обнуляемый<int>), длинный? (или обнуляемый <длинный>) и т.д. Одна из многих причин, почему я ненавижу VBA (хотя, к сожалению, я часто вынужден с ней работать).