返回列表 上一主題 發帖

[發問] 怎麼在USERFORM中加入可篩選複選之樹狀圖

本帖最後由 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, 再個別放入呼叫指令即可.
好處是程式碼容易修改與管理, 縮短程式碼, 辨識度也較好.
  1. Public Sub ChkFile()
  2.     If Application.FindFile = False Then
  3.         MsgBox "您沒有開啟母檔"
  4.     End If

  5.     Dim lRow&
  6.    
  7.     lRow = 3
  8.    
  9.     On Error GoTo ErrorHandler    ' 開啟錯誤處理程式。
  10.     vD.RemoveAll
  11.     EXCEL表單處理介面.ListBox1.Clear ' 清除 ListBox 的選單
  12.     On Error GoTo 0    ' 關閉錯誤處理程式。
  13.    
  14.     While Cells(lRow, 1) <> ""
  15.       If Not vD.Exists(CStr(Cells(lRow, 1))) Then
  16.         EXCEL表單處理介面.ListBox1.AddItem CStr(Cells(lRow, 1))
  17.         vD(CStr(Cells(lRow, 1))) = lRow
  18.       End If
  19.       lRow = lRow + 1
  20.     Wend
  21. Exit Sub        ' 離開程式,以避免進入錯誤處理程式。

  22. ErrorHandler:    ' 錯誤處理程式。
  23.     Select Case Err.Number    ' 檢查錯誤代碼。
  24.    
  25.         Case 424    ' 發生「此處需要物件」之錯誤。
  26.             Set vD = CreateObject("Scripting.Dictionary") ' 建立物件。
  27.             
  28.         Case Else   ' 可用 Err.number 取得錯誤代碼, 用 Err.Description 取得錯誤說明文字. Err.Clear 清除錯誤旗標
  29.             MsgBox prompt:="錯誤代碼 : " & Err.Number & Chr(10) & "錯誤原因:" & Err.Description, Buttons:=vbOK, Title:="發生錯誤"
  30.             Err.Clear
  31.             Exit Sub
  32.     End Select
  33.     Resume    ' 將程式執行步驟回到原發生錯誤的陳述式中。
  34.    
  35. End Sub
複製代碼
  1. Private Sub CommandButton1_Click()
  2.   ChkFile
  3. End Sub
複製代碼
餘類推.

表單處理系統3.2(PLS)-a2.zip (631.5 KB)

TOP

回復 9# chaoyiho
我使用 DEBUG MODE 觀察,會產生找不到物件的事實,
故修改成如下:

試試看!

TOP

回復 9# chaoyiho

你在模組1 (Module1) 加入了 Public vD
的宣告後,並於 Workbook_Open() 裡
設定了  vD 的屬性,基本上便 OK 了。
往後程式碼之執行均能自動辨認它了。

TOP

  Public vD  as object
'
    Private Sub CommandButton1_Click()
        If Application.FindFile = False Then
            MsgBox "您沒有開啟母檔"
        End If

        Dim lRow&
      
      if vD is nothing then  Set vD = CreateObject("Scripting.Dictionary")
        lRow = 3
        vD.RemoveAll
        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
    End Sub

TOP

回復 7# c_c_lai

謝謝前輩提醒,我一直都有加入
但是還是持續出現找不到物件(按下分析之後)
就會跳出錯誤424
到底怎麼會這樣?(崩潰)

TOP

回復 6# jackyq

前輩好,我有在模組1裡面寫入宣告Public vD

但是一旦執行分析
但是還是出現需要物件
真的不知道怎麼辦 Q_Q

TOP

回復 5# chaoyiho

TOP

大大可能 在 module 漏寫   Public vD  ???

TOP

前輩您可能在忙 所以沒有辦法幫我解答..
可是我真的很想知道!
不知道有沒有人可以替我解答呢?

TOP

回復 3# luhpro
請問前輩
我按照您的指示去做練習之後
發現
他的vD.RemoveAll常常都會出現錯誤訊息
"需要物件"或是"未定義"
而無法運行
請問這樣子是要怎麼解決呢?
還煩請幫忙!!

TOP

        靜思自在 : 人事的艱難與琢磨,就是一種考驗。
返回列表 上一主題