Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Visual Basic Новый топик    Ответить
 Excel VBA: Запись в динамический массив одного единственного значения?  [new]
MAULER
Member

Откуда:
Сообщений: 762
Здравствуйте.

Не могу понять почему:

Dim cRange() As Variant
cRange = Range("A1:A2").Value

Отрабатывает нормально, а

Dim cRange() As Variant
cRange = Range("A1:A1").Value


Вываливается с ошибкой "Type mismatch."
Почему в такой массив я не могу записать только одно значение, а диапазон ячеек могу?
13 мар 18, 09:05    [21251680]     Ответить | Цитировать Сообщить модератору
 Re: Excel VBA: Запись в динамический массив одного единственного значения?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 18947
Debug.Print TypeName(Range("A1:A1").Value)
Double
Debug.Print TypeName(Range("A1:A2").Value)
Variant()
13 мар 18, 09:11    [21251701]     Ответить | Цитировать Сообщить модератору
 Re: Excel VBA: Запись в динамический массив одного единственного значения?  [new]
MAULER
Member

Откуда:
Сообщений: 762
Shocker.Pro,

Спасибо за информацию. Полезно.
А как мне теперь его закастовать к типу Variant ?
13 мар 18, 09:34    [21251794]     Ответить | Цитировать Сообщить модератору
 Re: Excel VBA: Запись в динамический массив одного единственного значения?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 18947
Debug.Print TypeName(Array(Range("A1:A1").Value))
Variant()
13 мар 18, 09:39    [21251816]     Ответить | Цитировать Сообщить модератору
 Re: Excel VBA: Запись в динамический массив одного единственного значения?  [new]
MAULER
Member

Откуда:
Сообщений: 762
Shocker.Pro,

Спасибо!
13 мар 18, 09:48    [21251860]     Ответить | Цитировать Сообщить модератору
 Re: Excel VBA: Запись в динамический массив одного единственного значения?  [new]
The_Prist
Member

Откуда: www.excel-vba.ru
Сообщений: 1725
MAULER,

Можете делать универсально:
Dim cRange
cRange = Range("A1:A1").Value
If not isarray(cRange) then
redim cRange(1 to 1, 1 to 1)
cRange(1,1) = Range("A1").Value
end if

В итоге cRange всегда будет двумерным массивом с нижней границей 1 и не будет выдаваться ошибка несовпадения типов, если только одну ячейку записываете.
13 мар 18, 10:15    [21251948]     Ответить | Цитировать Сообщить модератору
 Re: Excel VBA: Запись в динамический массив одного единственного значения?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17886
The_Prist
Можете делать универсально

Зачем так сложно?
strNeededRange = "A1:A1" ' or "A1:A2"
cRange = Range(strNeededRange).Value
If Not IsArray(cRange) Then cRange = Array(cRange)
13 мар 18, 10:34    [21252006]     Ответить | Цитировать Сообщить модератору
 Re: Excel VBA: Запись в динамический массив одного единственного значения?  [new]
The_Prist
Member

Откуда: www.excel-vba.ru
Сообщений: 1725
Akina
Зачем так сложно?
чтобы массив всегда был двумерный с нижней границей 1. Иногда это очень сильно упрощает дальнейшую работу с массивом(без доп.проверок), если надо будет его обработать и вернуть на место. Взять приведенный Вами код. Если ячейка одна - то такой код отработает без проблем:
strNeededRange = "A1:A1" ' or "A1:A2"
cRange = Range(strNeededRange).Value
If Not IsArray(cRange) Then cRange = Array(cRange)
cRange(0) = "34"
Range(strNeededRange).Value = cRange

Но если две и более - то на строке cRange(0) = "34" получим ошибку.
13 мар 18, 13:47    [21252659]     Ответить | Цитировать Сообщить модератору
 Re: Excel VBA: Запись в динамический массив одного единственного значения?  [new]
MAULER
Member

Откуда:
Сообщений: 762
The_Prist,

Коллеги, спасибо за ценную информацию.
Выкрутился уже.
13 мар 18, 14:20    [21252779]     Ответить | Цитировать Сообщить модератору
 Re: Excel VBA: Запись в динамический массив одного единственного значения?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17886
The_Prist
чтобы массив всегда был двумерный с нижней границей 1.

Да, что-то не сравнил типы... уговорил.
14 мар 18, 08:05    [21254209]     Ответить | Цитировать Сообщить модератору
Все форумы / Visual Basic Ответить