#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 (хотя, к сожалению, я часто вынужден с ней работать).