返回列表 上一主題 發帖

[發問] 昨天開始接觸VBA,想簡化程式...

本帖最後由 luhpro 於 2016-6-2 22:34 編輯

回復 1# bsy4life
基本上對於一對一對應且不會重複的情形,
用 Dictionary 是一種滿容易達到需求的方式 :



== Module==
  1. Public dPeo
複製代碼
== ThisWorkbook ==
  1. Private Sub Workbook_Open()
  2.   Dim lRow&
  3.   
  4.   Set dPeo = CreateObject("Scripting.Dictionary")
  5.   lRow = 2
  6.   With Sheets("Sheet1")
  7.     While .Cells(lRow, 1) <> ""
  8.       dPeo(CStr(.Cells(lRow, 1))) = .Cells(lRow, 2)
  9.       lRow = lRow + 1
  10.     Wend
  11.   End With
  12.   ufMain.Show
  13. End Sub
複製代碼
== UserForm ==
  1. Private Sub cbNo_Change()
  2.   lbName.Caption = dPeo(cbNo.Text)
  3. End Sub

  4. Private Sub UserForm_Initialize()
  5.   Dim vTmp
  6.   
  7.   For Each vTmp In dPeo
  8.     cbNo.AddItem vTmp
  9.   Next
  10.   cbNo.ListIndex = 0
  11. End Sub
複製代碼
時間因素這裡只能先簡易的表現 : 建立資料對應 與 查詢 實現的方式,
其他就請自己酌予修改套用囉...

工號索引.zip (10.49 KB)

TOP

本帖最後由 luhpro 於 2016-6-5 00:54 編輯
回復  luhpro
謝謝 luhpro 大大
我的資質駑鈍,GBKEE大大的方式解決了我的問題
可是還是想瞭解一下, ...
bsy4life 發表於 2016-6-3 09:43

個人看到的情形提出淺見供你參考:
1.
Module 上設定 Public dPeo 為 "全域變數", (整個檔案任何地方都是使用同一個物件或變數)
但你在 ThisWorkBook 又設了一個 Dim dPeo,
Dim 的 dPeo 則為 區域變數,
只有這個 Sub 看的到,
執行到 End Sub 後 -> 出去 Sub 就自動被消滅了,

而因與 Module 的 dPeo 變數名稱相同,
這個 Sub 中使用到的 dPeo 一律預設使用 Dim 出來的這個 "區域變數",
也就是這個 Sub 中的賦值作業結果在其他任一 Sub 完全無法使用)

你的 Label8.Caption = dPeo(TextBox6.Text) 會發生錯誤是因為 UserForm 這個 Sub 看到的 dPeo 是空的.
(可以在執行到此行發錯誤時點 "偵錯" 按鈕, 再於 "即時運算視窗" 下此指令:   debug.print dpeo.count     你會看到結果是 0 )
所以 ThisWorkBook 的 Dim dPeo 必須拿掉, 其他 Sub 才能正常使用到 ThisWorkBook 賦予 dPeo 的資料.

2. userform 中:
    If IsNumeric(TextBox6.Text) Then
....
    Else
        If Not IsNumeric(TextBox6.Text) Then  <- 這一行是多餘的 If  X  Then ... Else 指令的 Else 就是 當 Not X 的條件為 "真" 時執行.
...
        End If     <-  搭配 IF 的指令, 當 IF 拿掉時也要跟著拿掉

    End If
    Label8.Caption = dPeo(TextBox6.Text)  '本來使用combobox,不知道如何取代所以用label測試
'不知為何要用 combobox ?
當使用者在 TextBox 輸入內容後,
這裡應該只有唯一的值(用 Label 物件就可以了),
而不是有好幾個值的清單物件.
除非你想要讓使用者接著可以再在 combobox 點選 操作人 以再次變更 TextBox 的內容.
註 : 若有此需求, 可以用 combobox.AddItem ... 以增加清單項目

End Sub

最後... 8# 的檔案有設密碼, 程式看不到...

額外建議 :
CNC名單(All) 如果應該是包含全部  操作人員(早, 中, 晚班) 的話,
可以考慮用 Dictionary 在開檔時在三個 Sheet 分別抓取,
然後在 CNC名單(All) 上動態建立清單.

TOP

        靜思自在 : 一句溫暖的話,就像往別人身上灑香水,自己會沾到兩三滴。
返回列表 上一主題