2015-02-04 57 views
-1

現在它被忽略。這是最基本的代碼,它現在導致一個不可避免的情況,但我打算將這些情況排除在外。只需要獲得基本的setFocus工作。如何在訪問連續窗體(VBA)中設置焦點

Private Sub fieldbox_LostFocus() 
Me.fieldbox.SetFocus 
End Sub 

以常規形式,它按預期工作。當fieldbox失去焦點時,焦點將重新放回到fieldbox上。

以連續的形式,它不起作用,並且設定的焦點不會發生。這可能是由於每個記錄存在多個fieldbox實例。

我想要的是,如果fieldbox1,2和3存在於連續的窗體上,並且您單擊了fieldbox2,如何將焦點設置回fieldbox2?

+1

你爲什麼想要?就個人而言,如果您需要將用戶的注意力集中到特定區域,我認爲這聽起來像是一個有缺陷的設計。你能給出更多的背景知道爲什麼你需要這個功能嗎? –

+0

您必須指定記錄以及控件(fieldbox)。我同意評論,更多的信息將prolly幫助我們。 – Smandoli

+1

如果輸入錯誤數據,請在發生任何其他事件之前強制用戶返回到現場框進行糾正。 – thomas

回答

1

您需要改用焦點形式的BeforeUpdate()事件:以上

Private Sub Form_BeforeUpdate(Cancel as Integer) 
If RecordOK = False Then 
    Dim response, strMsg as String 
    strMsg = "There is data missing from the record. " _ 
    & vbCrLf & "Press Yes to continue, editing. " _ 
    & vbCrLf & "Press No to discard all changes." 
    Cancel = True 
    response = MsgBox(strMsg, vbYesNo) 
    If response <> vbYes 
    Me.Undo 
    End If 
End If 

代碼沒有進行測試,可能需要一些調整,粘貼和觀望。我最近的更新提供了更清晰的處理用戶對對話框的響應。 (你確實有Option Explicit集,你不?!)

控制水平這種方法的一個很好的解釋中找到here。但是您可能想要使用表單事件,如上所述。有時我只是在事件中臨時插入Msgbox線索,以便我可以看到什麼時候發射。

請注意,對話框應提供有關如何避免擦除用戶迄今完成的工作的線索。

+0

他可能可以使用'Me.fieldbox'的更新前類似的方法。 – HansUp

+0

是啊我是怕你帶領me.undo最後通before beforeUpdate。我試圖設置的是beforeUpdate cancle = true不工作的完整解決方法,而me.undo完全清除了所做的更改。我討厭這種方法,因爲在更新發生之前會發生許多事情。在這種情況下,如果有問題的領域是錯誤的,它會抹去以後可能發生的所有變化。因此,我試圖立即將注意力放在糟糕的條目上。 – thomas

+0

@HansUp嘗試更新fieldbox之前產生錯誤2108.您必須在執行... setfocus方法之前保存該字段。 – thomas