Format даты

Автор RAN, 13 ноября 2014, 19:07

0 Пользователи и 1 гость просматривают эту тему.

RAN

#15
Глянул мельком.
Есть интересное.
Ладно, будем поглядеть внимательнее.
:beer:  и баиньки

RAN

#16
Поглядел.
Переделал.
Сама обработка массива на словаре значительно быстрее. Но проблема с выгрузкой на лист средствами VBA. Время на выгрузку равно времени обработки на StarBacic.
Сделал смесь. Работает шустро.
Столкнулся с проблемой - не сумел создать одномерный массив массивов для использования в setDataArray.
Пришлось масив формировать словарем, что не есть гут.

Спутствующая проблема. С превеликим трудом сыскал, как редактировать и создавать кнопки. Но теперь не могу сделать, чтобы при открытии файла кнопки НЕ БЫЛИ в режиме радактирования.

JohnSUN

Цитата: RAN от 14 ноября 2014, 19:10
Сама обработка массива на словаре значительно быстрее.
Возможно, хотя и не факт. Как ты думаешь, на других системах (Mac, Linux) оператор CreateObject("Scripting.Dictionary") сработает так же?
Цитата: RAN от 14 ноября 2014, 19:10Но проблема с выгрузкой на лист средствами VBA. Время на выгрузку равно времени обработки на StarBacic.
В смысле, в Range затолкать массив value? Ты меня озадачил... Не должно бы тормозить - суть операции одна и та же, значит и скорость должна быть сопоставима с setDataArray.
Цитата: RAN от 14 ноября 2014, 19:10
Столкнулся с проблемой - не сумел создать одномерный массив массивов для использования в setDataArray.
Так и не создавал бы! Это же Basic! Dim имеешь право воткнуть в любом месте. Вот понадобился тебе массив определённого размера, тут же и пишешь
Dim etoDlyaVyvodaVList(0 To размер)и сразу начинаешь его заполнять...
Цитата: RAN от 14 ноября 2014, 19:10
Пришлось масив формировать словарем, что не есть гут.
Согласен... как-то это не кошерно... Глянь в Справке функции Array и DimArray.
И там у тебя в закомментированных строчках попадаются ReDim. Я сильно не вникал, почему ты от них отказался, но просто напоминаю про ключевое слово Preserve (это не ругательство, это "меняй размерность, но данные не трогай")
Цитата: RAN от 14 ноября 2014, 19:10
Спутствующая проблема. С превеликим трудом сыскал, как редактировать и создавать кнопки. Но теперь не могу сделать, чтобы при открытии файла кнопки НЕ БЫЛИ в режиме радактирования.
Браво! С трудовой победой тебя!  :beer: (Быстро управился - я в своё время дня три на это убил)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RAN

Цитата: JohnSUN от 14 ноября 2014, 18:15и сразу начинаешь его заполнять...
А он не заполняется. Вместо нужного массива массивов  получается погода в Африке. Либо пустой (ReDim внутри цикла), либо полностью заполнен последним значением   (ReDim вне цикла).
Как раз в закомментированной части.


JohnSUN

Ну, в общем, там должно быть как-то так:
arr(i) = DimArray(3)
arr(i)(0) = ...
...
arr(i)(3) = ...
То есть в вариантную переменную (в i-тый элемент массива arr) запихиваем результат DimArray(3) - новый вариантный массив на четыре элемента (0 To 3) и заполняем его значениями... Но, если LibreOffice уже давно такую запись понимает и выполняет, то AOO только недавно раздуплился, старые версии требовали этот новый массив создавать в отдельной переменной, заполнять и только в конце закидывать в arr(i).
tmpArr = DimArray(3)
tmpArr(0) = ...
...
tmpArr(3) = ...
arr(i) = tmpArr
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RAN

Обалдеть.
redim arrtmp(0 to 3)
и
arrtmp = DimArray(3)
дают в конце прохода абсолютно идентичные массивы arrtmp.
Но при использовании redim arrtmp происходит перезапись ранее записанного на обнуленный массив, а при  использовании DimArray - нет.  ??? ???

JohnSUN

Не парься... Бери бутылку - без ста грамм не разберёшь - и пройдись в отладчике пошагово еще раз...
ReDim - оставляет в переменной тот же адрес на башку массива, который был задан изначально. Любые телодвижения с элементами этого массива - это работа с первоначальным массивом. В arr(i) закидывается адрес этого массива... Если ты его не меняешь, то во все элементы массива arr попадёт одно и то же значение - ссылка на начало одного и того же массива...
Ещё не запутался? ОК, продолжим...
DimArray(3) создаёт новый массив... Ну, выгребает из свободной памяти что-то подходящее по размеру и запоминает адрес головы этого массива в переменной arrtmp. Уловил? Подменяет старую ссылку на ссылку на новую область памяти! Ну и потом в массив arr будет писаться уже этот, новый адрес - поэтому все элементы arr будут ссылаться на разные области памяти (на разные массивы)...
Знаю, сейчас начнёшь возмущаться, что в "нормальных" языках работа со ссылочными переменными пишется явно, чтобы не путаться... Не верю! Это ты не искренне! (наливай)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RAN

Цитата: JohnSUN от 14 ноября 2014, 20:59пройдись в отладчике пошагово еще раз
И где в отладчике видно, что arr(i) = arrtmp это ссылка на адрес arrtmp в памяти?
Тут не бутылку надо, ведра не хватит.

А двухмерный массив на лист как выгрузить?
Вариант .Cells(2, 11).Resize(UBound(arr), 4) = arr работает слишком долго

JohnSUN

Цитата: RAN от 14 ноября 2014, 23:18
Тут не бутылку надо, ведра не хватит.
То есть против метода познания возражений нет, вопрос лишь в количестве?  :beer:
Цитата: RAN от 14 ноября 2014, 23:18
А двухмерный массив на лист как выгрузить?
Быстрее всего - "перепаковать" в массив массивов и шарахнуть в лист одним оператором. Да, понимаю, что на первых порах это непривычно... Просто постарайся всё время думать о листе как о коллекции только строк. А уже отдельная строка - коллекция ячеек. И тогда этот самый массив массивов становится очень наглядным.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне