簡體   English   中英

在 MS-Access VBA 代碼中取消了 Openform 操作

[英]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-upModal ,並使用按鈕( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM