Sub test() Dim a() a = Array("первый", "второй", "третий", "четвертый", "пятый") MsgBox getrows(a, 2) ' MsgBox getrows(Array("первый", "второй", "третий", "четвертый", "пятый"), 2) End Sub
[/vba]
A так не ругается [vba]
Код
Sub test() Dim a() a = Array("первый", "второй", "третий", "четвертый", "пятый") MsgBox getrows(a, 2) ' MsgBox getrows(Array("первый", "второй", "третий", "четвертый", "пятый"), 2) End Sub
SkyPro, а как с помощью Array загрузить руками значения в двумерный массив? Интересует как это сделать одной строкой и по отдельности в каждую... как это называется... размерность, что ли, или столбец виртуального массива.
SkyPro, а как с помощью Array загрузить руками значения в двумерный массив? Интересует как это сделать одной строкой и по отдельности в каждую... как это называется... размерность, что ли, или столбец виртуального массива.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
ikki, интересная вещь, но сейчас нужно немного другое.
Пробую задать двумерному массиву несколько текстовых значений. По одному прописывать не то, чтобы долго - не совсем эстетически устраивает =) циклом по ячейкам проходить - не круто, хочу встроить значения в код.
ikki, интересная вещь, но сейчас нужно немного другое.
Пробую задать двумерному массиву несколько текстовых значений. По одному прописывать не то, чтобы долго - не совсем эстетически устраивает =) циклом по ячейкам проходить - не круто, хочу встроить значения в код.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Среда, 11.06.2014, 11:17
эх.. Есть языки, где массивы намного удобнее реализованы (асоциативные массивы, списки, кортежи и т.д.), а в ВБ как-то уныленько все ) Хотя есть альтернативы (коллекции и словари).
эх.. Есть языки, где массивы намного удобнее реализованы (асоциативные массивы, списки, кортежи и т.д.), а в ВБ как-то уныленько все ) Хотя есть альтернативы (коллекции и словари).SkyPro
SkyPro, получается, что если я работаю со списком, например, координат неких точек на плоскости, мне будет удобнее создать два массива, по одному для каждой из двух координат?
[vba]
Код
Dim AxisX Dim AxisY
AxisX = Array(10, 15, 7) AxisY = Array(5, 12, 10)
[/vba]
SkyPro, получается, что если я работаю со списком, например, координат неких точек на плоскости, мне будет удобнее создать два массива, по одному для каждой из двух координат?
хотелось бы без циклов, "в лобовую" вбивать конкретные значения
Если VBA-код выполняется в Excel, то получается без разницы куда жестко вбивать начальные значения элементов массива - в строку кода внутри процедуры (и потом потеть с этой строкой, так или иначе ее разбирая) или на рабочий лист. С рабочим листом всё гораздо изящнее: [vba]
Код
Sub io()
Dim SuperMassiv As Variant Dim i, j
'здесь SuperMassiv еще просто переменная
SuperMassiv = Range("A1:B4") 'в А1 - 1, в B1 - 10 ... в B4 - 40
'а здесь SuperMassiv уже массив, к членам которого можно обращаться через индексы
For i = 1 To 4: For j = 1 To 2 Debug.Print SuperMassiv(i, j) Next j, i
End Sub
[/vba] В окне отладки получаем: [vba]
Код
1 10 2 20 3 30 4 40
[/vba] Если же хочется быть ограниченным рамками процедуры, когда, например, предполагается ее дальнейшее использование не в хосте Excel (т.е. worksheets под рукой не будет), то не придумано ничего более простого, чем элементарные присвоения (которые можно сгенерировать формулами в том же Excel на этапе подготовки кода): [vba]
Код
Sub io2()
Dim SuperMassiv(1 To 4, 1 To 2) As Variant Dim i, j
хотелось бы без циклов, "в лобовую" вбивать конкретные значения
Если VBA-код выполняется в Excel, то получается без разницы куда жестко вбивать начальные значения элементов массива - в строку кода внутри процедуры (и потом потеть с этой строкой, так или иначе ее разбирая) или на рабочий лист. С рабочим листом всё гораздо изящнее: [vba]
Код
Sub io()
Dim SuperMassiv As Variant Dim i, j
'здесь SuperMassiv еще просто переменная
SuperMassiv = Range("A1:B4") 'в А1 - 1, в B1 - 10 ... в B4 - 40
'а здесь SuperMassiv уже массив, к членам которого можно обращаться через индексы
For i = 1 To 4: For j = 1 To 2 Debug.Print SuperMassiv(i, j) Next j, i
End Sub
[/vba] В окне отладки получаем: [vba]
Код
1 10 2 20 3 30 4 40
[/vba] Если же хочется быть ограниченным рамками процедуры, когда, например, предполагается ее дальнейшее использование не в хосте Excel (т.е. worksheets под рукой не будет), то не придумано ничего более простого, чем элементарные присвоения (которые можно сгенерировать формулами в том же Excel на этапе подготовки кода): [vba]
Код
Sub io2()
Dim SuperMassiv(1 To 4, 1 To 2) As Variant Dim i, j
Rioran, в данном случае не получится. Вы же объявили двумерный массив, а пытаетесь указать только один индекс. Тогда уж [vba]
Код
Mass(1, 1) = .Range("A2:A10").Value
[/vba] Но, в "ячейке" массива Mass(1, 1) будет находится двумерный массив. Для считывания значений ячеек проще просто использовать переменную типа Variant и определять верхние границы по первому измерению UBound(Mass, 1), по второму - UBound(Mass, 2). Нижняя граница измерений в этом случае 1. Хотя для строгости её можно определять LBound(Mass, 1)/ Если бы вы типизировали массив, то в этом случае вам бы пришлось заполнять его циклом.
Rioran, в данном случае не получится. Вы же объявили двумерный массив, а пытаетесь указать только один индекс. Тогда уж [vba]
Код
Mass(1, 1) = .Range("A2:A10").Value
[/vba] Но, в "ячейке" массива Mass(1, 1) будет находится двумерный массив. Для считывания значений ячеек проще просто использовать переменную типа Variant и определять верхние границы по первому измерению UBound(Mass, 1), по второму - UBound(Mass, 2). Нижняя граница измерений в этом случае 1. Хотя для строгости её можно определять LBound(Mass, 1)/ Если бы вы типизировали массив, то в этом случае вам бы пришлось заполнять его циклом.anvg
Gustav, спасибо, Ваш пример хорошо подходит для работы с кучкой констант.
anvg, интересно. А есть способ отдельно записать ряд значений для первого "столбца" двумерного массива (1, 2, 3, 4), и отдельно для второго (10, 20, 30, 40)?
Gustav, спасибо, Ваш пример хорошо подходит для работы с кучкой констант.
anvg, интересно. А есть способ отдельно записать ряд значений для первого "столбца" двумерного массива (1, 2, 3, 4), и отдельно для второго (10, 20, 30, 40)?Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Не нужно указывать размерность массива. Тогда размерность установится автоматически. Для диапазона A1:B10 [vba]
Код
Sub test() Dim arr For i = 1 To 3 arr = Range(Cells(1, 1), Cells(11 - i * 2, 2)).Value Cells(1, 3 * i).Resize(UBound(arr), UBound(arr, 2)) = arr Erase arr Next End Sub
[/vba]
Не нужно указывать размерность массива. Тогда размерность установится автоматически. Для диапазона A1:B10 [vba]
Код
Sub test() Dim arr For i = 1 To 3 arr = Range(Cells(1, 1), Cells(11 - i * 2, 2)).Value Cells(1, 3 * i).Resize(UBound(arr), UBound(arr, 2)) = arr Erase arr Next End Sub