Что я хотел бы выполнить:
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 работать? Или есть лучший способ сделать это?