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

Страницы: 1
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
 
Периодически сталкиваюсь с ситуацией, когда после закрытия Excel файлов (иногда штатного, иногда после подвисаний тяжелых файлов), в фоновых процессах остается Microsoft Excel или просто какая-нибудь excel книга. То есть среди работающих приложений екселя нет, в панели задач, соответственно, его тоже нет, а в фоновых процессх висит excel.exe.

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

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

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

Пока сделал костыль в виде vbs-скрипта, который убивает все фоновые ексели, чтобы не тратить время на их поиск в диспетчере, но хотелось бы найти более правильно решение:)
VBA. Две переменные double с одинаковыми значениями не равны друг другу, в чем подвох?)
 
Как такое может быть?

Да, я помню, что исходный тип числа, которое хранится в variant, после арифметических операций может повыситься до следующего уровня точности, но VarType в обоих случаях выдает код double, да и в Immediate оба значения вроде как совпадают.
Изменено: dhead - 31.03.2025 23:29:45
VBA. Автофильтр до определенной строки таблицы.
 
Всем привет.

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

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

Не работает маркер автозаполнения для ячейки со списком на защищенном листе.
 
Собственно, суть описана в названии темы: на защищенном листе имеются незащищенные ячейки, в том числе с выпадающим списком. Если навести курсор на маркер автозаполнения ячейки со списком, курсор не меняется, автозаполнение "протягиванием" не работает. При этом любая другая ячейка без списка прекрасно "протягивается" на том же защищенном листе. Раньше с таким не сталкивался, очередной баг?
Изменено: dhead - 17.09.2024 00:02:12
Ribbon CustomUI не находит callBack функцию, Странное(?) поведение Ribbon CustomUI: теряются callBack функции, если активирована другая книга
 
Уже вторая "особенность" в поведении callBack функций Ribbon CustomUI.
Первую описывал здесь и до сих пор не нашел решения.

Вторая такая: если функция, вызываемая кнопкой в ленте через onAction, делает активной любую другую книгу, то после выполнения этой функции "теряются" все callBack функции, описанные в Ribbon CustomUI. В частности теряются getVisible для кнопок, что приводит к сообщениям типа "Не удается выполнить макрос такой-то. Возможно, этот макрос отсутствует в текущей книге, либо все макросы отключены", после чего, разумеется, все кнопки из кастомной ленты в моей книге пропадают. То есть похоже, что интерпретатор пытается искать коллбэки в активной книге, а не в той, которая содержит кастомную вкладку с кнопками и из которой вызывалась функция onAction.

Да, я могу в конце функции вызвать ThisWorkbook.Activate, но мне нужно после ее выполнения показать сообщение и сделать активной именно ту книгу, которая только что была создана. Пока не придумал ничего лучшего, кроме как вызывать активацию новой книги по таймеру через секунду, например, чтобы кнопки успели отрисоваться. Но это какой-то убогий способ.
Другие варианты обхода есть?
Изменено: dhead - 10.06.2024 11:45:12
CustomXMLParts, обращение по NameSpace
 
Всем привет.
Кто-нибудь имел дело с кастомными XML структурами в книге?
Такое ощущение, что справка расходится с реальностью, либо где-то что-то недоговаривают.

Пример:

Результат:

Другими словами, несмотря на явное указание неймспейса внутри XML, мой XMLPart остался без неймспейса, поэтому его нельзя выцепить ни по Item, ни через SelectByNamespace. При этом указанный неймспейс все-таки засветился в SchemaCollection.
Что я делаю не так?
Особенность сортировки диапазона с формулами, Баг или фича?
 
Убил кучу времени, пока сообразил, в чем дело:

Если в диапазоне есть формулы с относительными ссылками и явным указанием на текущий лист (например, на листе МойЛист в ячейке B1 — ссылка МойЛист!A1, в ячейке B2 МойЛист!A2 и т.д.), то при сортировке этого диапазона (например, по числовому столбцу C) такие ссылки не меняются, то есть обрабатываются, как абсолютные.

Это баг, прикол, или я чего-то не знаю?
Форматирование текста в комментариях\примечаниях
 
Похоже, что нет никакого способа отформатировать текст в комментариях, кроме параметров шрифта для части текста и полей с выравниванием для всего комментария. Или я чего-то не знаю?

Хотелось бы, в частности, иметь возможность вставить список с правильными отступами.
Оставить на листе только отфильтрованные строки, Без временных листов и других костылей
 
Есть строки на листе, которые отфильтрованы по нескольким столбцам. Нужно оставить на листе только отфильтрованное.
Можно инвертировать фильтры, чтобы удалить остальное, но это не всегда просто, поэтому нужен какой-то другой способ.
Копировать на временный лист не очень красиво.
Можно скопировать и вставить ниже последней строки, а потом удалить все строки выше, но тоже так себе..
Перебрать все строки, объединив непересекающиеся с отфильтрованными в union, а потом разом грохнуть?

Или я не знаю какого-то простого и очевидного решения?
Изменено: dhead - 06.03.2024 11:00:12
Определить наличие скрытых столбцов на защищенном листе
 
Что-то туплю.
На незащищенном листе можно проверить так:

Код
       if sht.Rows(1).SpecialCells(xlCellTypeVisible).Count <> sht.Rows(1).Cells.Count Then

а на защищенном листе в этом месте происходит run-time error 1004.

Перебирать все столбцы листа кажется не самым оптимальным решением. Тем более, что скрытый столбец никак не влияет на UsedRange, то есть перебирать надо все сколько-то-там-тысяч-столбцов. Дальше мысль не идет)
Application.Run не возвращает значение функции, Если функция в модуле листа
 
Всем привет.

Кто-то с таким сталкивался?

Никогда не было проблем с вызовами и возвращением результата функции через Application.Run из другой книги или надстройки.
Но видимо первый раз функция находится в модуле листа (такая необходимость) и возвращаемое значение всегда 0.
Пример сейчас выдерну, но может это какой-то известный баг? Поиск пока ничего не дал.
Ribbon CustomUI. getVisible для Tab, не работает с вкладкой с idQ
 
Всем привет!

Столкнулся с тем, что функция getVisible для вкладки (Tab) не вызывается, если для этой вкладки задан не id, а idQ.

Excel 2019, CustomUI14.

Это баг, фича, или правильное поведение (в доках от MS ничего об этом не нашел)?

Можно это как-то побороть?
Заметил, что если для вкладки idQ не задавать label, то, при ее отсутствии в других открытых документах, она не отображается в ленте, то есть вроде как получается тот же эффект, как если бы мы сделали ее невидимой через свойство getVisible. Опять же ничего не нашел об этом в документации, поэтому неясно, можно ли пользоваться таким маневром на постоянной основе (ведь теоретически вкладку можно отображать и без надписи)?
.OnAction с параметрами, работает, но глючит с xlsb
 
Всем привет и доброго утра)

Допустим, у нас на листе есть комбобокс (shapes(1)), которому в зависимости от разных условий мы хотим назначать обработчик (test (n as Long)), каждый раз передавая ему новый параметр n.

Как советуют опытные люди, параметры в onAction можно передавать незамысловатой  конструкцией:

Лист1.Shapes(1).onAction="'Лист1.test  " & n & "'"

И все это прекрасно работает, пока файл сохранен в xlsm.
Но после сохранения в xlsb и при попытке его открыть, Excel сообщает об ошибке в части содержимого книги и предлагает ее починить. После починки снова все работает, но после сохранения файла цикл повторяется (сообщение об ошибке, восстановление и т.д.).

Кто-нибудь знает, что с этим делать? Нужен именно xlsb файл.

Версия Excel 2019, но и в 2007 то же самое.
Изменено: dhead - 02.10.2023 02:59:41
Странное поведение FileCopy, Ошибка 75 при копировании файла из одной сетевой папки в сетевую
 
Странное поведение заключается в том, что ошибка происходит только при попытке копировать из сетевой в сетевую. На локальный диск из той же сетевой копируется без проблем.
Все права на чтение-запись и пр. есть -- в проводнике копируется тоже без проблем.

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

С длиной имен также все ок.

Короче, помогите, кто сталкивался и кто знает секрет:)
Изменено: dhead - 12.09.2023 20:37:34
Лишний клик при открытии формы
 
Привет всем.

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

Суть:

Если по событию страницы BeforeDoubleClick открывать форму, то в форму успевает пролететь одно из мышиных событий (Сlick, как минимум). И любой контрол формы, попадающий под курсор мыши, это событие, разумеется, схватывает и обрабатывает, меняя тем самым проинициализированные в Initialize и Activate значения.

Первые приходящие на ум решения (сдвигать мышиный курсор от формы, либо наоборот сдвигать форму от курсора) требуют задействования win api, что кажется довольно-таки громоздким способом с учетом того, что код должен работать под разными версиями  офиса и экселя (64 и 32 разрядными, например) и пихать ради избавления от такого бага пару десятков строк в каждую форму -- как-то не очень правильно.

Помещать  контролы в неактивный фрейм и ставить его в Enabled в последней строке обработчика Activate -- не помогает, событие все равно пролетает и обрабатывается. Ставить перед этой строкой паузу в секунду вроде помогает, но это как-то совсем тупо и ненадежно -- не факт, что на любом компе сработает.

Может кто-то знает простое и надежное решение?

Прикладываю простой пример.
При двойном клике по ячейкам открывается форма со списком, в котором ничего не должно быть выбрано. Если выбирать ячейки по краям, то все ОК. Если щелкать по центру экрана -- сразу выбирается строка из списка под курсором.
ListBox. Несоответствие выделенной строки значениям ListIndex и Text, Как корректно менять ListIndex при выборе строки пользователем
 
Раньше уже сталкивался с не очень предсказуемым поведением ListBox (здесь на форуме тоже есть такие примеры), но обычно удавалось придумать какое-то обходное решение, а тут застрял. Задача такая: нужно отслеживать выбор пользователя в листбоксе и при необходимости, в зависимости от других параметров, менять выделенную строку на другую.

Прикол в том, что если в OnChange менять выбор пользователя, то ListIndex, Text, Value меняются, а выделенная строка остается прежней. Все трюки с временной заменой фокуса и другими свойствами листбокса (locked, enabled и тп) ничего не меняют.

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

Приаттачил пример для наглядности: в списке значения от 0 до 9. Если пользователь выбирает значение больше трех, оно должно сбрасываться в 0.
По нажатию кнопки выводятся текущее состояние ListBox. На скрине видно, что после выбора пользователем последней строки, значения ListIndex и Техт равны нулю (как и требуется), а выделена все равно последняя строка.

Кто-то знает, как с этим бороться?
Изменено: dhead - 25.07.2023 10:53:46
Как задавать свойства элемента управления формы на листе?
 
Всем привет.

Я, очевидно, совсем туплю, но ответа не нашел: как задать свойства элемента управления формы (например, имя, рамку, фон и тп., — пусть это будет метка или кнопка) на листе?

Добавляю на лист, жму правую кнопку (хоть в режиме  конструктора, хоть в обычном режиме) выбираю "Формат объекта" и не вижу ничего, кроме перемещать\не перемещать, вариантов защиты и изменения размеров. Если элемент выделить и нажать кнопку "свойства" на вкладке разработчика, появляется окно свойств листа и в его выпадающем списке наверху нет других элементов.

Excel 2019 и 2007 — абсолютно одна картина.

Да, я могу программно задать все, что надо, но ведь  вроде как всегда можно было мышкой пощелкать?

И да, можно использовать элементы ActiveX, но после того, как очередное обновление скайпа без предупреждения обновило какие-то компоненты офиса (2007) и ActiveX перестали работать на листах (лечится, как я понял, чуть ли не переустановкой даже не самого офиса, а всей винды), я предпочитал добавлять кнопки на лист(если была такая необходимость) именно из элементов управления.
Изменено: dhead - 20.07.2023 15:00:39
Страницы: 1
Наверх