Проверка значения Variant "Nothing" - PullRequest
6 голосов
/ 23 февраля 2009

Это то, с чем я столкнулся в прошлом году, и SO кажется хорошим местом для документирования:)

В: При автоматизации Excel (/ Word / ...) из Delphi, как я могу проверить, вернула ли функция Excel вариант Nothing (как он вызывается в VBA)?

Ответы [ 3 ]

9 голосов
/ 24 февраля 2009

Функция VarIsClear включает вашу ситуацию, когда типом является varDispatch, а значением является nil. Он также включает в себя пустые и «неизвестные» значения и пользовательские типы вариантов. Я вижу это в моем источнике Delphi 2005; Я не знаю, сколько раньше это было включено.

4 голосов
/ 23 февраля 2009

Любопытно, что Nothing в VBA не совпадает с Unassigned, Null или Empty, поэтому вы не можете использовать, например ::100100

// Worksheet is a TExcelWorksheet or OleVariant coupled to an open worksheet
MyRange := Worksheet.Range['MyRangeInTheWorksheet', EmptyParam]
if (MyRange = Null) then  // won't work!
  MsgBox('The range doesn''t exist!');

Вместо этого используйте эту функцию:

function VarIsNothing(V: OleVariant): Boolean;
begin
  Result :=
    (TVarData(V).VType = varDispatch)
    and
    (TVarData(V).VDispatch = nil);
end;

// ...

if (VarIsNothing(MyRange)) then

Обновление

Очевидно, что источники RTL-блока Variants.pas изменились между Delphi 5 и 2007. Согласно @mghie (см. Комментарии), функция VarIsEmpty выполнила бы работу в D5. Однако в D2007 это, похоже, уже не так, поэтому вам, вероятно, снова понадобится вышеуказанная функция.

Кроме того, обратите внимание, что VBA Nothing, вероятно, представляет собой особый случай; Я не думаю, что с автоматизацией сталкиваются слишком часто.

2 голосов
/ 23 февраля 2009

Разве VarIsEmpty (отличный от VarIsNull) не делает то, что вы хотите?

...