- 帖子
- 835
- 主題
- 6
- 精華
- 0
- 積分
- 915
- 點名
- 0
- 作業系統
- Win 10,7
- 軟體版本
- 2019,2013,2003
- 閱讀權限
- 50
- 性別
- 男
- 註冊時間
- 2010-5-3
- 最後登錄
- 2024-11-14
|
13#
發表於 2016-4-22 23:32
| 只看該作者
本帖最後由 luhpro 於 2016-4-22 23:35 編輯
回復 9# chaoyiho
抱歉,現在才有時間回文.
我之所以會把 vD 的定義放在 Module 上,
原先的構想是資料檔案就那一個,
那麼開始時就讀取一次,
字典建好後面只要拿來用就好了,
不用每按一次按鈕就又要重新讀取檔案及建立對應資料.
習慣性的點兩下 "開啟舊檔" 按鈕開啟 CommandButton1_Click 實做自己的構想,
因為回文後才發現處理 "您沒有開啟母檔" 的 Sub 有好幾個, O.O"
怕會與之前結果重疊才會加那一行消除前手.
至於你發生的問題,
我在這兩個檔案間操作並不會發生,
因為 RemoveAll 只清除 Key 與 資料 間的對應關係,
並不會刪除 vD 字典物件.
研判可能是操作中程式先後順序問題,
導致你沒有執行到 Set vD = CreateObject("Scripting.Dictionary").
而關於問題的處理:
在 10# 的是一種簡單明瞭的處理方法.
不過依個人之前的經驗,
也有可能是個人功力太差,
我發現 Excel 上並不能用一個 Is Nothing 就包辦所有這類物件錯誤的判斷,
因為這一行指令也可能會出現錯誤(因為連 vD 這個物件都不能出現在判斷式中)
另有一個很多人使用的處理方法,
就是一開始就加個 On Error Resume Next,
這樣遇到錯誤就當做沒問題發生繼續跑下去,
運氣好就沒事...
但要是運氣不好的話...
比較正統且不易出現非預期結果的做法是針對錯誤做專門的處理. (請搜尋 On Error 陳述式 的說明)
Sub ChkFile()
...
On Error GoTo ErrorHandler ' 開啟錯誤處理程式。
vD.RemoveAll ' 發生錯誤需做處理的程式
On Error Goto 0 ' 關閉錯誤處理程式。
...
Exit Sub ' 離開程式,以避免進入錯誤處理程式。
ErrorHandler: ' 錯誤處理程式。
Select Case Err.Number ' 檢查錯誤代碼。
Case 424 ' 發生「此處需要物件」之錯誤。
Set vD = CreateObject("Scripting.Dictionary") ' 建立物件。(針對錯誤發生原因做補救或處理)
Case Else ' 用 Err.number 取得錯誤代碼, 用 Err.Description 取得錯誤說明文字. Err.Clear 清除錯誤旗標
MsgBox Prompt:=Err.Description, Buttons:=vbOK, Title:="發生錯誤"
Err.Clear
Exit Sub
End Select
Resume ' 將程式執行步驟回到原發生錯誤的陳述式中。
End Sub
另外, 針對重複且可替代的程序建議另建立副程式以供呼叫, 如:
Image22_Click
Image3_Click
Image32_Click()
CommandButton1_Click()
CommandButton10_Click()
CommandButton14_Click()
CommandButton6_Click()
的內容全部都是 :
If Application.FindFile = False Then
MsgBox "您沒有開啟母檔"
End If
那就可以把這段歸到 Module 內, 設為 Public, 再個別放入呼叫指令即可.
好處是程式碼容易修改與管理, 縮短程式碼, 辨識度也較好.- Public Sub ChkFile()
- If Application.FindFile = False Then
- MsgBox "您沒有開啟母檔"
- End If
- Dim lRow&
-
- lRow = 3
-
- On Error GoTo ErrorHandler ' 開啟錯誤處理程式。
- vD.RemoveAll
- EXCEL表單處理介面.ListBox1.Clear ' 清除 ListBox 的選單
- On Error GoTo 0 ' 關閉錯誤處理程式。
-
- While Cells(lRow, 1) <> ""
- If Not vD.Exists(CStr(Cells(lRow, 1))) Then
- EXCEL表單處理介面.ListBox1.AddItem CStr(Cells(lRow, 1))
- vD(CStr(Cells(lRow, 1))) = lRow
- End If
- lRow = lRow + 1
- Wend
- Exit Sub ' 離開程式,以避免進入錯誤處理程式。
- ErrorHandler: ' 錯誤處理程式。
- Select Case Err.Number ' 檢查錯誤代碼。
-
- Case 424 ' 發生「此處需要物件」之錯誤。
- Set vD = CreateObject("Scripting.Dictionary") ' 建立物件。
-
- Case Else ' 可用 Err.number 取得錯誤代碼, 用 Err.Description 取得錯誤說明文字. Err.Clear 清除錯誤旗標
- MsgBox prompt:="錯誤代碼 : " & Err.Number & Chr(10) & "錯誤原因:" & Err.Description, Buttons:=vbOK, Title:="發生錯誤"
- Err.Clear
- Exit Sub
- End Select
- Resume ' 將程式執行步驟回到原發生錯誤的陳述式中。
-
- End Sub
複製代碼- Private Sub CommandButton1_Click()
- ChkFile
- End Sub
複製代碼 餘類推.
表單處理系統3.2(PLS)-a2.zip (631.5 KB)
|
|