昨天我正在圍繞SE和網絡尋找一種方法,將來自多個記錄的特定字段連接在一起,作爲Access數據庫中查詢/報告結構的一部分。我發現this SE question這導致我轉向了Allen Browne的ConcatRelated()函數 here。在通過命名該模塊與功能相同來錯誤地走下去之後,我按照需要工作。爲什麼這個錯誤導致循環而不是退出函數?
但是,在我最初嘗試在查詢中使用它時,我犯了一個愚蠢的錯誤,並給它提供了等於"WHERE Employee = " & [Employee]
而不是正確的'WHERE Employee = ' & [Employee] & "'"
作爲字符串評估所需的參數。這導致了預期的3464(數據類型不匹配)運行時錯誤,但是在Allen的修改中,它顯示了導致錯誤的實際字符串。毫不奇怪,我只需點擊「確定」即可修復SQL。我很驚訝地發現這沒有奏效。只要我點擊了msgbox,它就會再次回來。我用Ctrl+Break
來停止代碼,但點擊End
導致它回到相同的錯誤,而不是實際結束函數。我可以停止循環的唯一方法是點擊Debug
,這將我放入代碼中,但我無法離開代碼來更改原始查詢。打到重置導致錯誤再次彈出,並讓我馬上回到循環。
我最終從錯誤處理程序中註釋掉所有內容並將其告知Exit Function
,最終擺脫了困境。我知道最有可能只是掩蓋了問題,所以我添加了一個計數器,並在每次調用錯誤處理程序時增加計數器,然後在即時窗口中檢查該值。果然,每次我在查詢中的某處點擊時,它會增加10或更多。
我不明白是什麼導致錯誤循環。 Err_Handler
應該將它從第一個錯誤的函數中轉儲出來,因爲沒有任何信息告訴它嘗試Resume
,並且它專門將它指向Exit_Handler
,該函數重置一對變量,然後執行Exit Function
。即使直接將Exit Function
置於Err_Handler
仍會導致多次增加到我的錯誤計數器。進一步試驗Debug
突出顯示了線Set rs = DBEngine(0)(0).OpenRecordset(strSql, dbOpenDynaset)
。我不知道它有多大幫助,因爲它是函數構造值strSql
後的第一行。評論它,導致下一行被突出顯示。
我知道爲什麼導致最初的錯誤(我的錯誤),這是一個簡單的修復。我對錯誤的意外結果以及它創建的循環更感興趣。
TL;博士
- 什麼會導致此錯誤循環,而不是退出或斷裂了嗎?
- 爲什麼如果錯誤處理調用立即退出,但似乎首先似乎無限循環地添加諸如
msgbox
之類的東西,或者至少在我厭倦了單擊之前似乎發生有限的次數。 - 有沒有辦法在代碼中繞過這個問題,以便它在第一次出現錯誤後實際停止?
我最初使用的是一張有600多條記錄的表格,但後來用一張只有10條記錄的小表進行了實驗。 小表查詢SELECT TestEmpHistory.Employee, ConcatRelated("EmpGroup", "TestEmpHistory", "Employee = " & Employee) AS CompliedNames FROM TestEmpHistory
重現錯誤。 表TestEmpHistory
採用以下格式:
ID(AutoNum)| Employee | EmpGroup |查詢中未引用的其他字段
ID | Employee | EmpGroup |
1 | Employee1 | G & A
2 | Employee1 |銷售
3 | Employee2 | CSR
4 | Employee2 | G & A
5 | Employee3 | CSR
6 | Employee3 |編程
7 | Employee3 | G & A
8 | Employee4 | CSR
9 | Employee4 | CSR
10 | Employee4 |編程
我使用Access 2016
我不認爲有人會讀你所有的問題,你可以總結它或添加一些代碼? – Moreno