[英]Openform action was canceled in MS-Access VBA code
我支持一個運行了 3 年的應用程序。 它完全在 MS Access 中開發並用 VBA 編寫。
突然,應用程序在以下幾行面臨上述錯誤:
DoCmd.OpenForm FormName:="frmNewPeerGroup", View:=acNormal, windowmode:=acWindowNormal, OpenArgs:=5
FrmNewPeerGroup 代碼
Private Sub Form_Open(Cancel As Integer) Dim lDept As Long, lDiv As Long lType = OpenArgs 'Supplied by caller lAssmtVer = 1 'Current sName = "" sDescription = "" dtCreatedDate = Format(Now(), "dd/mm/yyyy") sCreatedBy = UCase(userPerms.NTLoginName) lSupervisorID = userPerms.userID lTeam = 0 With cmbBxType .RowSourceType = "Value List" .RowSource = GetValueListDict(pgType) .Value = lType .Enabled = (OpenArgs = 1) End With With cmbBxVersion .RowSourceType = "Value List" .RowSource = GetValueListDict(pgAssmtType) .Value = lAssmtVer End With mgLogoDesc.Visible = False txtBxCreatedDate.Value = dtCreatedDate txtBxCreatedBy.Value = sCreatedBy If OpenArgs = 5 Then lTeam = oActiveAssmt.TeamID lDept = GetParentID(aTeams(), CInt(lTeam)) lDiv = GetParentID(aDepts(), CInt(lDept)) With cmbBxDivision .RowSourceType = "Value List" .RowSource = GetValueListArray(aDivs()) .Value = lDiv .Enabled = False End With With cmbBxDepartment .RowSourceType = "Value List" .RowSource = GetValueListArray(aDepts()) .Value = lDept .Enabled = False End With With cmbBxTeam .RowSourceType = "Value List" .RowSource = GetValueListArray(aTeams()) .Value = lTeam .Enabled = False End With Else With cmbBxDivision .RowSourceType = "Value List" .RowSource = GetValueListArray(aDivs()) .Enabled = False End With cmbBxDepartment.Enabled = False cmbBxTeam.Enabled = False End If End Sub
DoCmd.OpenForm
命令的許多實例都在消息框中給出錯誤消息:
The expression On Click you entered as the event property setting produced the following error: The OpenForm action was canceled. - The expression may not result in the name of macro, the name of a user-defined function, or [Event procedure]. - There may have been an error evaluating the function, event, or macro.
這是我收到的錯誤消息。
我的問題是,相同的代碼運行了大約 3 年,但突然對 Microsoft 或 Office 的一些更新可能會給此代碼帶來麻煩。
過去幾周有沒有人遇到過這個錯誤? 請讓我知道我們還能做些什么來使這項工作再次發揮作用。
這個線程很老,但我遇到了同樣的錯誤,花了幾個小時尋找答案。 一段時間后,我能夠找到原因並考慮發布我的答案,因為它可能會幫助處於類似情況的人。 使用 Access Forms 創建應用程序對我來說是新事物,因此錯誤消息並不直觀。
我的 forms 是主表數據條目 forms 並配置為Pop-up
和Modal
,並使用按鈕( OnClick
事件旁邊的 Combo 控件)在DoCmd.OpenForm
命令Me.Form.Name
作為參數發送到表單事務允許用戶快速添加新記錄。 此參數值在Forms.<formname>.Controls!<controlname>.Requery
Form_Open(Cancel As Integer)
事件中被拾取,稍后在使用 pop-向上形式。
當您激活已打開的表單時,似乎不會發生 Open 事件(參考: https://msdn.microsoft.com/en-us/library/office/aa211439(v=office.11).aspx ) . 每次我收到錯誤時,我的數據輸入表單都會在 Access 的設計視圖中打開。 所以我在設計模式下關閉了表單,並重復了這些步驟。 瞧! 沒有錯誤!
由於我將打開多個 forms,因此我現在需要按照上述 MSDN 參考鏈接中的建議進行測試並嘗試使用Form_Activate()
。
難道是安全設置是訪問? 所有最新版本的 Access 都有一個安全設置對話框,您可以在其中啟用(或禁用)應用程序中的宏。 我認為如果禁用宏,您會收到此錯誤。
frmNewPeerGroup 表格上的代碼是什么? 您使用的是哪個版本的 Access? 如果是 2003,則 sp3 會導致存在修補程序的問題。 您是否嘗試過反編譯和/或壓縮和修復?
如果您有原始 mdb,請檢查參考以確保它們都沒有標記為 MISSING。 這很可能是問題的原因,因為它是突然發生的。
要檢查參考,請查看菜單上的工具->參考以獲取代碼 window。
如果沒有缺少任何引用,您可以嘗試單步執行表單代碼以更准確地了解錯誤發生的位置。
您確定沒有缺少所需的參考資料之一(VBA IDE > 選項 > 參考資料)嗎?
如果您引用 Excel/Word 或外部對象,您確定對類型庫的引用是正確的(如果您使用特定版本而不是進行后期綁定)
您是否有機會在 64 位機器上構建 MDE?
我不知道這是否可以作為答案,但 OnOpen 事件中的代碼依賴於許多外部函數。 具體來說,代碼為一堆組合框的 RowSources 分配值列表。 我立即想到的危險信號是非 SQL 行源的長度是有限的,而在 Access 97 中,該限制是 2048 個字符(在 Access 2003 中,它是 32,750 - 不要問我為什么是這個數字。)。
因此,我立即看到的是,驅動創建這些值列表的函數的數據可能已經開始超過 2048 個字符的長度。
如果這是實際的答案,那么您可以編寫一個回調 function,它將返回 arrays 中的值,並且它不會對返回的長度有限制。 您將 RowsourceType 設置為回調 function 的名稱,並將 Rowsource 屬性留空。
在 A97 幫助中找到了回調 function 的示例(盡管我在 A2K3 幫助中找不到相同的示例)。 在 A97 幫助中,您可以通過搜索 RowsourceType 到達那里,然后在幫助 window 中,單擊“您也可以使用____用戶定義的函數____設置 RowSourceType 屬性”句子中的鏈接。
要檢查這一點,您只需找出 OnOpen 事件中引用的每個 arrays 從 GetValueListArray() 返回的字符串的長度。
向 OnOpen 事件添加錯誤處理程序也可能會有所幫助,特別是考慮到該特定子代碼中的代碼中有如此多的外部依賴項。
最后,讓我說它看起來像可怕的編程。 在我看來,其中大部分應該可以使用默認屬性進行設置。 我還質疑這種對 OpenArgs 的依賴以及這種未記錄的輸入值。 “5”是什么意思? “1”是什么意思? 這在某處有記錄嗎? 在我看來,這只是可怕的、糟糕的代碼。
我可能會使用獨立的 class 模塊來代替,因為這將在做什么方面進行自我記錄。 您將一個特定的命名屬性設置為 5,這將控制表單從用於填充組合框的 class 模塊方法中獲取的內容。 這一切都在一個地方,您可以使用有意義的屬性名稱來明確值 5 和 1 代表什么。 如果您在多個 forms 的 OnOpen 事件中有相同類型的代碼,則這樣做特別有幫助。 在這種情況下,將其移出表單模塊是不費吹灰之力的,唯一的問題是您是將其放在常規模塊中還是放在獨立的 class 模塊中(正如我所建議的那樣)。
無論如何,也許這些都不是重點,但它可能會給你一些想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.