標題:
[發問]
如何大量建立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
Dim ar
'有幾個填幾個
ar = Array("aiSV4", _
"aiSV20", _
"aiSV40", _
"aiSV80", _
"aiSV160")
'combobox1 to combobox20
For i = 1 To 20
Controls("ComboBox" & i).List = ar
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]
Dim thecombobox() As New Class1 '動態陣列 宣告為新的Class1物件類別物件
Private Sub ComboBox1_Change()
End Sub
Private Sub CommandButton1_Click()
Dim mycombobox1 As MSForms.ComboBox
Dim Sh As Worksheet
Set Sh = ActiveSheet
kk = 1
For sjy = 1 To 400 Step 100
For sja = 1 To 800 Step 100
With Frame1.Controls.Add("forms.combobox.1")
Sh.Cells(kk, 3) = .Name
.Left = 10 + sja
.Top = 10 + sjy
.Width = 90
.Height = 20
.TextAlign = fmTextAlignCenter
.BackColor = &HFFFFC0
'.a = Sh.Cells(kk, 1)
ReDim Preserve thecombobox(0 To kk - 1) '重新配置 動態陣列
Set thecombobox(kk - 1).xlcombobox = Controls(.Name)
'動態陣列的元素 指定到物件模組內的物件
For ewk = 1 To 32
eee = Cells(ewk, 5)
thecombobox(kk - 1).xlcombobox.AddItem (eee)
Next
End With
kk = kk + 1
Next
Next
End Sub
Private Sub UserForm_Click()
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 程式碼
Private Temp() As Class1
Private Sub UserForm_Initialize()
Dim i As Long
For i = 1 To 4
ReDim Preserve Temp(i)
Set Temp(i) = New Class1
Temp(i).InitialControl Controls("ComboBox" & i)
Next
End Sub
複製代碼
新增物件類別模組 Class1
Public WithEvents ComboBox As MSForms.ComboBox
Private Sub ComboBox_Change()
MsgBox ComboBox.Value 'change 動作
End Sub
Public Sub InitialControl(ByRef oControl As MSForms.ComboBox)
Set ComboBox = oControl
ComboBox.List = Array("test1", "test2", "test3", "test4")
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 程式碼
Private Temp() As Class1
Private Sub UserForm_Initialize()
Dim i As Long
For i = 1 To 4
ReDim Preserve Temp(i)
Set Temp(i) = New Class1
Temp(i).InitialControl Controls("ComboBox" & i), ActiveSheet.Cells(1799 + i, "B")
Next
End Sub
複製代碼
新增物件類別模組 Class1
Public WithEvents ComboBox As MSForms.ComboBox
Private linkCell As Range
Private Sub ComboBox_Change()
linkCell.Value = ComboBox.Value
End Sub
Public Sub InitialControl(ByRef oControl As MSForms.ComboBox, ByRef rngLinkCell As Range)
Set ComboBox = oControl
ComboBox.List = Array("test1", "test2", "test3", "test4")
Set linkCell = rngLinkCell
End Sub
複製代碼
作者:
stillfish00
時間:
2015-4-24 16:34
回復
12#
lichang
不過通常會是透過一個按鈕去觸發
再一次性把表單上的資料更新到工作表
而不是透過Combobox change event
這樣也比較簡單
Private Sub CommandButton1_Click()
With ActiveSheet.Range("B1799")
For i = 1 To 4
.Cells(i, 1).Value = Controls("ComboBox" & i).Value
Next
End With
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/)