Ошибка 400. Простейшая надстройка XLAM. Воспроизвел простейший код., При открытии формы. Если Форма немодальная. При закрытии формы. Если Форма модальная.
Здравствуйте. Уже третий час не могу справиться! Я воспроизвел простейший код, который всегда выдает ошибку 400. Я там на английском пишу комментарии, на самом деле это не скачано с сайтов, это я пишу на английском.
Расскажу куда нажать, чтоб увидеть ошибку: 1) Моя Надстройка -> Нажмите на "чайник" (чайник символизирует, что я не пойму в чем дело) -> Ошибка 400 при открытии в режиме НЕМОДАЛЬНАЯ. Закрытие двойное с пере-открытием!
2) Моя Надстройка -> Нажмите на "чайник" (чайник символизирует, что я не пойму в чем дело) -> Ошибки нет при открытии в режиме МОДАЛЬНАЯ. Закрытие: с ошибкой 400.
Код - простейший. Справиться не могу: вчера два часа мучал, сегодня тоже не могу! Причём эта ошибка только в XLAM при открытии с Ленты. Тот же код XLSM из окна Макросов запускается без ошибки в НЕМОДАЛЬНОМ режиме и закрывается без ошибки. Что-то с Лентой! (Мне нужно - чтоб работало из Ленты. Т.к. только при запуске из ленты есть права доступа к любой директории. В программе будет модуль с XML, я заметил, что если добавить XSD схему в количестве больше одной, то пропадают права доступа к директориям, кроме USER/, при запуске из Ленты такого странного эффекта нет, но сейчас речь не об этом, сосредоточимся на ошибке 400)
И ещё более странная ошибка: если в RibbonXMLEditor заменить в названии точки входа входной процедуры onAction="" слово "Launch" на слово "Start", то при нажатии на кнопку Ленты процедура НЕ НАХОДИТСЯ, она теряется. В макросе тоже поменяем это слово в названии процедуры. При том, что слово "Start" нигде в перечне служебных слов VBA не перечислено.
Хорошо, сейчас поменяю Ник. Спасибо, я другой Ник писал, не знаю откуда туда почта попала. Я пере-залил в третий раз. Добавил XLSM и схему XML для редактора ленты.
Такая идея возникла: возможно, элементы формы нужно формировать программно? Возможно, это будет путь решения проблемы? Кнопки формировать программно? Программно - я называю - формировать из кода VBA, а не рисовать на форме. Может быть в этом причина?
1. Все вызовы в XML являются функциями обратного вызова со своими требованиями. И как одно из них - это обязательное наличие передачи объекта, который инициировал вызов макроса. Т.е. процедура должна выглядеть так:
Код
Public Sub Launch_Actions_Editor_Macro(control As IRibbonControl) ' for ribbon-button, ("Start" may be a "reserved" word)
f_ActionsForm.Show
'Call Actions_Editor
End Sub
2. Скобки не надо указывать в схеме XML. Название процедуры должно быть БЕЗ СКОБОК:
Код
<button id="G5_MyButton_1" label="Редактировать" image="my_brain_boiled" size="large" screentip="Что бы это могло быть?" onAction="Launch_Actions_Editor_Macro" />
Когда исправите эти моменты - все заработает без ошибок.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Самое удивительное, что я так увлекся написанием двух тысяч строчек второго модуля, что даже забыл, что процедуры обратного вызова у меня уже работают на кнопках, расположенных слева, и связанных с первым модулем. Я смотрел на них в упор и не мог понять в чем же дело! Огромное спасибо! Я так бы ещё неделю и смотрел бы на них в упор, не понимая, что же делать. Огромнейшее спасибо!
почему моя программа зависает на слабом компьютере?
Коллекция из 20 путей к файлам (docx). Открыли документ, взяли часть текста, закрыли (Quit, Set Nothing, высвободили память, завершили winword.exe, процессы winword.exe не множатся), записали в элемент одномерного массива. В результате получили массив 20 элементов весом всего лишь 100 кБайт (КИЛОбайт, НЕ Мега!). Заполнили из этого массива ячейки на листе. И где-то на середине этого процесса слабый компьютер зависает: Excel полностью закрывается (перезапустить программу), вылетает. А если взять только 10 путей к файлам, то процесс завершается успешно. Компьютеру 100 кБайт памяти не хватает? Смешно! Этот же слабый компьютер осилил хранение строки base64 длиною 10Мбайт и смог записать её в текстовый файл. Вот когда ему не хватало памяти, чтоб хранить строки base64 в массиве - это я понимаю, но тут 100 килобайт! Всего лишь! Чрезвычайно неудобные циклы получились, чтобы через каждые 10 файлов прерывать процесс.
Ни на одном другом нормальном компьютере вылета не происходит. Даже при 200 файлов всё отлично.
Код не могу привести, он очень сложный и не поддаётся укрощению.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Ilya iatndiag написал: Открыли документ, взяли часть текста, закрыли (Quit, Set Nothing, высвободили память, завершили winword.exe, процессы winword.exe не множатся
Зачем Ворд сразу завершать, лучше в нем дальше открывать остальные 19 документов.
Ilya iatndiag написал: почему моя программа зависает на слабом компьютере?
ответ прост: где-то все же идет утечка памяти, что вызывает ошибку. А учитывая это:
Цитата
Ilya iatndiag написал: Код не могу привести, он очень сложный и не поддаётся укрощению
я бы посоветовал потратить время на прогон кода и посмотреть, нет ли где зацикливания или многократного вызова одной и той же функции/процедуры. Возможно, где-то срабатывает постоянно событие, которое обрабатывается. Так же к таким "выпаданиям" может приводить изменение элементов Ribbon, организованное не совсем корректными или недокументированными методами.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Не поверите! Со слабым компьютером пока не разобрался. На более мощных всё работает. Версия офиса - самая оптимальная 2016 года. Но я обнаружил ещё одну причину внезапного вылета Excel при чтении Word! И я поделюсь этой причиной! Оказывается, некоторые файлы, которые были когда-то переданы по сети имеют статус "Заблокирован". Такие docx файлы нужно разблокировать в меню Свойств правой кнопкой мыши. Так, по крайней мере, Excel внезапно не закрывается! Чтение происходит путём заполнения коллекции и чтения неформатированного текста. Разбор XML тегов или запрос Power Query с функцией Decompress Files с разбором по тэгам мне показался чрезмерно сложным. Лучше обработать все файлы, которые поддаются обработке, а те, которые не поддаются - заполнить ВРУЧНУЮ. Главное, что теперь Excel не вылетает!!!
На самом деле вылетал из за функций Split в самодельной функции преобразования формата даты. Переменная как Variant должна была стать массивом, но не стала. Перед функцией не было On Error Resume Next. Даты в документах как попало заполнены. Вот и вся причина.
Она, кстати, даже с (On Error Resume Next) вылетает. Если не существует элемент массива после функции Split. Не знаю какую проверку сделать. Может быть, isArray или еще какую-то.