Страницы: 1
RSS
VBA вырезать слой из массива
 
Дан заполненный двумерный массив.

Код
1
Dim myArr(1 to 2, 1 to 5)

Мне это представляется как два массива с размером (1 to 5) в каждом.
Так вот, можно ли вырезать из этого массива целый слой в новую переменную?
Хочется без цикла, каким-нибудь нативным способов.
Чтобы получилось так:

Код
1
2
3
4
5
6
7
8
9
Dim NewArr(1 to 5)
 
CutDimenstionToArray myArr,2,NewArr    'произвольная функция, но думаю суть понятна. Из массива вырезается второй слой
 
Debug.print myArr(2,1) = NewArr(1) 'True
Debug.print myArr(2,2) = NewArr(3) 'True
Debug.print myArr(2,3) = NewArr(3) 'True
Debug.print myArr(2,4) = NewArr(4) 'True
Debug.print myArr(2,5) = NewArr(5) 'True
 
Цитата
Денис Козлов пишет:
Мне это представляется как два массива с размером (1 to 5) в каждом.
неправильно Вам представляется. это двумерный массив.
посмотрите в сторону функции листа Index
но тут недавно что-то похожее мерили - "ненативное" перекладывание в цикле гораздо быстрее.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Цитата
Денис Козлов пишет: Хочется без цикла
А что компьютер не тянет цикл по массиву? Меняйте его на новый тогда.
 
Как-то уже обговаривали подобную ситуацию. Можно сделать массив массивов и с этой конструкцией работать:
Код
1
2
3
4
5
6
7
8
9
10
Dim Arr(1 to 2) as Variant, NewArr(1 to 5) as String
Dim Var1 as String, Var2 as Variant
 ... 'Заполняем массив NewArr
Arr(1)=NewArr
... 'Ещё раз заполняем NewArr
Arr(2)=NewArr
'Обращение к элементам массива:
Var1 = Arr(1)(3)
'Или так:
Var2=Arr(1): Var1 = Var2(3)
Т.е. можно работать с массивами, как с простыми типами. Дальше додумывайте сами
Изменено: Skif-F - 25.07.2014 17:38:55
 
Цитата
ikki пишет: гораздо быстрее.
Это ни о чем.
Я померил. Хорошо, стул был с подлокотниками.
Разница в скорости 1/1000.
 
Котяра, что с чем сравнивал? Мне интересно тоже))
 
Цитата
можно ли вырезать из этого массива целый слой в новую переменную?
можно
функция листа - Application.Index

Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub test()
    Dim myArr(1 To 2, 1 To 5) ' исходный массив
 
    For i = LBound(myArr) To UBound(myArr) ' заполняем его
        For j = LBound(myArr, 2) To UBound(myArr, 2)
            myArr(i, j) = i & "-" & j
        Next j
    Next i
 
    arr = Application.Index(myArr, 1, 0)        ' получаем массив из 5 элементов
 
    For i = LBound(arr) To UBound(arr)
        Debug.Print "Элемент " & i & " равен ", arr(i)
    Next i
End Sub

результат:

Элемент 1 равен             1-1
Элемент 2 равен             1-2
Элемент 3 равен             1-3
Элемент 4 равен             1-4
Элемент 5 равен             1-5



А если нужна вторая строка из массива, - меняете 1 на 2:
Код
1
arr = Application.Index(myArr, 2, 0)
Изменено: Игорь - 26.07.2014 01:09:09
 
Юрий М, примерно это
Код
1
2
3
4
5
6
7
8
9
10
11
12
     a = [a1].CurrentRegion
    For i = 1 To UBound(a)
        strc = strc & vbNewLine & """" & Join(Application.Index(a, i, 0), """;""") & """"
    Next
 
    For i = 1 To UBound(a)
        For j = 1 To UBound(a, 2)
            strc = strc & """" & a(i, j) & """;"
        Next
        strc = strc & vbNewLine
    Next
    strc = Mid$(strc, 3)
 
массивы в памяти располагаются колонками: сначала идут элементы первого столбца, потом второго и тд
с помощью copymemory можно непосредственно вырезать колонку очень быстро.
остальные способы все равно перекладывание из массива в массив, хоть и замаскированное, например, функцтей индекс..
Живи и дай жить..
 
Цитата
Слэн пишет: с помощью copymemory можно непосредственно вырезать колонку очень быстро.
Слэн если вас не затруднит, кодовой строчкой (примерной) будет интересно увидеть...
Изменено: JeyCi - 26.07.2014 11:59:42
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Вот ЗДЕСЬ есть))
 
Цитата
Юрий М пишет: Вот ЗДЕСЬ есть))
про copymemory
из всего что было "здесь" - тут  оказалось интереснее всего)  
  8)   я проверила...
Изменено: JeyCi - 28.07.2014 16:52:26
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Читают тему
Наверх
Loading...