----------- UPDATE ---------將焦點設置爲子窗體會導致錯誤2449(表達式中存在無效方法) - VBA - Access 2013
我想出瞭如何把重點放在我的子表單上。如果它是一個子窗體,然後:
ParentFormName = frm.Parent.Name
SubFormName = frm.Name
Forms(ParentFormName).Form(SubFormName).SetFocus
這似乎是工作(雖然Andre451的帖子更有效)。但是這導致了我的子表單導致暫停狀態的潛在問題。我的子表格相對較大(194條記錄),當在較大記錄的記錄集上執行MoveFirst/Last時,出現錯誤3021 (no current record)
。這可能與子窗體的整個記錄集沒有加載到主窗體的加載事件上有關。較小的記錄集可以更快地循環,因此不會產生錯誤(儘管這只是一個假設)。
的新的問題是:我怎樣才能避免3021 error
,讓子窗體記錄負載完全是這樣的,我可以通過他們與任何移動:
- DoCmd.RunCommand acCmdRecordsGoToLast
OR
- frm.RecordsetClone.MoveLast
--------------------------------------------- -------------------------------------
雖然我們遷移了Access數據到SQL服務器,仍然使用Access作爲前端。我們通過使用Access連接SQL Server表來實現這一點,並且這一切都可以(幾乎)很好地工作。然而,最近我們遇到了SQL服務器上的suspended state
訪問查詢問題(主要發生在組合框中的查詢上)。
經過一番研究,我們發現這可以通過在表單的負載上循環查詢記錄來解決(所以通過簡單的acCmdRecordsGoToLast
和acCmdRecordsGoToFirst
),這似乎工作。 因此,爲了對付這種暫停狀態,我們爲每個表單加載了一個init
,其中運行了recordsource
和rowsource
(主要表單記錄源,comboxes行源等)的記錄。
所以上的形式負載:
modFunctions.InitForm(Me)
此初始化是在一個模塊中,看起來像這樣:
Dim InitFormResult As Boolean
InitFormResult = InitFormRecordSource(frm) ' Initialize the recordsource of the form
InitFormComboBoxes frm ' Initialize all the comboboxes on the form
InitFormCommandButton frm ' Initialize all the buttons on the form
的形式記錄源(其中,錯誤發生)看起來像第一初始化這個:
Public Function InitFormRecordSource(frm As Form) As Boolean
If frm.RecordSource <> "" Then ' if recordsource found
On Error GoTo ErrHandler
frm.SetFocus
DoCmd.RunCommand acCmdRecordsGoToLast
DoCmd.RunCommand acCmdRecordsGoToFirst
GoTo EndSuccess
ErrHandler:
MsgBox (Err.Number)
Debug.Print "ERROR during InitFormRecordSource in form : " & frm.Name
InitFormRecordSource = False
Exit Function
EndSuccess:
InitFormRecordSource = True
Else
InitFormRecordSource = True
End If
End Function
要運行窗體記錄集與第一個和最後它需要有焦點。這對所有表單都很有用,但不適用於主表單中的表單。在子表單中,我們還想通過遍歷子表單記錄來對付暫停狀態,但是當使用上面的代碼時,我們會繼續獲得error 2449
。
經過一番研究,我遇到了這個帖子:Module Function frm.setfocus runtime 2449 error這或多或少都是一樣的問題。所以我發現一個子表單需要以不同的方式來關注它,但是我所有的努力都無法實現。
我試過至今:在上面的代碼
If frm.RecordSource <> "" Then ' if recordsource found
On Error GoTo ErrHandler
Dim HasParent As Boolean
Dim sParentForm
HasParent = TypeName(frm.Parent.Name) = "String"
If HasParent = True Then 'The form is a subform
'sParentForm = frm.Parent
'sParentForm.frm.SetFocus
'frm.Parent.frm.SetFocus
'sParentForm!frm.SetFocus
Else
frm.SetFocus
End If
DoCmd.RunCommand acCmdRecordsGoToLast
DoCmd.RunCommand acCmdRecordsGoToFirst
GoTo EndSuccess
將嘗試修復都被註釋掉了。 HasParent
確實工作,與此我可以檢查如果窗體是一個子窗體(它有一個父窗體)或不,並設置不同的焦點。
雖然我似乎無法專注於子窗體,但我不知道如何修復它!
謝謝Andre451您的解決方案是不是我用的是什麼,所以更容易一點我複製了!雖然在等待對此消息的回覆時,我已經想出瞭如何將注意力集中在我的子表單上,但我發現真正的問題不在於此。真正的問題是,我的兩個子表單有一個相對較大的記錄集--194條記錄,我不能做'frm.RecordsetClone.MoveLast'我也不能做我以前用過的這些(給出錯誤3021 - 沒有當前記錄) 。這是可能的。與子窗體數據做的事情沒有加載到主窗體的加載事件上。那麼現在該怎麼辦?;) – Nicolas
同時更新了上面的文字,並且您的建議在主帖中更新了! – Nicolas