Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2011, 22:22   #1
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию Серьёзная ошибка ListBox в Excel

Убил несколько дней на локализацию серьёзной ошибки в Excel.
Предположим что есть лист в котором по двойному клику (это принципиально) по ячейке
вызывается пользовательская экранная форма UF1.
На форме расположен ListBox LT c
.ListStyle = fmStyleOption
.MultiSelect = fmMultiSelectMulti
При двойном клике в LT формируется список и форма показывается.
Так вот.
Если кликать в области листа ПОД местом где на экране появится
листбокс, то с высокой вероятностью в списке появятся отмеченные
(выбранные) элементы. Если кликать по листу вне зоны где появится
LT - никаких элементов выбрано не будет.
При этом в LT лишний клик в обработчике событий не фиксируется.
Хотя одна из выбранных лишних строк соответствует
ординате курсора мыши на листе Excel.
Более того.
Если поставить перед UF1.show точку останова (или msgbox, или
что то вроде Application.wait(now + TimeValue("00:00:02")) ,
то всё работает правильно - лишние элементы не отмечаются.
Пробовал под Excel 2003 и 2010 в Vista SP2 и Win 7 Pro SP1.
Эффект полностью воспроизводим на разных компьютерах с разными
системами и офисами.
Так как из-за глюков форума не могу прицепить пример в этом посте - добавлю его в следующем сообщении.

Последний раз редактировалось Aent; 04.09.2011 в 22:29.
Aent вне форума Ответить с цитированием
Старый 04.09.2011, 22:26   #2
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Пример файла моделирующего ситуацию
Вложения
Тип файла: zip BadExcel.zip (10.4 Кб, 16 просмотров)
Aent вне форума Ответить с цитированием
Старый 04.09.2011, 22:33   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Нда...
У меня не "высокая вероятность" - у меня пока 100% вероятность...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 04.09.2011, 23:35   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

А у меня еще и первый элемент выбирается (Excel 2000, WinXP SP2).
Придумал, как ждать не более 1 секунды:
Вложения
Тип файла: rar BadExcel-1.rar (10.7 Кб, 10 просмотров)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 04.09.2011, 23:56   #5
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Отмечается не первый элемент а в зависимости от того где был .ListIndex перед .show
Добавьте перед .Show
UF1.LT.ListIndex =UF1.LT.ListCount - 1
и отмечаться будет последний .
Ждать секунду заказчик не хочет.
На вариант с запуском макроса скажем по правому клику - то же не идёт.
Пока проблема решилась эмпирически.
Установкой перед .show цикла
Код:
 For i = 1 To 8000
     DoEvents
 Next i
Всё же тормозит (у меня и клиента) меньше чем на 1 с.
Число оборотов цикла подбирал экспериментально.

Последний раз редактировалось Aent; 05.09.2011 в 00:28.
Aent вне форума Ответить с цитированием
Старый 05.09.2011, 00:48   #6
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

> Ждать секунду заказчик не хочет.

Ишь, какой торопливый
Тогда такой "костыль". Если между запуском формы и изменением листбокса проходит менее 0,1 с, то это глюк, а не пользователь, и надо очистить весь список:
Вложения
Тип файла: rar BadExcel-2.rar (11.1 Кб, 8 просмотров)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 05.09.2011, 03:42   #7
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Казанский, хорошая идея - спасибо
У меня ситуация несколько сложнее - список отметок не сбрасывается а загружается
перед показом. Но, полагаю - должно получиться и в этом варианте.
Aent вне форума Ответить с цитированием
Старый 05.09.2011, 08:09   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Я бы сделал задержку таким способом:
Код:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim i As Long
    Cancel = True
    UF1.LT.Clear
    For i = 1 To 50
       UF1.LT.AddItem Replace(String(20, "*"), "*", Format$(i, "00"))
    Next i
    ЗапускМакросаСНебольшойЗадержкой
End Sub
Код:
Sub ЗапускФормыUF1()
    UF1.Show
End Sub

Sub ЗапускМакросаСНебольшойЗадержкой() ' по мотивам макроса ZVI_Timer
   ЗадержкаВСекундах = 0.2    ' в секундах
   НазваниеМакроса$ = "ЗапускФормыUF1"    ' этот макрос будет запущен через 0.3 сек.
   ЗадержкаВЧасах$ = Replace(Format(CDbl(TimeSerial(0, 0, 1)) * ЗадержкаВСекундах, "0.000000000"), ",", ".")
    macro = "ON.TIME(NOW()+" & ЗадержкаВЧасах$ & ", """ & НазваниеМакроса$ & """)" ' формируем команду запуска
   ExecuteExcel4Macro macro ' macro = ON.TIME(NOW()+0.000003472, "test")
End Sub
PS: На домашнем компе проблема не проявляется (видимо, из-за того, что я работаю на нём удалённо, через RDP, - соответственно, перерисовка окон происходит с незначительной задержкой)
EducatedFool вне форума Ответить с цитированием
Старый 05.09.2011, 11:48   #9
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Спасибо, Игорь.
Aent вне форума Ответить с цитированием
Старый 05.09.2011, 11:51   #10
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Без подбора временнЫх интервалов.
При нормальной работе событие MouseDown или KeyDown происходит перед событием Change. Если Change произошло без нажатия мыши или клавиши - это глюк.

Если значения будут меняться программно, перед изменением надо установить флаг MouseKeyDown = True.
Вложения
Тип файла: rar BadExcel-3.rar (11.2 Кб, 7 просмотров)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619

Последний раз редактировалось Казанский; 05.09.2011 в 11:53.
Казанский вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие Excel из списка файлов ListBox anton555sleptsov Помощь студентам 2 16.11.2010 22:48
как добавить в listbox файлы(пишу с помощью bassplayer)(Listbox+opendialog=play) blackstersl Общие вопросы Delphi 11 09.06.2010 13:23
Запись на лист Excel одной и той же опции ListBox два раза подряд Mishel825 Microsoft Office Excel 7 01.11.2009 14:08
Не получается поиск в файлах Excel через Listbox..ПОМОГИТЕ Al_Sha Помощь студентам 0 03.07.2009 22:42