То, что я хотел бы выполнить: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 во время цикла, чтобы получить необходимую функциональность. Идея состоит в том, чтобы запустить цикл While 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 работать? Или есть лучший способ сделать это?
Я реализовал изменения, которые вы предложили. Нажатие клавиши распознается перед запуском Sub. Однако, когда-то в суб, он ничего не возвращает, и после его завершения не работает до закрытия формы и ее повторного открытия. Должен ли я иметь что-то после «DoEvents» в цикле? –
Вы имеете в виду sub Update_Site (Me.Hospital)? Если этот подраздел находится на отдельном модуле, вам может потребоваться объявить blnQuit как общедоступный и поместить его на модуль, чтобы использовать его внутри Update_Site(). – mdialogo
Функция Update_Site находится в той же форме, поэтому я предполагаю, что она находится в одном модуле? Я также обновляю главный пост с кодом. Надеюсь, это поможет. –