Страницы: 1
RSS
При попытке выбора диапазонов в форме с помощью RefEdit в том числе зависает Excel
 
Доброго времени суток, уважаемые знатоки.

По существу вопроса: есть некая форма, содержащая в себе сегмент для источника данных и приемника данных. Оба сегмента устроены одинково: для каждого в объекте Frame находятся два RefEdit для выбора требуетмых диапазонов, CommandButton для открытия файла с данными, ComboBox для выбора книги, в которой RefEdit будут выбирать диапазоны. При инициализации формы имена открытых рабочих книг попадают в ComboBox'ы с тем, чтобы пользователь мог выбрать себе любую книгу, после чего он с помощью RefEdit отбирает нужные диапазоны; если открытых книг пользователю не хватило, то можно их окрыть, для чего и есть в каждом Frame соответствующие кнопки. При активированнии RefEdit автоматически должна активироваться книга, выбранная соответствующим ComboBox (вообще это сделано через Frame_Enter(), фокус передается на ComboBox).

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

Вопрос: почему? Что с кодом не так? В какую сторону копать? Я предполагаю, что с RefEdit'ами (это единственный динамический элемент) что-то не так, что-то вроде Stack Overflow, Buffer Overflow. Пока вижу такое решение: каким-то образом отследить либо заданное количество кликов по форме, либо заданное время, скопировать все значения всех элементов в форму-близнеца, форму-источник уничтожить, а потом - наоборот.

Мне понятно, что пользователь не будет просто так кликать, что выберет себе нужное и запустит расчеты, но червячок точит: а вдруг "запаса прочности" хватит только на 5 кликов??? И Марья Ивановна, увидев обрушение Excel, схватит себе несварение? Из-за меня...

Пробовал на Excel 2010, Win 7 64 бита; Excel 2010, Win 7 32 бита.

Заранее спасибо.
 
1. Как открывается форма? По событию, отдельным кодом? Открывается в модальном режиме или нет? Почему спрашиваю - RefEdit очень капризно работает, если форма запущена в немодальном режиме(ShowModal = 0)
2. RefEdit сам по себе очень неустойчивый элемент. Скорее всего Вы можете сами отследить, когда появляется ошибка - этот элемент висит отдельным элементом(возможно за формой). Но увы, программно это не отследить. В этом режиме Excel какое-то время еще работает, но при повтором обращении к RefEdit зависает и Вы получаете ошибку.
3. RefEdit не очень жалует расположение на MultiPage - попробуйте вынести все эти элементы за вкладки. А еще лучше без MultiPage обойтись. Сделать заполнение "по шагам".
Так же можно поэкспериментировать с выносом RefEdit за Frame, а еще лучше Frame-ы убрать.
Т.е. можно сначала убрать Frame-ы(все с формы), потестировать. Не помогло? Убрать MultiPage.

Пока нет других идей.
Изменено: The_Prist - 21.03.2017 11:34:21
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
1. Как открывается форма?
F5 в редакторе  VBA, модальный режим. А потом - как надстрой либо пунктом меню, либо по горячим клавишам.
Цитата
The_Prist написал:
2. RefEdit сам по себе очень неустойчивый элемент.
Я так и подумал. С чувством глубокого неудовлетворения прочел:
Скрытый текст

Я не понимаю, как такое возможно, а именно: зачем выпускать сырой продукт? По уму, так отказаться от использования RefEdit. ©Поймать и набить ему морду, что выдумал мало созвучий, что выдумал мало аккордов.

За советы - спасибо. Буду думать...
 
У текстбокса есть скрытое свойство DropButtonStyle, которое можно установить равным  fmDropButtonStyleReduce. И еще свойство ShowDropButtonWhen, которое устанавливается равным fmShowDropButtonWhenAlways. Тогда внешне получится RefEdit.
Останется только на метод текстбокса DropButtonClick дописать код временного скрытия формы и использования InputBox для выбора ячеек.
Такая альтернатива давно реализована в различных вариантах. Например, у Jon Peltier есть хорошая статья с описанием  кода Alternative to Excel’s Flaky RefEdit Control, там же есть пример: RefEdit_Alternative.zip
Изменено: ZVI - 21.03.2017 23:12:25
 
Собственно, практически решило проблему:
Цитата
RefEdit event procedures should be avoided

Обработчики c RefEdit убрал вообще. Поставил передачу фокуса на ComboBox по событию Frame_Click и т.п. Не знаю, сколько теперь продержится, но (!!!) вообще пропала ошибка при использовании Workbooks.Open. Вообще. А с обработчкими RefEdit - через раз, и неважно, с какими параметрами открывать, восстанавливать и т.д.
 
Вот еще один вариант с модулем класса и 4-мя событиями, имитирующий аналогичным способом элемент RefEdit:
RefEdit Control Alternative, пример использования:  RefEdit.xlsm
 
ZVI, спасибо.
 
Добавлю из собственного опыта, что RefEdit часто не корректно работает, если в системе установлено более 1 версии Office (Excel). С некоторых пор, при написании скриптов, я вообще отказался от использования данного элемента управления.
Чем шире угол зрения, тем он тупее.
 
Подтверждаю предыдущий ответ. Проблема может быть из-за того, что на компе установлены 2 или более версий MS Office. Ну а я столкнулся с тем, что "мешал" вообще другой Office - не MS. Единственный (как и положено) Refedit.DLL в списке References VBA-проекта отображался, я проверил путь к нему - вообще относился к чужому офису. Удалил чужой офис, перезагрузился - все встало на свои места - путь стандартный - C:\Program Files\Microsoft Office 15\root\office15.... Хорошо что Windows корректирует ссылки на DLL после деинсталляций....
Страницы: 1
Наверх