|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
|||||||||||||||||||||||||||||||
Профессиональные проблемы, решения, рекомендации и ошибки28.02.2013, 10:21. Показов 115421. Ответов 126
Метки нет (Все метки)
Уважаемые коллеги.
На форуме появляюсь редко и заниматься этим нет возможности ... но очевидно, что для тех кто профессионально работает с VBA, наверное было бы интересно иметь в топе тему, в которой можно было бы описывать глубоко профессиональные проблемы, решения, рекомендации и ошибки VBA. Так сказать - скоп очень интересных и необычных проблем. Да, это профессиональный опыт, но он позволит повышать квалификацию всем нам гораздо быстрее, а не только после возникновения той или иной очередной проблемы ... к примеру, несколько советов: * Если вам необходимо открыть-скрыть много строк и столбцов. Если хотите, чтобы это работало быстро - необходимо создать список диапазонов и потом через Range (EntireColumn) задать свойству Hidden нужное значение. Все просто ... но не всегда. Если у вас диапазон большой (не могу сказать с какого количества символов) - использование Range может не работать. т.е.
* Если вы открываете какой-то файл и он не открывается т.к. выдает "Файл используется ... и занят пользователем User ...", а в действительности он никем не занят, то может помочь следующее: - отложите мышку в сторону и выбрав файл нажмите ЕНТЕР! все откроется. - баг при открытии файла мышкой, который устраняется клавишей ЭНТЕР с клавиатуры ... не известно почему, но часто работает. и не потому, что он освободился, а потому, что он действительно никем не занят!) (комментарий спустя пару лет - как выяснилось, это поведение характерно для организаций(компаний) использующих новелл) * Бывает так, что вы долго и нудно отлаживаете программу, которая с завидной частотой падает и вылетает. Тем более, если у вас в книге полно диалоговых элементов. ... а потом, в какой-то момент, вы понимаете, что сама программа долго загружается, неоправданно меделенно работает и место на основном диске куда-то пропало. беда в том, что эксель при каждой загрузке вашего файла, под каждую кнопочку, чек-букс, лист и ... - создает в тем-каталоге вашего профиля отдельный .emf - файл [диск размещения профиля]:\Documents and Settings\[ваша учетка]\Local Settings\Temporary Internet Files\Content.MSO и каждый раз, после падения - все эти файлы остаются, копятся, не убиваются и никем и ни чем не расцениваются как ненужные ... количество их может доходить и до 2 тыс. и до 40 тыс. ... и больше для этого закрываем все эксели, любим Far, заходим в каталог и удаляем с Shift - бысто, нежно и надежно ) * В случае если необходим доступ к листу в другой книге и метод Workbook1.Worksheets("Имя листа") не работает (возможно из-за защит, блокировок, скрытий), можно воспользоваться следующим способом:
* (описанная проблема возникает редко) если у вас есть variant массив (который к примеру можно сделать путем split'а), а в передаваемой вам функции стоит ParamArray dПринимаемыйМассив() то, не удивляйтесь, если вместо передаваемых строковых значений в передаваемых элементах изначального массива, вы получите на выходе в ParamArray dПринимаемыйМассив() числовые данные ))) т.е. например:
видимо, трабла здесь в том, что при передаче элемента variant-массива в ParamArray, не передается признак типа переменной, что и приводит к тому, что строка (массив символов), видимый как байтовый массив, превращается в набор чисел, соответствующих символам этой строки (последовательности ascii-кодов) end function если хотите избежать проблем - в данном случае при вызове четко приводите к типу:
если вам надо заполнить выпадающими списками ячейки книги, то код типа:
если к указанному коду добавить
... может это будет началом?
11
|
|||||||||||||||||||||||||||||||
| 28.02.2013, 10:21 | |
|
Ответы с готовыми решениями:
126
Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп] Обсуждение темы "Готовые решения, примеры и рекомендации начинающим на WPF" Проблемы с алгоритмом решения задачи |
|
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
|
||||||
| 28.02.2013, 12:35 | ||||||
|
У меня на 2003 Маша сушку ест
![]()
2
|
||||||
|
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|||||
| 28.02.2013, 12:53 | |||||
![]() Некоторые моменты: И у меня тоже на 2000 Маша съела сушку без проблем ![]() Добавлено через 9 минут
2
|
|||||
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
||||||
| 28.02.2013, 12:57 [ТС] | ||||||
|
код
вообщем-то, смысл моего поста был в том, чтобы продолжить тему, а не только разбирать ошибки ...
2
|
||||||
|
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|
| 28.02.2013, 13:09 | |
|
StepInLik, может, Вам Офис переустановить? В VBA и VB6 появляются сообщения "Маша", "ела", "сушку".
0
|
|
|
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
|
|
| 28.02.2013, 13:42 | |
|
Мне особо продолжить нечем (ничего такого сразу не вспомнилось), поэтому проверил то, что сразу показалось сомнительным.
У меня ошибки нет, у Вас есть - и это результат. Только причины непонятны... Хотя кое-что вспомнилось - есть глюк с кодовыми "умолчательными" именами листов в Экселе. Не советую их использовать в коде - на машине на "иначеговорящем" Экселе может быть сюрприз. Если используете - вручную смените сперва кодовое имя этим листам. Ну и как-то столкнулся при сравнении двух совершенно одинаковых (всюду, и в окне Locals тоже) значений двух ячеек, что они не равны. Обсуждение было большое и долгое - суть такова: если данным можно доверять, то такого быть не должно. Если данные доверия не вызывают - нужно преобразовывать тип, приводить их сперва принудительно к одному типу, затем сравнивать.
3
|
|
|
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
|
|
| 28.02.2013, 14:19 | |
|
Сваял скрин - не фотошоп!
Эксельку дать не могу - да тут и на скрине всё видно.
1
|
|
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
|
| 01.03.2013, 11:58 [ТС] | |
|
Про "Машу" тоже наваял скрин.
Данной трабле уже много лет. Проверено на многих компах и уже не в первой конторе.
0
|
|
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
||||||
| 01.03.2013, 12:48 [ТС] | ||||||
|
С замечаниями г-на "Казанский" согласен.
- в примере с dСкрываемыйДиапазонСтрок что-то было напутано при документации однако, ошибка следующего кода все равно остается:
В примере с проверками данных("Данные\Проверка данных" ячеек) так же согласен - опционально указывать проверки по диапазонам, однако, в указанном примере так же попытался показать проблему, с которой могут столкнуться другие разработчики (в других задачах). Ошибка остается. *(если кто-то знает официальные ограничения на следующий пример - скиньте ссылку) Если на листе Excel Вы создаете OptionButton с очень длинным название, к примеру: OptionButton_ОченьДлинноеНазваниеЭтогоДи алоговогоЭлемента_НеДелайтеЕгоДлинным то при закрытии файла и его повторном открытии - имя OptionButton будет прежним = OptionButton1
0
|
||||||
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
|
| 01.03.2013, 16:04 [ТС] | |
|
*
кажется все давно знают, но решил задокументировать. если вы заполняете лист-букс при выключенном ScreenUpdate, то после его включения, 2007 и 2010 эксели все показывают - отражается новый(обновленный) список и все замечательно. но! если вы это делаете в 2003 - ничего не выйдет - эксель не отобразит изменения области лист-букса. пробовал вариант в 2003 - включать ScreenUpdate перед последними изменениями лист-букса(перед внесением последней строки) - все равно ничего не отражает. для отражения, надо чтобы пользователь попереключался между приложениями (сработало системное событие полной отрисовки этого лист-букса) кто как боролся с этим? * если вы используете механизмы переноса листов из одной книги в другую и!!! у вас на листах есть элементы управления (кнопки, листбуксы, ...) - никогда не давайте им длинные имена. не могу сказать с какой длины, но однозначно! и не всегда сразу!, но объекты при переносе начинают терять имена (или возвращаться к каким-то старым)! т.е. к примеру, вы создали кнопку, по умолчанию у нее "CommandButtom1". первое имя, которое вы ей дали - "CommandButtom_Управление". потом, долгие месяцы кодинга и переносов листа с этой кнопкой и ... вам в голову приходит мысль переименовать ее ... и ее новое имя "CommandButtom_УправлениеСлужбойДиспечер изацииИСистемы" - сохраняете книгу, открываете, работаете с кнопкой по этому имени, в свойствах именно это имя ... но иногда, в результате очередного(не всегда первого) копирования листа с этой кнопкой в новую книгу, может оказаться, что ваша кнопка стала "CommandButtom_Управление" или вааабще "CommandButtom1" (или какие-то из ранее данных ей имен) ... * если у вас есть один лист (модуль) и есть второй, на котором у вас TreeView, то при программном переносе листа из 2го модуля в 1ый в 2007 и 2010 - объект TreeView превращается в объект пикчур. в 2003 же - все работает, правда, его размеры сбрасываются до default ... и даже когда конкретно указываешь и делаешь рефреш - на экране четкий "изначальный" квадрат ... и нужно, чтобы юзер прокрутил скрол или попереключался в приложениями * VBE. - "МОЙ ФАЙЛ" открывает файл "ХХХ" - (без остановки интерпритатора) в "ХХХ" отрабатывает автозагрузки и макрос пробегает по модулям а1 и а2 - (без остановки интерпритатора) в "МОЙ ФАЙЛ" пытаюсь удалить эти модули! - не получается! (остальные удаляются без проблем) и ... они продолжают висеть пока интерпритатор не остановится! но как только он встал - модули мгновенно исчезают! т.е. ранее при попытке удаления они встают в очередь на удаление. плохо то, что если не удалив модуль а1 попробую импортнуть этот же модуль из файла - он станет а11 (с автоматическим добавлением индекса в конце имени) и как только интепритоатор остановится - у вас в оснастке будет только а11! и а1 - исчезнет! а теперь представьте, что вместо модуля вы работаете с классом?! - в результате у вас будет нужный вам класс с ДРУГИМ именем! поэтому ... удаляйте построчно и построчно загружайте новый код для таких модулей (если вы знаете какие именно заблокированы, или - работайте так со всеми компонентами, которые обновляете) Добавлено через 2 часа 53 минуты * Представьте такую связку: - на чейндж листа вызывается макрос-обработчик - (без остановки интерпритатора) в обработчике вызывается evaluate с вызовом вашей самописной функции AAA - (без остановки интерпритатора) и ... вы хотели бы построчно отдебажить работу этой функции AAA при этом вызове НО! какие-бы точки останова вы не ставили - интерпритатор не остановиться, а просто тупо пролетит и выполнит всю функцию не дав никакой возможности ее остановить(F9) и отдебажить!
1
|
|
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
|
| 04.03.2013, 17:23 [ТС] | |
|
Если вы своем приложении (Excel, VBA) открываете файл, который при этом выдает на гора окно с диалогом (типа окна с паролем) или какой-то "кнопкой", то управление вы этим файлом не плучите до тех пор пока пользователь не нажмет на нужную "кнопку"(и не закроет это окно) ... ... мда ... правильно - API в помощь ... вешаем в коде таймер и на него нажималку на эту "кнопку" (не забываем использовать Spy ++)
Все бы здорово, да вот только таймер, в тот момент как вы вызвали Call dОбъектApplication.Workbooks.Open(dПутьИ сходногоФайла$, True, True) работать не будет т.к. интерпритатор занят задачей открытия файла (реализация многопотоковости в Excel'е - гиблое дело!) ... и так будет в любой ситуации, когда в вашем коде работает таймер, а интерпритатор уходит в себя на работу с внешним объектом (при этом, переставая обслуживать таймер) - пишите специальное приложение на нажатия кнопок и снятия экранных форм отдельно ... запускайте его до и закрывайте после решения вашей задачи ... может этот совет кому-то сэкономит время )
0
|
|
|
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
|
|
| 04.03.2013, 18:20 | |
|
Сам не писал, но видел (и даже чуть правил) - при запуске файла открывалась форма, которая по таймеру (Application.OnTime) благополучно закрывалась.
Добавил отключение этого дела, если форму и файл закрывали раньше этого времени
0
|
|
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
|
| 05.03.2013, 11:19 [ТС] | |
|
Уважаемый г-н "Hugo121", честно сказать не совсем понимаю смысл данного примера.
Речь шла о занятости интерпритатора работой с внешним процессом (приложением), в то время, когда надо закрыть ряд окон во внешнем приложении. (т.е. в момент когда интерпретатор занят открытием файла(и курсор выполнения висит в этой функции) - должна отработать еще и другая(какая-то) функция) Ключевой момент если открываемый вами фал написан другим разработчиком, с закрытым кодом и который нельзя изменять. Причем написан так, как из анекдота "мда ... проверял?! ну пусть встает дальше - пока работает ...". И здесь приходится закрывать его со стороны. * Кстати, интересный факт. Если повесить на какую-то функцию виндовый таймер, то работа этой функции не прекратится даже в тот момент, когда вы находитесь в режиме конструктора (с нажатой кнопкой конструктора!). И это логично - ведь винда не знает в каком режиме вы работаете с программой и она тупо продолжает вызывать отданную ей функцию (пока вы не снимите с этой функции таймер). Другой вопрос, что редактировать эту функцию либо нельзя совсем т.к. возникнет ошибка и приложение мгновенно вылетит(из процессов), т.е. ее редактирование возможно только в периоды между ее вызовами). Причем, функция либо должна сверху содержать resume next (в случае ошибки) или не содержать ошибок вовсе. (комментарий спустя пару лет - с момента данного комментария, разработчики исправили данную проблему. поэтому, вероятнее всего, что вы не столкнетесь с этим. однако, если трабл возник - не удивляйтесь и просто обновите офис) На этом эффекте можно построить хорошую защиту приложения - каждые пол секунды проверять снятость паролей или работу с кодом (и как только обнаружен взлом - на ваш вкус - прибивать приложение, восстанавливать пароль и т.д. ...) P.S. Учтите, что при повторном запуске и очередном навесе еще одного таймера на ту же функцию - она будет вызываться еще и еще чаще, поэтому не забывате таймер снимать. * Все знают про "компьютерную неточность". Красивый пример, чтобы доказать пользователю, что у него кривой комп и вам надо больше времени на разработку (чтобы просто посидеть и потупить на хабре ))) и так, проделываем перед пользователем следующее: в A1 пишем 0,1 (чило), в A2 пишем "=A1+0,1" и протягиваем A2 этак ячеек на 300 ... потом копируем столбец A в B со вставкой значений и смотрим в B какую-нибудь нижнюю ячейку. и что выидим?! B266=26,6000000000001 Решается все это конечно просто - переключением в режим "Задать точность как на экране" ... но ... глюк остается глюком и им можно пользоваться )
1
|
|
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
|
| 05.03.2013, 12:45 [ТС] | |
|
Не знаю ... будет ли кому полезно и в принципе очевидно ... но ни разу не слышал о следующем функционале:
Представьте, что пользователь открывает файл и ждет, пока программа подгрузит какие-то данные к работе с какими-то листами (функционалом). Ожидание логично, но не всегда устраивает пользователя этого файла ... поэтому, можно сделать так, что сразу после открытия файла пользователь сразу приступает к работе с файлом (переключается между листами, что-то просматривает) ... а файл в это время грузит все, что ему нужно, часто и по максимому отдавая пользователю через DoEvents необходимые ресурсы (функцию загрузки данных просто вешаем на событие открытия книги) ... И в случае, если пользователь переключился на лист с какими-то данными, которые должны быть загружены, но не успели загрузиться к моменту переключения: - либо можно показывать "on loading ..." и экстренно загружать все что нужно с ожиданием пользователя (с дальнейшим обновлением листа) - либо все так же постепенно (но уже с приоритетом загрузки данных этого листа) загружать данные и постепенно отражать и картинки и графики по ходу работы пользователя ... (ну чем не BI ? )))
0
|
|
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
|
| 20.03.2013, 14:22 [ТС] | |
|
Если вы из программы в Excel открываете другой Application(назовем этот объект dApplication), и в нем обновляете средствами VBE код друой программы, то даже при включенном "доверии к объектной модели проектов VBA" - ваш код обновления может не сработать из-за "Application-defined or object-defined error" при обращении к dApplication.VBE
Чтобы проблема разрешилась - надо "сделать файл надежным" или настроить соответствующие "Надежные расположения". Но! удивительно то, что получить доступ к dApplication.VBE все же можно! Нужно в аппликейшене(который вы запустили и в котором пытаетесь обновить код другой программы, т.е. - dApplication) просто перейти к коду посредством Alt+F11 ... - даже без включения надежности и настройки расположения! Это наталкивает на мысль, что существует скрытый признак "доверия к коду", который по умолчанию включается как при настройке надежности файла, настройке расположения, так и попросту - при открытии(просмотре) кода.
0
|
|
|
|
|
| 20.03.2013, 15:08 | |
|
Ограничение: если в пользовательской функции, вызываемой из ячейки листа Excel, попытаться изменить цвет заливки какой-либо ячейки - трюк не срабатывает, а значение функции становится #ЗНАЧ!.
При вызове этой же функции из макроса - все отрабатывается правильно.
1
|
|
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
|
| 22.03.2013, 14:24 [ТС] | |
|
Представьте, что у вас есть книга Эксперимент.xlsx и в ней 2 листа - Лист1 и Лист2.
В ячейке A1 листа Лист1 устанавливаем правило условного форматирования ("Использовать формулу для определения форматируемых ячеек"), что если "=Лист2!$A$1=1" то [чего-то там ... к примеру красим фон в красный]. Затем, копируем эту A1 с листа Лист1 в другую книгу. (правильно! копирование идет вместе с условным форматированием!) и ... и в другой книге мы видим в этом правиле следующую картинку "=[Эксперимент.xlsx]Лист2!#ССЫЛКА!=1" Затем ... мы обращаем внимание, что у нас появился пункт "Изменить связи" ... долго ищем - где же связи ... находим, что всему виной - условное форматирование. И ... конечно же выделяем весь лист и сносим все правила, выбрав "Удалить правила со всего листа" ... и ... правила-то удалились, а вот связи-то остались!!! ... - кнопка "Изменить связи" как светилась, так и светится и все попытки удалить связи никакого результата не дают ... это БАГ! и связей уже нет. а чтобы кнопка пропала - надо сохранить, выйти и зайти в книгу заново.
0
|
|
|
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
|
|||||||
| 22.03.2013, 14:48 | |||||||
В 2007 и более ранних невозможно ввести формулу УФ, которая ссылается на другие листы или книги. Приходится использовать обходной маневр:
1
|
|||||||
|
|
|
| 22.03.2013, 15:33 | |
|
Созданные функции могут являться аргументами условий форматирования, при условии что их имена не совпадают с адресами ячеек нотации A1.
Это дает обходной путь для визуализации изменений, возникающих при пересчете пользовательских функций листа.
0
|
|
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
||||||
| 27.03.2013, 12:51 [ТС] | ||||||
|
Тема уже была и осталась без ответа. Но столкнулся сам.
Используется следующий код:
Если форма не модальная - положение окна после активизации меняется. - правильно. (см. комментарий г-на "Апострофф" по данной теме в следующем посте)
0
|
||||||
| 27.03.2013, 12:51 | |
|
Помогаю со студенческими работами здесь
20
Бывший профессионал cs 1.6 просит решения проблемы USB устройство, проблемы и пути решения. Проблемы с выводом решения на стандартный поток Прошу помощи решения проблемы в перекрестном... Каковы возможные решения проблемы рывков в эмуляторе? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|