Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / VBA EXCEL 2010 Как присвоить значения ячеек дивпазона, не смежных ячеек, массиву / 3 сообщений из 3, страница 1 из 1
06.01.2014, 14:37
    #38518436
ru_efim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA EXCEL 2010 Как присвоить значения ячеек дивпазона, не смежных ячеек, массиву
Точнее ситуация такая
Имеем лист с ячейками содержащими например такие данные
A B C D 1 11121314 1 21222324
Необходимо написать макрос в котором создается массив Arr(2,3) и присваиваем его элементам значение таким образом как реализовано в следующем макросе:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Sub text2()
    Dim Arr() As Variant
    Dim tmpRange As Range
    
'Этот блок кода просто для целей тестирования, в исходных условиях ячейки уже заполнены.
    Range("A1") = 11
    Range("A2") = 21
    Range("B1") = 12
    Range("B2") = 22
    Range("C1") = 13
    Range("C2") = 23
    Range("D1") = 14
    Range("D2") = 24
'Конец блока кода
    
    Set tmpRange = Range("A1:B2, D1:D2")
    tmpRange.Copy
    
'А вот нижеследующих операций присвоение значений ячейкам листа и хотелось бы избежать
    Range("A4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
'Конец блока кода

    ReDim Arr(2, 2)
    Arr() = Selection

    Selection.Clear
    Range("A1:D2").Clear
End Sub


Но хотелось бы избежать цикла при заполнении значениями элементов массива (представленный код его как раз и не имеет) , и как сказанное в комментариях выше, операций "временного" присвоение значений ячейкам листа .
В общем, додумался до следующего. Метод Range.PasteSpecial корректно обрабатывает, содержащуюся после копирования в буфере обмена, структуру. Все же попытки работы с объектом tmpRange , созданным и инициализированным в макросе, подобные выполнению следующей операции Arr() = tmpRange.value , приведут к не желаемому результату( Arr(2, 2) содержащему только два столбца "А" и "B") т.к. присваиваются только значения первой Areas и походу иначе невозможно.
Но вдруг, все таки возможно, просто я не знаю как, вопрос в том как достичь желаемого.
...
Рейтинг: 0 / 0
06.01.2014, 14:42
    #38518441
ru_efim
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA EXCEL 2010 Как присвоить значения ячеек дивпазона, не смежных ячеек, массиву
ru_efim,

Извиняюсь в коде макроса корректно изменять размерность массива так
Код: vbnet
1.
ReDim Arr(2, 3)


Хотя, похоже, это не принципиально, можно вообще не изменять размерность.
...
Рейтинг: 0 / 0
06.01.2014, 18:50
    #38518684
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA EXCEL 2010 Как присвоить значения ячеек дивпазона, не смежных ячеек, массиву
Без циклов здесь - никак. Другое дело, что обработка переменных памяти - всегда намного быстрее, чем объектов. Так что можно создавать массив, считывая области объединённого диапазона; или скопировать в массив весь диапазон - а затем удалить ненужные строки/столбцы.

А, например, используя API (CopyMemory через RtlMoveMemory, примеров полно) - можно получить такое быстродействие, что мало не покажется
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Sub arr_del_column(ByRef Arr(), delCol As Long)
    mr% = UBound(Arr)
    mc% = UBound(Arr, 2)
    CopyMemory Arr(1, delCol), Arr(1, delCol + 1), 16 * mr * (mc - delCol)
    ReDim Preserve Arr(LBound(Arr) To mr, LBound(Arr, 2) To mc - 1)
End Sub

Sub test_del()
    Dim a()
    a = Range("A1:D3")
    arr_del_column a, 2
End Sub


Смотрим: считываем в массив диапазон A1:D3 (3 строки, 4 столбца), а затем удаляем столбец 2. И получаем масив 3х3.
Конечно, можно удалить и несколько столбцов сразу. А изменение размерности - вынести из процедуры (или встроить CopyMemory на предыдущий уровень). Или удалить строки (транспонируя исходный массив, например). etc...
P.S. 16 - это размер в байтах ячейки массива типа Variant.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / VBA EXCEL 2010 Как присвоить значения ячеек дивпазона, не смежных ячеек, массиву / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]