Как скопировать диапазон ячеек в массив памяти ОЗУ?

Автор Олег*, 22.10.2012, 16:04

« назад - далее »

Олег*

Может быть некорректно вопрос сформулировал, сейчас попробую объяснить, о чем веду речь.

Вот, допустим, есть у нас большой диапазон ячеек. В приложенном примере, это диапазон A1:Z300. В каждой ячейке этого диапазона находится число, полученное в результате определенных вычислений. Мне хотелось бы  скопировать этот диапазон в массив памяти МойМассив(). Сейчас я это делаю с помощью циклов (см. в приложенном примере). Но если диапазон достаточно большой, то это занимает довольно много времени.

Вопрос состоит в том, чтобы найти (если это возможно) какой-нибудь более быстрый  способ для копирования диапазона ячеек рабочего листа в массив памяти ОЗУ. Если это возможно, то подскажите, пожалуйста, как это можно сделать? А если невозможно, ну значит так и буду продолжать копировать с помощью программных циклов :)

Муж это единственный зарегенный юзер, а все остальные это хакеры :)

Serge 007

Цитата: Олег* от 22.10.2012, 16:04
...найти какой-нибудь более быстрый  способ для копирования диапазона ячеек рабочего листа в массив памяти ОЗУ...

Dim MyArray
     MyArray = Array(Range("a1:z300").Value)
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

_Boroda_

Все бы было еще проще,
МойМассив() = Range("A1:Z300")
если бы не округление МойМассив(Y, X) = Round(Sheets("Лист1").Cells(Y, X), 2)
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Олег*

Цитата: Serge 007 от 22.10.2012, 16:26
Dim MyArray
     MyArray = Array(Range("a1:z300").Value)


Спасибо, но пока не понятно, как потом обращаться к конкретному члену этого массива? Какой массив создается при таком способе: одномерный, двумерный, статический, динамический?

Сейчас специально погуглил в поисках материалов по функции Array. Информации очень мало...

Цитата: _Boroda_ от 22.10.2012, 16:50
Все бы было еще проще,
МойМассив() = Range("A1:Z300")
если бы не округление МойМассив(Y, X) = Round(Sheets("Лист1").Cells(Y, X), 2)

И при таком подходе та же самая непонятка - какой это будет массив:  одномерный, двумерный, статический, динамический? Как с ним дальше-то работать?
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

_Boroda_

Запустите по F8
Private Sub Workbook_Open()
 Dim X As Long
 Dim Y As Long
 Dim МойМассив()

 МойМассив() = Range("A1:Z300")
 MsgBox "Массив в памяти создан. Для проверки: значение в ячейке B5 = " & _
            МойМассив(5, 2) & " .Это значение считано из созданного массива в памяти ОЗУ"
End Sub

двумерный, статический
работать как и собирались со своим, только нужно учитывать, что в этом нет округления
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Олег*

Цитата: _Boroda_ от 22.10.2012, 17:22
Запустите по F8
Private Sub Workbook_Open()
 Dim X As Long
 Dim Y As Long
 Dim МойМассив()

 МойМассив() = Range("A1:Z300")
 MsgBox "Массив в памяти создан. Для проверки: значение в ячейке B5 = " & _
            МойМассив(5, 2) & " .Это значение считано из созданного массива в памяти ОЗУ"
End Sub

двумерный, статический
работать как и собирались со своим, только нужно учитывать, что в этом нет округления

Классно! Действительно работает!
А округление мне и не нужно совсем, это я просто для примера заполнил диапазон случайными числами, а потом округлил их исключительно для эстетики :)
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

_Boroda_

Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Олег*

Кстати, любопытно отметить, что работает именно в таком виде, т.е. вот так:
Private Sub Workbook_Open()
Dim X As Long
Dim Y As Long
Dim МойМассив()

МойМассив() = Range("A1:Z300")


А если выбрать массив другого типа, в смысле, не Variant, а, например, Long, то работать уже отказывается.

И ещё вот так вот тоже не работает:
Private Sub Workbook_Open()
Dim X As Long
Dim Y As Long
Dim МойМассив()

МойМассив() = [МойДиапазон]


Наверно, в этом случае диапазон передается по значению, а Экселю нужно по ссылке...
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

kuklp

Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

Олег*

#9
Цитата: KuklP от 27.10.2012, 17:36
МойМассив() = [МойДиапазон].Value

Понял, спасибо.
Получается, наоборот, по значению хочет получить, а если именованный диапазон ему "скормить"  в голом виде :) ,тогда по ссылке получается и он выплевывает :)
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

kuklp

Все верно. Нам ведь надо получить динамический массив значений. Так тоже будет правильно:
МойМассив() = Range("A1:Z300").valueЛучше всегда явно указывать нужное свойство.
Я, как всегда, чертовски адекватен... Email: pilipnikop@yandex.ua WM Z206653985942, R334086032478, U238399322728, E332314026771

Михаил С.

Отдельное спасибо можно на QiWi-кошелек 909-771-53-87 или ЯД 41001136675053

Олег*

Муж это единственный зарегенный юзер, а все остальные это хакеры :)