2014-10-15 3 views
2

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

ответ

2

Попробуйте установить 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 
+0

Я реализовал изменения, которые вы предложили. Нажатие клавиши распознается перед запуском Sub. Однако, когда-то в суб, он ничего не возвращает, и после его завершения не работает до закрытия формы и ее повторного открытия. Должен ли я иметь что-то после «DoEvents» в цикле? –

+0

Вы имеете в виду sub Update_Site (Me.Hospital)? Если этот подраздел находится на отдельном модуле, вам может потребоваться объявить blnQuit как общедоступный и поместить его на модуль, чтобы использовать его внутри Update_Site(). – mdialogo

+0

Функция Update_Site находится в той же форме, поэтому я предполагаю, что она находится в одном модуле? Я также обновляю главный пост с кодом. Надеюсь, это поможет. –

Смежные вопросы