Variant / String вместо Variant / Empty - PullRequest
0 голосов
/ 26 ноября 2018

Я создаю вариант из 10 строк и 2 столбцов из диапазона на рабочем листе с таким кодом:

Dim ws As Worksheet
Dim leRange As Variant

Set ws = ThisWorkbook.Worksheets(1)
leRange = ws.Range(ws.Cells(1, 1), ws.Cells(10, 2)).Value

Первый столбец всегда заполняется, но не второй.Когда я проверяю leRange в окнах Locals, когда в ячейке ничего нет, значение равно Empty типа Variant/Empty.Я хотел бы изменить его на "" типа `Variant / String.

Я мог бы зациклить вариант, чтобы проверить и заменить, но я хотел бы знать, есть ли более разумный способ сделать это, спасибо!

Edit: функция, которая принимает эти данные в качестве аргумента, нуждается в варианте строк, и я не могу изменить его, поэтому мне нужно сделать замену.

1 Ответ

0 голосов
/ 26 ноября 2018

Объявите leRange As String, и вы получите String пусто.Ваш код не имеет отношения к типу возврата Range.Value, это должен решить Excel.

Проблема в том, что leRange здесь не просто любой другой Variant/Empty: диапазон не охватываетодна ячейка, так что то, что содержит вариант, на самом деле представляет собой двумерный массив вариантов, и вот как все работает.Вы не можете изменить подтип варианта отдельных элементов массива, которые вы получаете из объектной модели приложения хоста.

Variant/Empty не эквивалентен пустой строке: если ячейка фактически пуста, то IsEmpty возвращает истину.Если ячейка содержит / оценивает пустую строку, то IsEmpty возвращает false.

Обратите внимание, что только Variant может содержать значение Error.Если ячейка оценивается, например, как #REF!, подтип варианта будет Variant/Error, и IsError вернет для него значение true - попытка присвоить такое значение String приведет к несоответствию типов ошибка.

Excel предоставляет вариантный массив: ваш код должен иметь дело с вариантным массивом.Empty легко сравнивается с "" или vbNullString (сравнение оценивается как True) - проблема не решается, ваше беспокойство по поводу подтипа варианта неуместно, не о чем беспокоиться.


Edit: функция, которая принимает эти данные в качестве аргумента, нуждается в варианте строк, и я не могу изменить его, поэтому мне нужно сделать замену.

Я не уверен, что это значит, но если это означает, что вы передаете весь массив 2D Variant в функцию, которая принимает массив String(), тогда да, вам нужно объявить новый массив и скопировать ваши вариантыв строки, в противном случае вы можете ожидать несоответствия типов - это неэффективно, так как вы ожидаете, что ему дадут несколько сотен / тысяч ячеек, но если речь идет о горстке ячеек, вовлеченных в OP, это не должно бытьочень плохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...