Страницы: 1
RSS
VBA. Как игнорировать формат ячеек при копировании диапазона в массив?
 
привет всем.

столкнулся неожиданно.
простой код (в приложенном файле)
Код
Sub test()
  Dim arr()
  With ActiveSheet
    arr = .[a1:a3].Value
    arr = .[b1:b2].Value
    arr = .[b1:b3].Value
  End With
End Sub

третье присвоение приводит к ошибке времени выполнения Run-time error 6 (Overflow)
причина простая: в одной из ячеек (точнее - в B3) с большим числовым значением ошибочно установлен числовой формат Дата
в A1:A3 точно такие же значения, но формат Общий. обрабатываются без проблем.

вопрос: как избежать такую ошибку, не прибегая к циклам, приведениям типов и т.п.?
файл приложен.

дубль темы: http://www.excelworld.ru/forum/10-18614-1
Изменено: ikki - 01.08.2015 07:47:18
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
один вариант (общий ли???) я нашёл сам с помощью МНТ:
Код
arr = .[b1:b3].Value2
но не знаю - достаточно ли это правильно и универсально?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
тема закрыта.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Сам написал, сам же ответил. На всякий случай напишу, что думаю на сей счет. Вдруг кто-то зайдет на эту ветку форума и захочет узнать как же обойтись в такой ситуации?

По поводу использования Value против Value2:
Вариант без цифры автоматически конвертирует значения в формат данных совпадающий с форматом ячейки. То есть, если формат ячейки - дата, то и формат данных в VBA будет Date, даже несмотря на то, что "внутри сидит" по сути числовое значение. Этого поведения лишен вариант с цифрой (.value2). Соответственно благодаря отсутствию этого поведения value2 работает быстрее, чем просто value при работе с числовыми значениями. Нет необходимости конвертировать значения из одного типа данных в другой, соответственно и скорость работы в таком случае повышается. Таким образом, если нет ограничений по памяти лучше всего использовать массив c variant.

Давайте проверим работу этих свойств с помощью консоли ВБА. Для этого отформатируем число в виде даты. Например, возьмем число 40000. Наберем его в активной ячейке, а потом отформатируем как "Краткий формат даты". Далее напишем в консоли следующее:
Код
?typename(activecell.Value2)
?typename(activecell.Value)

Первое (вариант value2) даст "Double";
Второе (вариант value) даст "Date".
С уважением,
Федор/Все_просто
Страницы: 1
Наверх