Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2013, 11:51   #1
parshin
Пользователь
 
Регистрация: 13.03.2012
Сообщений: 20
По умолчанию Работа с массивами

Возможно ли заполнение массива не в цикле перебором ячеек листа, а сразу же диапазоном например с помощью Range("a1:c10")?
Массив определен как Dim D001(22, 12, 400000) As Single потом его надо сохранить в файл данных.

Последний раз редактировалось parshin; 10.02.2013 в 12:10.
parshin вне форума Ответить с цитированием
Старый 10.02.2013, 12:41   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Код:
Dim x()
x = Range("a1:c10").Value
Получится двумерный массив типа Variant().
Потом можете в цикле переписать его значения в нужные элементы своего трехмерного массива.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 10.02.2013, 13:03   #3
parshin
Пользователь
 
Регистрация: 13.03.2012
Сообщений: 20
По умолчанию

Спасибо, но проблема еще в том, что этот массив сжирает практически всю память.
parshin вне форума Ответить с цитированием
Старый 10.02.2013, 13:41   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

А зачем вам 3-мерный массив?
И как вы его собрались в файл записывать?

Почему 3-я размерность - именно 400000?
Вы расскажите, что и для чего делаете - тогда, может, посоветуем решение попроще.
EducatedFool вне форума Ответить с цитированием
Старый 10.02.2013, 14:52   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Записать-то, конечно, не проблема:
Код:
Open "c:\temp\1.dat" For Binary As #1
Put 1, , D001
Close #1
Но зачем нужен трехмерный массив размером 456 МБ, это вопрос!
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 10.02.2013, 21:01   #6
parshin
Пользователь
 
Регистрация: 13.03.2012
Сообщений: 20
По умолчанию

Под именем, parshin будем участвовать в форуме совместно. Меня зовут Кощеев Эдуард (мой сайт и тема: www.ed-kosheev.ru). Совместно с Михаилом Паршиным (как программистом VBA) мы реализовали задачу, как смогли (и ее поддерживаем) в одной из мск. фирм. (http://ed-kosheev.ru/nu_obectn_uchet_truda.php)
Отзыв: http://ed-kosheev.ru/otziv01.htm
Сейчас я работаю по задачам одной достаточно крупной оптовой торговой фирмы г.Перми. Основная задача: решить вопрос с кем, и чем выгодно/невыгодно торгуем сейчас, с учетом многофакторных затрат/доходов в учете рентабельности конкретного артикула товара.
Есть огромное желание работать на четырехмерном массиве DIM, как минимум: 12 Х 30 Х 1500 Х 2000 (месяц / статьи / артикулы / клиенты). Было бы удобно разнести например, бонус (руб.) клиенту (за объемы потребления) на доп. затраты к артикулам, которые он потреблял..
Причина, в демонстрашке по ссылке: http://files.mail.ru/32E92321141F48129FF210A34DB7FC2C
Но Excel такой массив не берет. Поэтому приходится извращаться, преобразуя его в трехмерный (понятно, что не каждый клиент с каждым артикулом работает, на этом экономим..)
Вопрос:
1. возможно ли придумать вариант закачки такого объемного 4-х мерного массива в мозги excel (по нашим экспериментам 2000 Х 1500 Х 30 Х 1 - это максимум при 2ГБ физической опер. памяти (одинарный формат числа), а нужно как минимум держать два таких массива, когда из одного переносим трансформируя данные в другой, да и размерность 2000 Х 1500 Х 30 Х 1 - маловата..., нужно больше..)
2. как сохранить 4-х мерный (3-х мерный) DIM в виде файла.. и затем его так же просто обратно закачать в DIM?

С меня причитается, если все получится.... (просто перечислю свое "спасибо" на Ваш, указанный сотовый телефон)
С уважением, Кощеев Эдуард и Паршин Михаил

Последний раз редактировалось parshin; 10.02.2013 в 21:38.
parshin вне форума Ответить с цитированием
Старый 10.02.2013, 21:44   #7
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Я бы все данные перенес в Mssql,написал бы некоторые процедуры по выборке определенных данных
с предварительными расчетами,а результаты выборки обрабатывал бы в Excel.
В прошлом году писал программу по обработке статистики одного интернет-магазина.
За 3 года данные,всего 14 миллионов строк.Mysql упал минут чез 20 ,я ему выделял 2 гига для буфера .
Mssql 2008 справился с поставленной задачей с 1 гигом памяти.
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 11.02.2013, 08:41   #8
parshin
Пользователь
 
Регистрация: 13.03.2012
Сообщений: 20
По умолчанию

doober, спасибо за отклик. Содержание базы в Access рассматривали как один из вариантов. Но он не очень хороший.. Дело в том, что очень неудобно как раз производить простые арифметические операции и разнесение затрат (на артикулы). Например, что бы в указанном четырехмерном массиве разнести на каждый артикул бонус начисленный клиенту за объемы потребления товаров (его назвали ретро-бонус) пропорционально объемам потребления каждого артикула в отпускных ценах, достаточно ну пусть пять-десять строчек макроса VBA. Как это разнесение делать на по-сути двумерной базе Access, путем запросов - представляю пока с трудом. Возможно, если не обойдем проблему, возможно придется делать что-то близкое к тому что вы говорите. Хотя я склоняюсь к тому, что проще будет работать (производить арифметические операции) с трехмерными DIMами... или пусть 4-х мерными, но меньшего объема.
parshin вне форума Ответить с цитированием
Старый 11.02.2013, 10:24   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Не пойму - зачем нужен 4-х мерный массив?
Помню как-то делал словарь словарей (т.е. что-то вроде трёхмерности получалось), но 4 измерения - это в голове не укладывается...
Мне кажется, вполне достаточно обычного двумерного массива - ну пройтись по нему пару раз, чтоб сперва определить среднее, затем раскидать бонус.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 11.02.2013, 13:07   #10
parshin
Пользователь
 
Регистрация: 13.03.2012
Сообщений: 20
По умолчанию

Ну представьте что ""словарь словарей" (книга, 3-х мерный массив по-сути), создается каждый месяц - вот вам и четвертое измерение... что тут сложного...
Бонусы разные бывают, вот беда... и от нас клиентам, и от поставщиков нам, и вообще всякие приколы типа "плата сетям, за годовой контракт-право на поставку им продукции", который бы нужно как-то "раскатывать" на год.. и т.п.

В принципе одна из идей работать не с одним .dat , а с несколькими (т.е. разбить этот большой массив на несколько). Это первое, что вроде как напрашивается.

Еще один вариант - это как-то уменьшить формат числа в DIMе. Ситуация такая: одинарной точности - много, а от -32000 до 32000 - мало, нужно максимум иметь число скажем 999 млн. с двумя знаками после запятой.
Вопрос: можно ли создать в VBA какой-то пользовательский формат, лежащий между FFFF и FFFF FFFF? Например FF FFFF?
parshin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивами lindstorm Помощь студентам 0 05.12.2011 18:25
Работа с массивами Jeffrey_4 Помощь студентам 2 30.09.2011 15:41
Работа с массивами pashqa Помощь студентам 2 27.05.2011 15:23
Работа с массивами(Си++) GNick Помощь студентам 2 12.01.2010 00:27
Работа с массивами Stelix Паскаль, Turbo Pascal, PascalABC.NET 1 20.06.2008 11:37