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

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

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

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


person HorusKol    schedule 12.04.2011    source источник


Ответы (1)


Dim x As Variant
x = Null

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

Вариант - это особый тип данных, который может содержать данные любого типа [...] Вариант также может содержать специальные значения Пусто, Ошибка, Ничего и Нулевое.

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

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

Конечно, у вариантов есть свое место, о чем говорят другие темы на этом сайте.

person Jean-François Corbett    schedule 12.04.2011
comment
Я давно занимаюсь программированием VBA, но меня до сих пор расстраивает, когда я читаю, что Variant может принимать три разных специальных значения, которые звучат совершенно одинаково: Empty, Nothing и Null. - person Joel Goodwin; 12.04.2011
comment
Возможно, это мой опыт работы с SQL и PHP, но я не считаю Null «любыми старыми данными», и это допустимое значение для большинства типов данных SQL ... ну, тогда варианты. - person HorusKol; 12.04.2011
comment
Я слышал, что в Office 2013 Variant также принимает значения Void, Absent, Unspecified, None и Vacuum. - person Jean-François Corbett; 12.04.2011
comment
@ Джоэл, я думаю, здесь есть какая-то история. Разве Empty (как в неинициализированном Variant значении) в семействе языков VB не предшествует Nothing (как в ссылке на объект, которая ни на что не указывает)? И, как говорит @HorusKol, Null - это конкретное значение (и я почти уверен, что Null в VBx всегда предназначалось для нулевой базы данных). - person jtolle; 12.04.2011
comment
@jtolle Да, я четко понимаю их роли, это именно то, что заставляет меня иногда отчаиваться в программировании, когда у меня есть концепции, которые выглядят одинаково, но имеют совершенно разные значения. С другой стороны, до сих пор ведутся споры о том, означает ли Null в SQL отсутствие данных или неизвестность. Кстати, в свободное время я ненавижу SQL NULL. Кажется, я только что опубликовал свой психологический профиль на Stack Overflow. - person Joel Goodwin; 12.04.2011
comment
@JoelGoodwin - мои коллеги и я всегда придерживались позиции, что NULL в SQL означает «нет данных, и нам все равно» ... тогда база данных спроектирована таким образом, чтобы у нас могло не быть данных, но нас это волнует. .. - person HorusKol; 13.04.2011
comment
@HorusKol, главное, чтобы у вас была своя последовательная интерпретация. В половине случаев проекты переходят в середину стола. Я мог бы продолжать и говорить о NULL, но я в значительной степени выразил свои чувства здесь: stackoverflow.com/questions/1034925/ - person Joel Goodwin; 13.04.2011
comment
Было бы неплохо, если бы VBA мог хотя бы добавить опцию int? (или Nullable ‹int›), долго? (или Nullable ‹long›) и т. д. Одна из многих причин, почему я ненавижу VBA (хотя, к сожалению, меня часто заставляют с ним работать). - person William; 21.01.2015
comment
что было бы нулевым эквивалентом для неназначенной строки в VBA? - person BKSpurgeon; 25.05.2016
comment
Не уверен, что вы имеете в виду под эквивалентом. Если вы спрашиваете, каково значение строковой переменной, которая была объявлена ​​(Dim), но не присвоено явно какое-либо значение, то ответом будет пустая строка нулевой длины, "". - person Jean-François Corbett; 26.05.2016
comment
@ Jean-FrançoisCorbett Жалко, что они не включили Undefined. У JavaScript есть это! Мы должны сообщить Microsoft, что им нужно добавить эту полезную функцию! - person m93a; 22.08.2017
comment
@ Jean-FrançoisCorbett Я не уверен, что вы саркастичны. Когда я использую эти ключевые слова, я не получаю ничего, кроме этого вопроса. - person René Nyffenegger; 03.08.2018
comment
@ RenéNyffenegger Позвольте мне объяснить: это была попытка формы общения, известной как юмор. Подробнее: en.wikipedia.org/wiki/Humour - person Jean-François Corbett; 03.08.2018