Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

7 Март 2021, 05:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2   Вниз
  Печать  
Автор Тема: Format даты  (Прочитано 9060 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RAN
Участник
**
Offline Offline

Расположение: Н. Новгород
Сообщений: 40

Мяв? Мяв!


« Ответ #15: 13 Ноябрь 2014, 23:30 »

Глянул мельком.
Есть интересное.
Ладно, будем поглядеть внимательнее.
 Всё хорошо  и баиньки
« Последнее редактирование: 13 Ноябрь 2014, 23:33 от RAN » Записан
RAN
Участник
**
Offline Offline

Расположение: Н. Новгород
Сообщений: 40

Мяв? Мяв!


« Ответ #16: 14 Ноябрь 2014, 19:10 »

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

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

* temperature_macro(1).ods (65.6 Кб - загружено 6 раз.)
« Последнее редактирование: 14 Ноябрь 2014, 19:14 от RAN » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #17: 14 Ноябрь 2014, 20:15 »

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

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
RAN
Участник
**
Offline Offline

Расположение: Н. Новгород
Сообщений: 40

Мяв? Мяв!


« Ответ #18: 14 Ноябрь 2014, 20:43 »

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

Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #19: 14 Ноябрь 2014, 21:14 »

Ну, в общем, там должно быть как-то так:
Код:
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
Участник
**
Offline Offline

Расположение: Н. Новгород
Сообщений: 40

Мяв? Мяв!


« Ответ #20: 14 Ноябрь 2014, 21:37 »

Обалдеть.
Код:
redim arrtmp(0 to 3)
и
Код:
arrtmp = DimArray(3)
дают в конце прохода абсолютно идентичные массивы arrtmp.
Но при использовании redim arrtmp происходит перезапись ранее записанного на обнуленный массив, а при  использовании DimArray - нет.  Непонимающий Непонимающий
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #21: 14 Ноябрь 2014, 22:59 »

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

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
RAN
Участник
**
Offline Offline

Расположение: Н. Новгород
Сообщений: 40

Мяв? Мяв!


« Ответ #22: 14 Ноябрь 2014, 23:18 »

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

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

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #23: 14 Ноябрь 2014, 23:29 »

Тут не бутылку надо, ведра не хватит.
То есть против метода познания возражений нет, вопрос лишь в количестве?  Всё хорошо
А двухмерный массив на лист как выгрузить?
Быстрее всего - "перепаковать" в массив массивов и шарахнуть в лист одним оператором. Да, понимаю, что на первых порах это непривычно... Просто постарайся всё время думать о листе как о коллекции только строк. А уже отдельная строка - коллекция ячеек. И тогда этот самый массив массивов становится очень наглядным.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: « 1 2   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!