MS Access, DoEvents для выхода из цикла

Что я хотел бы выполнить:

Do While ctr < List and Break = False
   code that works here...
DoEvents
  If KeyDown = vbKeyQ
      Break = True
  End If
loop

Выйдите из цикла, удерживая клавишу (например, Q). Я читал о DoEvents во время цикла, чтобы добиться желаемой функциональности. Идея состоит в том, чтобы цикл Do While выполнялся до тех пор, пока не будет достигнут конец списка или пока не будет нажата клавиша Q. У меня проблемы с тем, чтобы код работал так, как я хочу, поэтому я надеюсь, что это положит конец разочарованию. Мой опыт работы с VBA очень ограничен.

ОБНОВЛЕНИЕ - Больше кода, чтобы показать, где может быть проблема. Это все в том порядке, в котором я это сделал (на случай, если порядок сабвуферов имеет значение:

Private Sub Form_KeyPress(KeyAscii As Integer)
Dim strChar As String

strChar = UCase(Chr(KeyAscii))
If strChar = "Q" Then
    blnQuit = True
    Debug.Print "Q pressed"
End If
End Sub
Private Sub Master_Report_Click()
Dim i As Integer
Dim Deptarray
blnQuit= False

If IsNull(Me.Hospital) Then
    MsgBox ("Please Choose a Hospital")
Else
    DoCmd.OpenForm "Report Print/Update", acNormal, , , , acDialog
    If Report_choice = "Current_List" Then
        Debug.Print "Create master rec report"
        DoCmd.OpenReport "Master Rec Report", acViewPreview
        DoCmd.RunCommand acCmdZoom100
    ElseIf Report_choice = "Update_All" Then
        total = (DCM_Dept.ListCount - 1)
            ctr = 1
            Do While ctr < (DCM_Dept.ListCount) And LoopBreak = False
                Debug.Print "LoopBreak: "; LoopBreak
                Debug.Print "Counter: "; ctr
                DCM_Dept.Value = DCM_Dept.Column(0, ctr)
                Update_Site (Me.Hospital)
                ctr = ctr + 1
                'DoEvents
                   ' If vbKeyQ = True Then
                    'LoopBreak = True
                    'End If
            Loop
            Debug.Print "Update loop exited"
        Debug.Print "Create master rec report"
        DoCmd.OpenReport "Master Rec Report", acViewPreview
        DoCmd.RunCommand acCmdZoom100
    Else
    End If
End If
End Sub

Private Sub Update_Site(Site As String)

If IsNull(Me.Hospital) Then
    MsgBox ("Please Choose a Hospital")
ElseIf IsNull(Me.DCM_Dept) Then
    MsgBox ("Please Choose a Department")
ElseIf Site = "FORES" Then
    Debug.Print "Run FORES update macro"
    DoCmd.RunMacro "0 FORES Master Add/Update"
ElseIf Site = "SSIUH" Then
    Debug.Print "Run SSIUH update macro"
    DoCmd.RunMacro "0 SSIUH Master Add/Update"
End If
End Sub

Report_choice и LoopBreak являются общедоступными переменными. Моя первоначальная идея заключалась в том, чтобы всплывающая форма всплывала над основной формой для отображения счетчика («Обрабатывающий отдел X из Y») и кнопки, чтобы разорвать там цикл. Я понял, что форма не отвечает, пока Update_Site() запускает свой макрос, поэтому я решил вместо этого удерживать клавишу.

Итак, что мне делать, чтобы заставить OnKeyDown работать? Или есть лучший способ сделать это?


person Access_Query    schedule 15.10.2014    source источник


Ответы (1)


Попробуйте установить для Key Preview формы значение Да и добавьте переменную blnQuit и событие нажатия клавиши в форму следующим образом:

Private blnQuit As Boolean

'form
Private Sub Form_KeyPress(KeyAscii As Integer)
    Dim strChar As String

    strChar = UCase(Chr(KeyAscii))
    If strChar = "Q" Then
        blnQuit = True
    End If
End Sub

Затем проверьте blnQuit в состоянии Do While, например:

blnQuit = False
Do While ctr < List And Not blnQuit
   code that works here...
   DoEvents
loop
person mdialogo    schedule 15.10.2014
comment
Я внес изменения, как вы предложили. Нажатие клавиши распознается перед запуском Sub. Однако, попав в подпрограмму, он ничего не возвращает и после завершения не работает, пока не закроет форму и не откроет ее снова. Нужно ли мне иметь что-то после «DoEvents» в цикле? - person Access_Query; 16.10.2014
comment
Вы имеете в виду подпункт Update_Site (Me.Hospital)? Если эта подпрограмма находится в отдельном модуле, вам может потребоваться объявить blnQuit общедоступным и поместить его в модуль, чтобы использовать его внутри Update_Site(). - person mdialogo; 16.10.2014
comment
Функция Update_Site находится в той же форме, поэтому я предполагаю, что она находится в том же модуле? Я также обновлю основной пост кодом из него. Надеюсь, это поможет. - person Access_Query; 16.10.2014
comment
Я нашел проблему. У меня был немного мошеннического кода, который портил проверку KeyPress. Теперь он работает отлично. Спасибо за вашу помощь! - person Access_Query; 16.10.2014