Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Массив из диапазона ячеек
 
Код
Sub test()
    Dim a()
    With Sheets("Лист1")
        a = .Range("A1:J1").Value
        MsgBox UBound(a)
    End With
End Sub 
Я думал MsgBox UBound(a) должен выдать 10, а выдает 1, подскажите почему так?
Все ячейки заполнены в этом диапазоне, пустых нет.
 
Цитата
sinus пишет: MsgBox UBound(a) должен выдать
он выдает ровно то, что Вы от него требуете. Что Вы хотите получить? Сумму ячеек? Значение первой/последней ячейки? Или еще что-то?
Согласие есть продукт при полном непротивлении сторон.
 
Потому что в массиве одна строка.
 
я хочу чтобы он занес поочередно ячейки A1, B1, C1, ..., J1 в массив a
 
Если хотите узнать ширину массива (к-во столбцов), то нужно
Код
MsgBox UBound(a, 2)
 
Но так Вы ничего не заполните)
 
Цитата
sinus пишет: я хочу чтобы он занес поочередно ячейки A1, B1, C1, ..., J1 в массив a
Забрав диапазон в массив, Вы уже забрали данные из ячеек.
 
Тогда
Код
 For i = 1 to Ubound(a)  
   .Cells(2, i) = a(i) 
Next
не работает...subscript out of range...не могу уловить суть ошибки.
Ubound ведь возвращает информацию о верхней границе массива (номер последнего имеющегося значения), по идее 10 (диапазон же из 10 ячеек).
Просветите пожалуйста, весь день гуглю, у всех эти примеры работают, у меня нет.
Даже в моей старой теме Hugo писал, один в один пример...
 
  Вы хотите теперь из массива во вторую строку на лист выгрузить циклом данные? Тогда так:
Код
        For i = 1 To UBound(a, 2)
            .Cells(2, i) = a(1, i)
        Next
 
 
sinus, Ваш массив имеет вид: а(строк с 1 по 1, столбцов с 1 по 10), как я понял.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Юрий М пишет: Вы хотите теперь из массива во вторую строку на лист выгрузить циклом данные? Тогда так:
да, именно это хочу. Но почему так? Не понимаю ((
Таааак, я могу спороть чушь, но я правильно понял что этот массив получился не (1 to 10), а (10, 1) ???

JayBhagavan, походу так ))) тогда массив (1, 10) получается?...
Ладно, всем спасибо!!! Направление "копания" понял, хотя бы понял что гуглить
Изменено: sinus - 4 Ноя 2014 23:23:30
 
Цитата
sinus пишет: но я правильно понял что этот массив получился не (1 to 10), а (10, 1)
JayBhagavan уже ответил какой массив получается.
Цитата
(строк с 1 по 1, столбцов с 1 по 10)
(1 To 1, 1 To 10)
Ubound(a) (то же самое что UBound(a, 1)) выдает скажем так к-во строк, а UBound(a, 2) к-во столбцов.
Изменено: V - 4 Ноя 2014 23:27:17
 
Цитата
V пишет: Ubound(a) (то же самое что UBound(a, 1)) выдает скажем так к-во строк, а UBound(a, 2) к-во столбцов.
Все равно не догоняю, почему так.
Читаю тут: http://msdn.microsoft.com/ru-ru/library/95b8f22f(v=vs.90).aspx
И не понимаю какой у меня массив получился...(1 to 1, 1 to 1, 1 to 1, ...) и так 10 раз?
Пример из ссылки:
Код
Dim a(100, 5, 4) As Byte 
UBound(a, 1) возвращает 100
UBound(a, 2) возвращает 5
UBound(a, 3) соответственно 4

Я тут и не могу разобраться, у меня какой массив получился )))
 
sinus, трёхмерный массив.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
sinus пишет: (1 to 1, 1 to 1, 1 to 1, ...) и так 10 раз?
нет. Просто (1 to 1, 1 to 10).
этот пример для вашего случая больше подходит для понимания, только учтите пример для трехмерного массива у вас же двухмерный. см. строчку выше.
Код
' Пример употребления функции UBound
' Объявляем трехмерный массив
Dim myArray(1 To 100, 0 To 3, -3 To 4)
Dim retval
retval=UBound(myArray,1) 'возвращает 100
retval=UBound(myArray,2) 'возвращает 3
retval=UBound(myArray,3) 'возвращает 4 
 
Цитата
sinus пишет: я правильно понял что этот массив получился не (1 to 10), а (10, 1) ???
Чтобы получить второй вариант массива (1 to 1, 1 to 10) , Вы должны были забрать в него диапазон A1:A10.
Представьте его, как диапазон на листе:
A1:J1 - это будет (1 to 1, 1 to 10) - 1 строка, 10 столбцов.
A1:A10 - это будет (1 to 10, 1 to 1) - 10 строк, один столбец.
Сначала, как и для ячейки (Cells(1,4) указываются строки, затем столбцы.
 
Спасибо всем большое!
Понял что массив из диапазона ячеек оказывается двухмерным. Думал просто а(1 to 10) вот же ж как )))) думал двумерные начинаются когда 2 или больше строк/столбцов.  
 
sinus, любой массив минимально двумерный: 1х1. :)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Если бы тормознули код после заполнения массива и заглянули в Locals - думаю всё стало бы понятно.
 
Чтобы, возможно, настало полное понимание: когда Вы создаете массив "на лету" из диапазона ячеек(как у Вас), то массив всегда будет иметь размер и направление ровно как и в диапазоне, из которого его создали.
Вид его типа: Массив(кол-во строк, кол-во столбцов)
И всегда начинается с 1(несмотря на Option Base)
Т.е. если Вы заносите в массив столбец(A1:J1) - то и массив тоже расширится только по столбцам: 1 до 1, 1 до 10. Как у Вас в примере.
Если заносите в массив строку(A1:A10) - то массив расширится по строкам: 1 до 10, 1 до 1.
Если занесете в массив диапазон A1:C10 - то массив будет размера: 1 до 10, 1 до 3.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
JayBhagavan пишет: любой массив минимально двумерный
не надо вводить людей в заблуждение :-)
Любой, созданный из диапазона ячеек на лету. Так будет вернее.
Ибо массив, созданный через ту же Split - одномерный. Имеет размерность от 0 до кол-ва элементов. Второй размерности нет и не будет.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, да, Вы правы.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Hugo пишет: Если бы тормознули код после заполнения массива и заглянули в Locals - думаю всё стало бы понятно.
Неудобно признаваться, не понимаю где это (((
Еще раз спасибо, много прояснили.
 
В редакторе.

 
Ага, включил отображение окна, View - Locals Window
Понаблюдаю что это такое )) до этого без него писал код
 
Незаменимое окошко: прогоняете по F8 код и смотрите состояние)
 
Добрый день. Старенькая тема форума, но надеюсь я по теме.
Если в ячейку, имеющую формат даты, ввести число большее 2958465 (эквивалентно дате 31.12.9999), то ячейка выдаст "ошибку" типа "########" (оно и понятно, даты больше указанной в экселе нет).
Если попытаться "загнать" в массив значения из диапазона ячеек, содержащей ячейку с вышеупомянутой "ошибкой"
например, arrData = Sheets("Лист1").Range("a1:c10").Value,
то массив это не проглотит, выдаст ошибку Run-time error 6, Overflow.
Хотя другого типа ошибки (#ДЕЛ/0!, #ССЫЛКА!, и прочее, и прочее) - массив глотает.

Интересно, что с ячейкой, имеющей формат даты, но с отрицательным числом и  имеющую такую же (визуально) ошибку "#########", ситуация немного другая.
Строка типа arrData = Sheets("Лист1").Range("a1:c10").Value ошибку не выдает, но вот обратно загнать значения из массива на лист не получится:
строка Sheets("Лист1").Range("a21:c30").Value = arrData выдаст ошибку Run-time error 1004.

Ради творческого и профессионального интереса, скажите почему это происходит?
Есть ли и другие ограничения подобного рода? Кто-нибудь знает?
Спасибо.
 
IAdmireExcel,  А какая связь вашего вопроса с темой?
 
Создайте отдельную тему с названием, отражающим суть вопроса.
Страницы: 1
Читают тему (гостей: 1)
Наверх