2015-06-17 2 views
0

У меня есть VBA UserForm в Excel с очень простым кодом. Он отображает коллекцию (словарь, на самом деле) объектов, по одному, с кнопками «первая, предыдущая, следующая и последняя». Все отлично работает, но если я буду постоянно щелкать следующей кнопкой, чтобы пройти через предметы, я должен щелкнуть ее медленно (примерно один раз в секунду). Если я нажимаю быстрее, щелчок игнорируется. Например, если я нажимаю четыре раза в течение двух секунд, он будет только «регистрировать» первый и третий клик и продвигаться дважды, а не четыре раза.Кнопка Excel UserForm нажимает медленное время отклика при быстром нажатии

Ниже приведен пример кода для кнопки «Next» (и другие применимые части кода в модуле UserForm):

Private dQIDs As Dictionary 

Public Sub TransferQIDs(ByVal dIncomingQIDs As Dictionary) 
    Set dQIDs = dIncomingQIDs 
End Sub 

Private Sub bNext_Click() 
    Call LoadQID(CLng(lIndex.Caption) + 1) 
End Sub 

Private Sub LoadQID(lQID As Long) 
    Dim QID As cQID 
    Set QID = dQIDs(lQID) 
    lIndex.Caption = lQID 
    lItems.Caption = "Viewing new QID " & lQID & " of " & dQIDs.Count 
    Me.tQID = QID.lQID 
    Me.tTitle = QID.sTitle 
    Me.tVID = QID.sVendorID 
    Me.bOS = QID.bOSPatch 
    Me.bApp = Not QID.bOSPatch 
    Me.bPrev.Enabled = Not (lQID = 1) 
    Me.bFirst.Enabled = Not (lQID = 1) 
    Me.bNext.Enabled = Not (lQID = dQIDs.Count) 
    Me.bLast.Enabled = Not (lQID = dQIDs.Count) 
End Sub 

Любые идеи?

+0

Сколько элементов в словаре? Что такое 'cQID'? Есть ли существенный код в любом из методов, которые вы вызываете в QID? – Comintern

+0

cQID - это пользовательский класс с половиной десятков членов, очень простой. В словаре около 150 человек. Ваш комментарий поддерживает то, что Маргус сказал ниже о времени Excel, чтобы захватить объект; Я просто ожидаю слишком многого из Excel? Я заметил такое же поведение в аналогичной форме с похожим классом, но только около 20 элементов в словаре. – Zaimor

ответ

0

Лично я бы просто отключил кнопку, пока загружен контент.

Private Sub bNext_Click() 
    Dim b1 As Button 
    Set b1 = ActiveSheet.Buttons("LoadQID") 
    REM or Me.LoadQID 

    b1.Font.ColorIndex = 15 
    b1.Enabled = False 
    Application.Cursor = xlWait 

    Call LoadQID(CLng(lIndex.Caption) + 1) 

    b1.Enabled = True 
    b1.Font.ColorIndex = 1 
    Application.Cursor = xlDefault 
End Sub 

Причина, по которой это происходит, заключается в том, что доступ к одному объекту занимает довольно много времени в Excel. Таким образом, если вы можете щелкнуть, он будет зарегистрирован.

В качестве альтернативы вы можете включить обновление пользовательского интерфейса с:

Application.ScreenUpdating = False 
Application.ScreenUpdating = True 
Смежные вопросы