|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
|
Как удалить "хвосты" от удаленных вручную листов рабочей книги?07.07.2025, 19:14. Показов 5503. Ответов 67
Метки нет (Все метки)
Добрый день.
Листы, создаваемые программным кодом, путем копирования из шаблонного, и имеющие программный код обработчиков своих предопределенных процедур, иногда (в результате сбоев в работе и остановки исполнения кода по ошибке) не могут быть так же -программно- и своевременно удалены из книги и остаются в виде не нужных "хвостов". Я периодически затирал их вручную тупо удалением листа через контекстное меню ярлыка листа и считал, что этого достаточно. Как выяснилось, в инспекторе объектов эти объекты продолжают существовать, но не могут быть там же удалены вручную. Соответствующая опция просто не активна. По имени листа, например WorkSheets("Лист1").Delete программно он тоже не собирается удаляться. Ошибка. Перебор листов рабочей книги через For Eaсh вообще не замечает их существования. Как будто их нет. Как избавиться от таких объектов?
0
|
|
| 07.07.2025, 19:14 | |
|
Ответы с готовыми решениями:
67
Найти итоги из всех листов другой книги и записать в факт для всех выделенных значений рабочей книги
Как в Excel печатать на одном листе бумаги сразу несколько листов рабочей книги |
| 09.07.2025, 17:30 | |||
|
Добавлено через 18 минут Решение я вижу такое, это можно сделать программно: 1) скопировать все листы в новую книгу. 2) экспортировать все модули vba с помощью VBE 3) импортировать эти модули в vba-проект новой книги.
0
|
|||
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
||||
| 09.07.2025, 17:44 [ТС] | ||||
|
Макросов, которые бы создали листы и удалили их - очень мало среди постоянно находящихся в работе. Отдельные макросы создают листы. Потом пользователь работает с этими листами и Логпрог интерактивно отрабатывает иные макросы, которые дают пользователю новые данные. Часто организуют переходы из отрисованной на листе таблицы к другой таблице, которая раскрывает суть какого-то выбранного пользователем параметра. Таким образом отдельно друг от друга существует несколько листов с обработчиками событий листа. Все обработчики спят и код не исполнется, пока пользователь не здействует какой-то из них какими-то действиями. Обработчики выполняют набор команд и снова код отстанавливает выполнение. А когда пользователь дает команду ХАРЭ, сворачиваем лист, то он удаляется с сохранением или без сохранения в БД правок, которые на нем сделаны. Т.е. код отрабатывает интерактивно по сотне раз, то запускаясь, то вновь останавливаясь отработав свое, реагируя буквально на каждое перемещение по листу и между листами и каждый раз производя какие-то узкие манипуляции с одним и тем же листом или группой. Т.е. разные макросы, запущенные и отработавшие свое в совершенно разное время, корпят над одним и тем же листом данных. Добавлено через 5 минут Добавлено через 2 минуты Как бы, да. Вариант рабочий. Но, наверняка же имеется прямое решение по удалению, без переноса данных в другую книгу... Должно быть. Просто мы не знаем, как это делать.
0
|
||||
|
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,360
|
||
| 09.07.2025, 17:50 | ||
Сообщение было отмечено MikeVol как решение
РешениеНе?
0
|
||
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
|
| 09.07.2025, 17:54 [ТС] | |
|
Как вариант. Но тогда в работе будет уже два обработчика с макросами. Первый - это сам логпрог с его набором функций. И второй - это временный файл со всеми этими листами, каждый из которых имеет обработчики стандартных событий листа. В принципе, решение довольно интересное, потому что позволяет из Логпрог сделать полноценную надстройку, работающую в фоновом режиме. Я подумаю над этим. Спасибо. Но вопрос темы все равно остается актуален чисто из-за обретния знаний )))
0
|
|
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
|
| 10.07.2025, 06:28 [ТС] | |
|
В создании классов дуб. Не пользовался этой возможностью. Смутно представляю себе, как это лист окажется без кода если модули класса присутствуют? А как они вызываются, если не кодом обработчика события листа?
У меня нет кнопок для каких-либо команд. Весь интерфейс реализован на оценке положения активной ячейки. Определенный набор изменения положений воспринимается как команда. Так же, как команды воспринимается двойной клик, нажатие правой кнопки мыши, Enter и Tab как без обработчиков onkey и задействования предопределенных обработчиков событий листа можно это реализовать?
0
|
|
| 10.07.2025, 06:52 | ||
|
0
|
||
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
||
| 10.07.2025, 07:11 [ТС] | ||
|
Да, увы, код регулярно дописывается и сбои после новых дописок всегда проскакивают. Например, сегодня утром прекрасная новость, порожденная новым кодом. Вдруг оказалось, что в отдельно сохраняемых книгах имя листа почему-то иной раз задается с обрамляющими ковычками. Как так происходит - фиг знает. Если в ярлычке листа смотришь его название - там не предраться. Оно такое же, как и должно быть. Если наводишь курсор на переменную с именем листа, то контекстная подсказка в редакторе VBA - тоже не выдает засады. Все корректно. И только лишь Watch окно наблюдения за значением переменной выдало суть проблемы. Только внем видно, что лист имеет имя, которое обрамлено в доп. пару ковычек. Откуда сия зараза прет и почему не в каждом случае, а в отдельных - надо еще разбираться. Но факт... вот такие вот сюрпризы - они вылезают не сразу порой. И дело тут не в не объявленных переменных. В коде, который генерирует файл с этими листами - все объявлено. Нет переменных отладочных никаких. Просто либо глюк, который придется обходить заплатками, либо сам где-то профукал. Буду искать еще. Но скорее всего глюк, потому что присвоение имени листа не прямое, а через string переменную, берущую значение из ячейки. В ячейке точно нет никакого обрамления в ковычки. Мне лень лишиние ковычки рисовать. Я этого не делаю. А вот откуда их выковырял сам Ексель - вопрос века! Кстати, к числу таких условно глюков, которые приходится латать, например относится результат выполнения ThisWorkBook.path
Ну кто бы мог подумать, что на разных версиях Ексель и ОС он выдает разное? В одних случаях с закрывающим слэшем, в других - без него. И вот работает себе прога нормально, пока ее не перенес на другой комп. И таких моментов дохрена. Я вот не понимаю эти истории про хороших програмеров, которые все это могут предвидеть. Скорее, подобные суждения идут от недостатка опыта от людей, ничего серьезного не создававших и ограничивавшихся процедурками в два десятка строк кода. Для них применение Option Explicit - потолок профессионализма.
0
|
||
|
|
||||||
| 10.07.2025, 09:57 | ||||||
|
Посмотрел код чуть внимательнее - на предмет архитектурных улучшений - но бесполезно.
Кто-то пропускает свой код через обфускатор, а Вы , Сфалерит, пишите как будто специально как обфускатор. Обработчик событий всех листов можно сделать один, в модуле ЭтаКнига
Добавлено через 6 минут Но от событий в такой мешанине лучше бы отказаться, работать только кнопками. Еще лучше бы не добавлять удалять листы, а использовать наперед заданное число временных листов, каждый раз очищая их после использования. Но не уверен, что это концепция здесь подействует.
2
|
||||||
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
|
| 10.07.2025, 12:26 [ТС] | |
|
Я не совсем понял, как это один обработчик событий всех листов ?
Вот у меня допустим есть лист c названием "A1" и "есть" лист с названием "A2" Допустим, я в обоих листах по очереди сделал двойной клик. Один и тот же обработчик должен будет два раза отработать. Но каким образом ему будет передаваться выполнение? Что запустит этот обработчик? Какое событие??
0
|
|
|
|
||||||
| 10.07.2025, 12:48 | ||||||
|
Двойной клик запустит каждый раз событие книги
1
|
||||||
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
|
| 10.07.2025, 13:55 [ТС] | |
|
Благодарю, для меня открытие, что так тоже можно. Был уверен, что события вызывают сооответствующие обработчики исключительно с привязкой к конкретному листу. Т.е. - сколько листов, столько и обработчиков BeforeDoubleClick нужно.
Не знал, что события можно транслировать через параметры. ))) Теперь мне предстоит перезагрузку матрицы в голове произвести, ввиду этого открытия )))
0
|
|
|
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,360
|
|
| 10.07.2025, 14:07 | |
|
Пример лайт:
1
|
|
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
||
| 10.07.2025, 14:23 [ТС] | ||
|
Если я сразу попытаюсь это внедрить, то мозг мой взорвется еще до внедрения. Нужно теперь созреть до понимания, что делать, чтобы аккуратно перевести алгоритм на новые рельсы. Пока сложно. Слишком много всего взаимосвязанного. Переключиться на мышление иными категориями нужно.
0
|
||
|
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,360
|
||
| 10.07.2025, 14:42 | ||
|
Пущай работают параллельно.
0
|
||
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
|
| 10.07.2025, 14:45 [ТС] | |
|
С этим уже поздно. Тут всю архитектуру приложения переделывать придется. Проще писать все заново, чем править то, что есть. Ибо нестыковок будет вылезать уйма. Утону в них. На основное ядро управления - AH, AR, AN - все параметры приложения завязаны. Эти три процедуры банкуют, раздавая указания и синхронизируя все остальные.
0
|
|
| 10.07.2025, 16:14 | ||
|
0
|
||
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
|
| 10.07.2025, 16:51 [ТС] | |
|
DoEvents експлуатировать в коде заложено. Можно не дожидаясь отработки одного "контекста" (работа процедур заполнения данными какого-то листа) запускать уже следующий. Такая необходимость возникает, когда запускается длительный процесс. Например анализ нового прайса и его автостыковка с уже существовавшими ранее с приблизительно похожими значениями. Сответствующая процедура пытается вычислить степень похожести названий товаров и наиболее похожие слинковать между собой. Процесс может занимать до нескольких часов, когда строк в стыкуемых прайсах по нескольку тысяч. Но, хоть этот функционал и работает, я избегаю его использования. И вот почему.
Слишком много переменных в проекте. Переменных уровня проекта. Все они активно взаимодействуют и меняют свои значения. Передавать их через заголовки процедур не реально. Но это не самое страшное. Больше печалит объем данных. Оперативка раздуется, если передавать не по ссылке, а по значению, плодя каждый раз новые экземпляры массивов данных. Параметры исчисляются сотнями. Поэтому побочный эффект не желательного использования и одновременного изменения одной и той же переменной двумя разными процедурами вразрез практически гарантирован. Т.е. последствия такой работы всегда рулетка. Поэтому, если так делаю, то лучше не дышать и тихо ждать, что будет дальше? Так что, DoEvents вариант признан мною нежелательным для данной архитектуры приложения, не гарантирующим стабильности работы. Однако, когда сильно надо - запускаю. Но не на всех операциях откатывает безошибочно. Еще проблема DoEvents связана с тем, что код под его контролем склонен самопроизвольно тухнуть. Обрывать цепочку исполнения на текущей процедуре, не возвращаясь к довыполнению предшествующей. Это тоже одна из его бед. Почему такое иногда происходит, я не совсем понимаю. Не смог найти закономерности.
0
|
|
|
bite
5009 / 4817 / 852
Регистрация: 13.04.2015
Сообщений: 10,082
|
|||
| 10.07.2025, 18:10 | |||
|
0
|
|||
|
55 / 55 / 1
Регистрация: 01.08.2019
Сообщений: 159
|
|||
| 10.07.2025, 18:19 [ТС] | |||
|
Добавлено через 1 минуту Контекст каждого создаваемого листа содержит десятки мегабайт информации. Ее нельзя каждый раз заново в полной мере копировать в каждый новый экземпляр. Оперативка не даст. Поэтому много информации имеет видимость уровня модуля, чтобы с ней работать по ссылке. Я прежде всего рассматриваю проекты на VBA как инструмент откатки идей автоматизировать то, что еще не делалось в помине. Тут главное попробовать сделать на самом примитивном уровне, откорректировать свои представления о решении задачи, когда в процессе кодирования откроешь для себя сложности, о которых ранее не задумывался. Вот, когда появится более менее красивый алгоритм решения, то при необходимости уже есть смысл его реализовывать в виде самостоятельного независимого приложения в иной среде программирования. Но в данный момент у меня нет такой нужды. Задачи, решенные весьма на скорую руку, по итогу закрыты. То, что делает программа - мне достаточно. 20% усилий дали свои 80% эффекта. А то, что я отнюдь не оптимально кодирую - спору нет. Я - не профессионал. Я делаю для себя по мере наличия времени. Я всю жизнь учусь. Всю жизнь совершенствуюсь в данном вопросе. Открываю для себя новые инструменты в VBA объектной модели Екселя. Мой код постепенно эволюционирует в сторону упрощений и изящества. До совершенства ему очень далеко. Но эволюция все время происходит. И ее можно даже проследить от процедуры к процедуре, названия которым даются в алфавитном порядке от одной из первых - aa до выполненной на днях kt. Одно и то же ранее и сейчас реализуется по-разному. Первые процедуры были очень примитивны по набору используемых объектов Excel. Код был много более громоздок, чем если б я его писал сейчас. Но он работает и мне нет смысла его трогать.
0
|
|||
| 10.07.2025, 18:19 | |
|
Перелистывние листов рабочей книги, с помощью ListBox Создать форму для заполнения листов рабочей книги «Калькуляция тура»
Сохранение текущего листа с сохранением имени листа и присвоением новой книге имени текущего листа Как в рабочей книге добавить лист и назвать его по своей фамилии Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|