Board logo

標題: [發問] 如何大量建立COMBOBOX 表單方式 [打印本頁]

作者: lichang    時間: 2015-3-30 18:09     標題: 如何大量建立COMBOBOX 表單方式

大家好
    小弟最近想使用VBA建立自己畫面的下拉式表單功能,但因為相關選單實在太多,有什麼比較快的方式作宣告嗎??
例如以下:光一個COMBOBOX1就有32個需要宣告
而COMBOBOX又有20個需要做一樣的宣告
這樣我就必須寫32*20=640個
雖然可以做,但實在是太佔版面,所以有什麼好建議嗎??


ComboBox1.AddItem "aiSV4"     '----------------1
ComboBox1.AddItem "aiSV20"     '----------------2
ComboBox1.AddItem "aiSV40"     '----------------3
ComboBox1.AddItem "aiSV80"    '----------------4
ComboBox1.AddItem "aiSV160"    '----------------5
ComboBox1.AddItem "aiSV360"    '----------------6
ComboBox1.AddItem "aiSV4/4"    '----------------7
ComboBox1.AddItem "aiSV4/20"    '----------------8
ComboBox1.AddItem "aiSV20/20"    '----------------9
ComboBox1.AddItem "aiSV20/40"   '----------------10
ComboBox1.AddItem "aiSV40/40"   '----------------11
ComboBox1.AddItem "aiSV40/80"   '----------------12
ComboBox1.AddItem "aiSV80/80"   '----------------13
ComboBox1.AddItem "aiSV80/160"   '----------------14
ComboBox1.AddItem "aiSV160/160"  '----------------15
ComboBox1.AddItem "aiSV4/4/4"   '----------------16
ComboBox1.AddItem "aiSV20/20/20" '----------------17
ComboBox1.AddItem "aiSV20/20/40" '----------------18
ComboBox1.AddItem "aiSV40/40/40" '----------------19
ComboBox1.AddItem " "            '----------------20
ComboBox1.AddItem "aiSV10 HV"   '----------------21
ComboBox1.AddItem "aiSV20 HV"  '----------------22
ComboBox1.AddItem "aiSV40 HV"  '----------------23
ComboBox1.AddItem "aiSV80 HV"  '----------------24
ComboBox1.AddItem "aiSV180 HV" '----------------25
ComboBox1.AddItem "aiSV360 HV" '----------------26
ComboBox1.AddItem "aiSV10/10 HV" '----------------27
ComboBox1.AddItem "aiSV20/20 HV" '----------------28
ComboBox1.AddItem "aiSV20/40 HV" '----------------29
ComboBox1.AddItem "aiSV40/40 HV" '----------------30
ComboBox1.AddItem "aiSV40/80 HV" '----------------31
ComboBox1.AddItem "aiSV80/80 HV" '----------------32
作者: bobomi    時間: 2015-3-30 18:31

把可以規則化的部分拆開來用 For 取代

ex
ComboBox1.AddItem "aiSV20/20"    '----------------9
ComboBox1.AddItem "aiSV20/40"   '----------------10
ComboBox1.AddItem "aiSV40/40"   '----------------11
ComboBox1.AddItem "aiSV40/80"   '----------------12
ComboBox1.AddItem "aiSV80/80"   '----------------13
ComboBox1.AddItem "aiSV80/160"   '----------------14
ComboBox1.AddItem "aiSV160/160"  '----------------15

for w = 20  to 140 Step 20
ComboBox1.AddItem "aiSV" &  w &  "/"  & w   
ComboBox1.AddItem "aiSV" &  w &  "/"  & (w  *2  )
next
作者: stillfish00    時間: 2015-3-30 19:20

回復 1# lichang
  1.     Dim ar
  2.     '有幾個填幾個
  3.     ar = Array("aiSV4", _
  4.                 "aiSV20", _
  5.                 "aiSV40", _
  6.                 "aiSV80", _
  7.                 "aiSV160")
  8.                     
  9.     'combobox1 to combobox20
  10.     For i = 1 To 20
  11.         Controls("ComboBox" & i).List = ar
  12.     Next
複製代碼

作者: lichang    時間: 2015-3-30 23:11

回復 3# stillfish00

超強,謝謝您的解惑!!
測試ok!!
作者: mark15jill    時間: 2015-3-30 23:23

本帖最後由 mark15jill 於 2015-3-30 23:30 編輯

回復 3# stillfish00

留幾個伏筆讓你練習...
以下程式碼為動態創 8*4 個combobox   每個combobox 自動加入 32筆資料(範例檔  資料我是丟在E欄位)
置於 動態新增的combobox 變更時,就要妳自己去設定想要的功能+變數了~


[attach]20549[/attach]
  1. Dim  thecombobox() As New Class1 '動態陣列 宣告為新的Class1物件類別物件

  2. Private Sub ComboBox1_Change()

  3. End Sub

  4. Private Sub CommandButton1_Click()
  5.      Dim mycombobox1 As MSForms.ComboBox

  6.     Dim Sh As Worksheet
  7.      Set Sh = ActiveSheet

  8.     kk = 1

  9.     For sjy = 1 To 400 Step 100

  10.         For sja = 1 To 800 Step 100

  11.             With Frame1.Controls.Add("forms.combobox.1")
  12.                 Sh.Cells(kk, 3) = .Name
  13.                 .Left = 10 + sja
  14.                 .Top = 10 + sjy
  15.                 .Width = 90
  16.                 .Height = 20

  17.                 .TextAlign = fmTextAlignCenter

  18.                 .BackColor = &HFFFFC0

  19.                 '.a = Sh.Cells(kk, 1)
  20.                  ReDim Preserve thecombobox(0 To kk - 1)              '重新配置 動態陣列
  21.                 Set thecombobox(kk - 1).xlcombobox = Controls(.Name)
  22.                 '動態陣列的元素 指定到物件模組內的物件
  23.             For ewk = 1 To 32
  24.                  eee = Cells(ewk, 5)
  25.                 thecombobox(kk - 1).xlcombobox.AddItem (eee)
  26.             Next
  27.             End With

  28.             kk = kk + 1

  29.         Next

  30.     Next

  31. End Sub

  32. Private Sub UserForm_Click()

  33. End Sub
複製代碼
[attach]20547[/attach][attach]20548[/attach]
作者: lichang    時間: 2015-3-31 16:05

回復 3# stillfish00

那請問一下喔!!那我的COMBOBOX_CLICK 有辦法一樣的方式處理嗎??
作者: stillfish00    時間: 2015-3-31 16:47

回復 6# lichang
如果要共用 Click 的觸發行為(就是共用click event)
就要像 #5樓這樣 , 改用物件類別模組喔~
作者: stillfish00    時間: 2015-3-31 17:20

回復 6# lichang
下面是一簡單例子
[attach]20550[/attach]
UserForm1 程式碼
  1. Private Temp() As Class1

  2. Private Sub UserForm_Initialize()
  3.     Dim i As Long
  4.     For i = 1 To 4
  5.         ReDim Preserve Temp(i)
  6.         Set Temp(i) = New Class1
  7.         Temp(i).InitialControl Controls("ComboBox" & i)
  8.     Next
  9. End Sub
複製代碼
新增物件類別模組 Class1
  1. Public WithEvents ComboBox As MSForms.ComboBox

  2. Private Sub ComboBox_Change()
  3.     MsgBox ComboBox.Value    'change 動作
  4. End Sub

  5. Public Sub InitialControl(ByRef oControl As MSForms.ComboBox)
  6.     Set ComboBox = oControl
  7.     ComboBox.List = Array("test1", "test2", "test3", "test4")
  8. End Sub
複製代碼

作者: lichang    時間: 2015-3-31 18:51

好的,我試看看,謝謝指教!!
作者: lichang    時間: 2015-4-23 12:01

回復 8# stillfish00

你好,請問一下,我現在測試,確實有變動了,但是我想按造不同格數建立選擇表單
例如:第一選單,建立在a1
           第二選單,建立在a2
請問該如何使用呢??
(i好像沒辦法直接帶過來change使用)
作者: stillfish00    時間: 2015-4-24 09:10

回復 10# lichang
看不懂你的意思,請附圖或檔案說明一下,謝謝。
作者: lichang    時間: 2015-4-24 15:40

回復 11# stillfish00

如以下附圖,當我選擇到第二個選單時,選擇的東西自己建立到B1801,以此類推!!
不好意思,一直麻煩你了!!
[attach]20783[/attach]
作者: stillfish00    時間: 2015-4-24 16:23

回復 12# lichang
不確定是不是你要的 : 每個ComboBox 都有一個對應的儲存格 , 每次ComboBox選擇改變時,對應的儲存格值也改變。

因為沒程式碼我直接用 8#的例子來修改
UserForm1 程式碼
  1. Private Temp() As Class1

  2. Private Sub UserForm_Initialize()
  3.     Dim i As Long
  4.     For i = 1 To 4
  5.         ReDim Preserve Temp(i)
  6.         Set Temp(i) = New Class1
  7.         Temp(i).InitialControl Controls("ComboBox" & i), ActiveSheet.Cells(1799 + i, "B")
  8.     Next
  9. End Sub
複製代碼
新增物件類別模組 Class1
  1. Public WithEvents ComboBox As MSForms.ComboBox
  2. Private linkCell As Range

  3. Private Sub ComboBox_Change()
  4.     linkCell.Value = ComboBox.Value
  5. End Sub

  6. Public Sub InitialControl(ByRef oControl As MSForms.ComboBox, ByRef rngLinkCell As Range)
  7.     Set ComboBox = oControl
  8.     ComboBox.List = Array("test1", "test2", "test3", "test4")
  9.     Set linkCell = rngLinkCell
  10. End Sub
複製代碼

作者: stillfish00    時間: 2015-4-24 16:34

回復 12# lichang
不過通常會是透過一個按鈕去觸發
再一次性把表單上的資料更新到工作表
而不是透過Combobox change event
這樣也比較簡單
  1. Private Sub CommandButton1_Click()
  2.     With ActiveSheet.Range("B1799")
  3.         For i = 1 To 4
  4.             .Cells(i, 1).Value = Controls("ComboBox" & i).Value
  5.         Next
  6.     End With
  7. End Sub
複製代碼

作者: lichang    時間: 2015-4-24 17:29

回復 14# stillfish00

謝謝您的回覆,不過因為實在是太多選單,所以才會想用一次管理的方式做!!
這樣對程式撰寫也比較好管理,還有我使用您第一個建議的方式,已經完成測試,確實是我要的東西
您真是太強了ˊ!!

題外話,請問您這些知識,是要看那些書籍才能知道如何撰寫,方便提供一下嗎??
作者: stillfish00    時間: 2015-4-24 18:41

回復 15# lichang
書是看得不多,最有收穫的是
Professional Excel Development 2nd
但這本不是給入門的人看的,入坑前三思。

最主要是常寫,遇到問題上網google,
要學會下對關鍵字,八成都有答案。
多數答案都會連結到這個論壇或ExcelHome(所以才會加入這論壇)
中文找不到,改英文關鍵字,多半問題會在StackOverflow得到解答

寫多了,遇過問題就多,解決過的問題也就多了,如此而已。
作者: lichang    時間: 2015-4-28 00:01

回復 16# stillfish00

謝謝你的解答,我會再努力學習!!
希望以後能不吝澀再指教!!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)