Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 След.
Совместимость .XLSB в разных версиях Excel?
 
Alexcx, пару раз сталкивался с тем, что xlsb вдруг переставал открываться, но подробностей не помню.
А с другими своими файлами этот же трюк повторить не пробовали? Чтобы понять, насколько стабильный эффект)
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
Цитата
irabel написал:
А прямое копирование разве проходит мимо буфера обмена?
До ваших результатов считал, что да.. Какой смысл задействовать буфер обмена, если известен пункт назначения? Это как если бы Васе нужно было переложить пачку денег из правой руки в левую, но он задействовал бы для этого еще Петю) Да и Майкрософт говорит про необязательный параметр Destination метода Copy вот что:
Цитата
Specifies the new range to which the specified range will be copied. If this argument is omitted, Microsoft Excel copies the range to the Clipboard.
Что, конечно, можно интерпретировать по-разному, но как-бы намекает, что если destination не указан, то копирует в буфер, а если указан, то просто создает в нужном месте копию. И это косвенно подтверждает ваш антивирус тоже.
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
irabel, во-первых, там нет ничего такого, а во-вторых – вы результаты-то видели? через буфер обмена получается в десятки раз быстрее, чем при прямом копировании. Поэтому и антивирусы не на первом месте среди подозреваемых. Да и временно отключить я их сам не смогу, надо сначала гипотезу с версиями Excel опровергнуть.
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
Проверил на 2007.

test1: 0.16
test2: 0,31
test3: 0,30
test4: 0,01

То есть так, как оно по идее должно быть, и как у sokol92 на 2016.
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
Цитата
sokol92 написал:
Я думаю, что попытка за 0,66 сек 100 раз обновить буфер обмена является непростой задачей для MS Windows
Тем не менее у меня на разных машинах оно работает гораздо быстрее, чем прямое копирование. Это и странно. И сильно сомневаюсь, что это как-то может повлиять на стабильность. Следующая после Copy операция не начнет выполняться, пока не завершится копирование, а копирование не завершится, пока винда не скажет, что оно завершилось)
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
Цитата
nilske написал:
А какая может быть закономерность для разных машин, с разным объёмом свободной памяти, и набором программ, в частности, разными антивирусами )

Закономерность такая, что по идее (и как пишет sokol92, ) на любом компе и на любой версии excel первый метод должен работать быстрее, чем второй и третий. Плюс по идее драматической разницы между ними быть не должно. Но пока что на разных компах 2019 и 2021 ведут себя с точностью до наоборот. Если у кого-то под такими же версиями будет работать так, как ожидается (особенно интересно посмотреть на 2019 32-разрядную), то гипотезу о зависимости от версий Excel можно будет отбросить, а она пока основная.
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
sokol92, так я бы тоже оставался при таких же рекомендациях, если бы не увидел то, что вижу на 19 и 21 версиях Excel:) На разных машинах. Кстати, и диапазоны копируются точно так же. Rows(n).Copy Rows(m) проворачивается от двух до двадцати раз медленнее, чем Rows(n).Copy: Rows(m).PasteSpecial. У вас нет возможности проверить на других версиях? Вечером попробую на 2007.

Цитата
sokol92 написал:
P.S. У Вас макрос находится в модуле листа (а не стандартном модуле), так что не запускайте его кнопкой.
Намеренно находится там для чистоты эксперимента, потому что в конкретной задаче он может находиться только там. Кстати, а кнопка чем помешает?

Цитата
sokol92 написал:
P.P.S. После команды PasteSpecial, если буфер обмена больше не нужен, лучше добавить строку:К
Это просто тест, в реальном коде все на месте.

В общем, граждане! У кого есть возможность прогнать на своих компах, не проходите мимо. Любопытно же. Может хоть какая-то закономерность определится.
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
sokol92, такое впечатление, что вы вообще не вникали в то, что я писал выше и в результаты выложенного примера тоже.

Цитата
sokol92 написал:
Общее замечание - следует минимизировать число взаимодействий между VBA и Excel
Я знаю, как оптимизировать обработку данных, сводя к минимуму взаимодействие с ячейками напрямую (обработать таблицу с миллионом строк и парой сотен столбцов за секунды – не проблема). Но как вы сформируете любую итоговую таблицу с нужный форматом КАЖДОЙ отдельной ячейки в ней, не взаимодействуя с Excel?

Цитата
sokol92 написал:
100 раз копируют информацию ... Копирование диапазона ячеек во много раз быстрее
100 – это как раз приблизительное число ячеек итогов в конкретной задаче, которые необходимо отформатировать в соответствии с данными и форматами ячеек на других листах. Думаете, я с диапазонами работать не умею?)

Цитата
sokol92 написал:
Методы 2-3 100 раз копируют информацию в буфер обмена и вставляют информацию из буфера обмена. В эффективных программах необходимо минимизировать количество таких операций.
Вы не заметили, что результаты теста противоречат вашим рекомендациям (и моим ожиданиям, кстати, тоже)? Внезапно через буфер обмена получается раз в 10 быстрее))

Короче, вопрос остается: в чем прикол? Почему на практически одинаковых машинах с плюс-минус одинаковыми процессорами, одинаковым объемом оперативы и соседними версиями Excel время выполнения операции копирования ячеек может отличаться в десятки раз? И как это можно обойти?
Пока что нашлось одно странное решение: вопреки интуиции, здравому смыслу и рекомендациям sokol92,  копировать через copy-pastespecial (на одних машинах получается быстрее раза в два, на других – в десять).

Может быть все-таки есть другие способы?
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
sokol92
Во вложении простой пример.
Отличия по времени выполнения соответственно примерно в 20, в 4, в 3 и в 5 раз.
Способы 2 и 3 периодически меняются местами по скорости, но общее соотношение сохраняется. Особенно впечатляет отличия для самого очевидного (казалось бы) и короткого по коду способа копирования. Вместо этого, оказывается, гораздо быстрее получается перенести сначала значение, а потом скопировать формат.
Изменено: dhead - 23.04.2025 12:01:42
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
Пример выложить не могу, к сожалению. Но я описал все предельно точно. Именно операция копирования ячейки в ячейку (обе находятся на одном листе) и присвоение ячейки числового формата (cells(r,c).numberformat = str) на одном файле с одними и теми же данными на одних компах выполняется в десятки раз медленнее, чем на других. А в какой-нибудь день может пролететь за доли секунды, но потом опять тупит. А на других компах всегда работает быстро.

И это тестовый файл, в котором ничего не меняется. Но сталкивался с этим и на других файлах тоже, в основном именно при копировании ячейки в ячейку. Завтра поэкспериментирую на чистых файлах с чистым кодом, может быть прояснится что-нибудь.
VBA. Медленная работа cells.copy и cells.format, На некоторых компьютерах.
 
Периодически напарываюсь на такое, но универсального решения не нашел.
Может кто-то уже сталкивался и нашел причины и методы обхода.

Проблема: один и тот же файл с одним и тем же кодом на одних компах обрабатывается быстро (1-2 секунды), на других -- медленно (30-40 секунд). Тормоза начинаются на копировании одной(!) ячейки в другую (cells(r1,c1).copy cells(r2,c2)) и на присвоении формата одной ячейке или диапазону из нескольких ячеек. На каждую такую операцию уходит в десятки раз больше времени на условно "медленных" компах, чем на "быстрых".

Разумеется, все большие данные обрабатываются в массивах, работа непосредственно с ячейками нужна только для формирования таблицы с отчетом.

ScreenUpdating, Calculation и все такое прочее установлены правильно, да и на данном конкретном коде не сильно влияют на скорость (размер таблицы небольшой).

Загадочности добавляет тот факт, что иногда и на "медленных" компах оно вдруг начинает проворачиваться быстро, но потом снова тупит. Есть незначительные отличия в железе, плюс на некоторых компах под 64-разрядной windows установлен 32-разрядный Excel. Есть подозрение, что именно на 32-разрядных Excel 2019 происходит такой тупняк, но статистику еще не собрал.
Совместное редактирование файлов Excel, Поиск вариантов одновременной работы в Exel модели без shared desk
 
Jul_25, приложение писал на VBA, принцип работы похож на тот, что описан Михаилом выше: у каждого пользователя свой excel файл, синхронизация данных осуществляется через промежуточные xml файлы, которые находятся в сетевой папке. Есть главный пользователь, который создает таблицу, других пользователей и группы, настраивает поля, которые доступны для редактирования и т.д. Каждая строка имеет свой id и набор статусов с информацией об изменениях. Также предусмотрен механизм защиты целостности данных при работе с копиями файлов пользователей и много чего еще.
Но прежде чем все это начинать делать, стоит хорошенько подумать над другими способами реализации вашей задачи)
Изменено: dhead - 10.04.2025 10:54:01
Избавиться от появления фоновых процессов Excel
 
asesja, я понимаю, что причин может быть много. В описанных случаях несколько из них явно присутствуют (вылеты при работе с макросами на тяжелых и кривых файлах, или при работе с sap, например), но они малоустранимы: таких файлов и макросов дофига и далеко не все из них даже можно поправить, так как они могут поступать извне.  

Мой вопрос, скорее, подразумевал гипотетическое существование решения, которое позволит игнорировать зависший в фоне процесс так, чтобы новый экземпляр запускался в полноценном режиме со всеми подключенными ранее надстройками (а они отключаются разом все). Кстати пришла сейчас в голову мысль: проверить запуск с ключом /x с подвисшим в фоне процессом. Может сработает. Но тоже костыль, конечно. Даже если как-то извратиться с запуском в таком режиме по двойному клику, то несколько тяжелых файлов наверняка будут отжирать памяти заметно больше.
Избавиться от появления фоновых процессов Excel
 
Периодически сталкиваюсь с ситуацией, когда после закрытия Excel файлов (иногда штатного, иногда после подвисаний тяжелых файлов), в фоновых процессах остается Microsoft Excel или просто какая-нибудь excel книга. То есть среди работающих приложений екселя нет, в панели задач, соответственно, его тоже нет, а в фоновых процессх висит excel.exe.

Если при этом запустить Excel (из меню пуск, например, или просто двойным кликом по книге), слетают все надстройки.
Лечится только снятием задачи в диспетчере задач.

Выявить однозначную закономерность не удается (разные компы, разные версии excel, разные файлы), но есть подозрение, что такое происходит, когда текущий процесс не успевает завершиться, а пользователь уже снова пытается открыть экселевский файл двойным кликом.

Вопрос: есть ли способ каким-то образом предотвратить такие зависания процессов в фоне?

Пока сделал костыль в виде vbs-скрипта, который убивает все фоновые ексели, чтобы не тратить время на их поиск в диспетчере, но хотелось бы найти более правильно решение:)
Совместное редактирование файлов Excel, Поиск вариантов одновременной работы в Exel модели без shared desk
 
Jul_25,  делал нечто похожее на то, что вам надо (без режима общего доступа, но достаточно быстрым обновлением в реальном времени, с возможностью настройки доступов к отдельным полям -- что можно редактировать, а что нет, с разделением пользователей на группы и т.д), но это совсем не тривиальная задача. Получается не макрос, а большое приложение в Excel )
Изменено: dhead - 04.04.2025 18:29:01
VBA. Две переменные double с одинаковыми значениями не равны друг другу, в чем подвох?)
 
Отвлекся на другие дела, вернулся, чтобы завершить тему)

Hugo, посмотрел в xml и да, где-то так: <v>14986.39</v>, а где-то так: <v>17234.349999999999</v>.
При этом все значения, которые можно увидеть на листе или в отладчике имеют два знака после запятой. И похоже, что арифметические операции работают с реальными значениями, поэтому в моем случае 35180668,48 - 35180668,48  =  1,49011611938477E-08 (что не очень похоже на нуль). И мы бы этого даже не заметили, если бы subtotal на низком уровне работал ровно так же, как обычное сложение. Тогда совпадали бы не только "видимые" значения, но и реальные.

В общем, нужно повесить плакат над рабочим местом: "Не забывай про точность вычислений!" с суровым токарем со стальной болванкой в руке.
И, как советует testuser, в сомнительных случаях сравнивать преобразованные в строку значения (потому что такое преобразование работает именно с "видимыми" значениями числовых переменных).
Изменено: dhead - 04.04.2025 11:02:39
VBA. Две переменные double с одинаковыми значениями не равны друг другу, в чем подвох?)
 
Цитата
Hugo написал:
Переменные заполнены изначально данными из ячеек?
Косвенно.
Значения в массиве получаются суммированием данных из других массивов, которые скопированы из диапазонов.
А checksum получается из функции subtotal 9.
Проблему обошел радикально, избавившись от subtotal. Но любопытство спать не дает)
XML  гляну завтра, но что там может быть не так?  Допустим, лежит что-то, что больше, чем double, при суммировании считается не как double, а потом впихивается в double c потерей точности. А subtotal честно считает даблы. Или наоборот. Но тогда эти даблы в итоге отлчались бы на самом деле. А они вроде как равны)
VBA. Две переменные double с одинаковыми значениями не равны друг другу, в чем подвох?)
 
Как такое может быть?

Да, я помню, что исходный тип числа, которое хранится в variant, после арифметических операций может повыситься до следующего уровня точности, но VarType в обоих случаях выдает код double, да и в Immediate оба значения вроде как совпадают.
Изменено: dhead - 31.03.2025 23:29:45
Не открывается другая книга, когда выполняется bat из vba.
 
EShikh, да, если они открыты (или пытаются быть открытыми) в одном экземпляре excel. У меня для подобных случаев на рабочем столе лежит ярлык со ссылкой на excel с ключом /x. Например, у вас открыта модальная форма в какой-то книге. Если вы захотите открыть другой файл, он не откроется, пока вы не закроете форму. Но если кинете этот файл на такой ярлык, он спокойно откроется в новом экземпляре.
Изменено: dhead - 06.03.2025 09:12:18
Не открывается другая книга, когда выполняется bat из vba.
 
EShikh, еще бы посмотреть батник, конечно, но если я правильно понял проблему, ее решит запуск excel отдельным процессом.
Exel сам расширяет вниз диапазон фильтра. Как этого избежать?, Сабж, собственно
 
А переделать в умные таблицы? Как часто файл обновляется?
Файл на рабочем компе посмотреть не могу, к сожалению.
Изменено: dhead - 18.02.2025 13:03:10
VBA. Автофильтр до определенной строки таблицы.
 
sokol92, да, уже сам допер, вроде как очевидно же) Спасибо!
VBA. Автофильтр до определенной строки таблицы.
 
nilske, я и задался вопросом: есть ли другой способ?
VBA. Автофильтр до определенной строки таблицы.
 
Sanja, мне казалось, что максимально конкретно объяснил: при нажатии на значки фильтров в столбцах значения из последней строки не должны попадать в список фильтруемых значений. Файл с примером вложил.
VBA. Автофильтр до определенной строки таблицы.
 
Sanja, решение макросом и подразумевалось. Только что именно сделать нужно? Сформулирую точнее: в самом файле макросов быть не должно, т.е. разнообразные манипуляции с расширенным фильтром и т.д. не подходят. Но генерит его макрос, на этом этапе можно делать все, что угодно, но я так и не придумал, что именно.
VBA. Автофильтр до определенной строки таблицы.
 
Видимо, кроме вставки пустой строки, решения нет. Я, во всяком случае, ничего другого не вспомнил и не нашел)
VBA. Автофильтр до определенной строки таблицы.
 
Всем привет.

На картинке – пример таблицы с автофильтром, в которой нужно фильтровать строки со второй по третью, а в четвертой строке могут быть какие-то итоговые данные, неважно. Автофильтр, как водится, сам продлевает фильтруемый диапазон до последней строки, даже если использовать метод Autofilter для диапазона A1:C3. То есть в список фильтра первого столбца попадает пустая строка, в список второго столбца – "zzz" и т.д.

Может мне приснилось, но вроде как можно было каким-то образом обходить эту особенность автофильтра. И не только вставкой пустой строки перед последней, итоговой. Или других способов нет?

Защита файла Excel от несанкционированного копирования, Защита файла Excel от несанкционированного копирования
 
Цитата
New написал:
надёжно - написать весь свой код на С++ и скомпилировать его в DLL, а потом подключить этот DLL к файлу.
Автор темы хочет защитить файл от копирования. Привязать его к конкретному устройству. Что мешает скопировать файл вместе с библиотекой? В любом случае потребуется мудрить с привязкой.
Защита файла Excel от несанкционированного копирования, Защита файла Excel от несанкционированного копирования
 
DimoN233, еще был способ попроще и бесплатный)

Раньше WIN API позволяла (может и сейчас так можно) писать и читать данные на диске сразу за  концом файла. Если размер файла не кратен размеру сектора, то эти данные будут защищены от затирания (т.к. запись любого другого файла начинается с начала сектора).

Соответственно, схема такая: часть функций тоже выносим в dll, создаем какой-нибудь очень нужный конфиг-файл, который должен лежать рядом с вашим excel-файлом, при инсталляции всего этого добра пишем за концом этого файла какую-нибудь метку и периодически проверяем из dll наличие этой метки.

И да, устанавливать ваш файл на конкретный комп должны вы сами из вашего суперсекретного инсталлятора)
Защита файла Excel от несанкционированного копирования, Защита файла Excel от несанкционированного копирования
 
DimoN233, я использовал аппаратные ключи Guardant.
Запихивал пару функций в dll (можно выбрать плюс-минус любой компилируемый язык, я писал на delphi) и гонял  из dll в ключ и обратно некоторые переменные и константы. Сломать можно все, но в таком варианте уже потребуются специальные знания и навыки. И да, ценность вашего файла должна быть больше, чем стоимость ключей))
Страницы: 1 2 3 4 След.
Наверх