Board logo

標題: VBA是否可以建立動態UserForm [打印本頁]

作者: clio    時間: 2016-3-10 16:00     標題: VBA是否可以建立動態UserForm

請教各位高手,不知道VBA是否能建立動態的UserForm,及即時決定這個動態的視窗裡面的控制項數目的多少呢?
例如,程式在執行中,會抓取不同資料的人數,每一個資料區塊的人數不同,要產生視窗來作選擇那些人是還要保留在群組內,可能第一個群組內有4個成員,我需要一個動態視窗裡面有四個人名的CheckBox,讓我選擇保留下來的人,接下執行第二群組,裡面可能有八個人,那就要動態產品一個視窗,裡面有八個對應的CheckBox,由於程式會因抓到群組判斷裡面的人數再來產品相對應數量的CheckBox,這樣程式有辨法寫嗎?還請各位高手給予開解,感謝您們
作者: jackyq    時間: 2016-3-11 01:04

本帖最後由 jackyq 於 2016-3-11 01:05 編輯

大大自己研究看看
http://stackoverflow.com/questions/10944064/change-individual-listbox-item-font-in-excel
作者: clio    時間: 2016-3-15 13:42     標題: VBA是否可以建立動態UserForm及裡面一控制項及數目

請教各位高手,不知道VBA是否能建立動態的UserForm,及即時決定這個動態的視窗裡面的控制項數目的多少呢?
例如,程式執行中,我可以依據輸入的引數,決定要有幾個Check Box ,幾個Option Button,幾個List Box嗎?感謝您們
作者: clio    時間: 2016-3-15 13:44

感謝您…除了這個,能否有辨法能自動新增其它的控制項,如Option Button, Check box, Label... 等呢?
作者: jackyq    時間: 2016-3-15 14:18

回復 3# clio


    Dim TextBox As MSForms.TextBox
Set TextBox = UserForm1.Controls.Add("forms.TextBox.1")
    TextBox.Top = 0

Dim ListBox As MSForms.ListBox
Set ListBox = UserForm1.Controls.Add("forms.ListBox.1")
    ListBox.Top = 30
  
Dim Label As MSForms.Label
Set Label = UserForm1.Controls.Add("forms.Label.1")
    Label.Top = 120
    Label.BorderStyle = fmBorderStyleSingle
    Label.Caption = "13123"
作者: jackyq    時間: 2016-3-15 14:20

本帖最後由 jackyq 於 2016-3-15 14:23 編輯

用動態的話
事件就麻煩了
還要多一堆 Class 或者用 hook
才會建議你可以的話 用 Listbox 就好了
作者: clio    時間: 2016-3-15 18:30

感謝大大的告知,這樣我就會用了,另外請教一個問題,同理是不是也可以動態Create UserForm呢,可以用程式直接Create一個新的UserForm嗎?
作者: jackyq    時間: 2016-3-15 19:56

' UserForm1 必須事先已經存在

Dim F As UserForm1
Dim TextBox As MSForms.TextBox
Dim ListBox As MSForms.ListBox

Set F = New UserForm1
F.Show 0
F.Caption = "Form 1"
Set TextBox = F.Controls.Add("forms.TextBox.1")
    TextBox.Top = 0

Set ListBox = F.Controls.Add("forms.ListBox.1")
    ListBox.Top = 30


Set F = New UserForm1
F.Show 0
F.Top = F.Top + 100
F.Left = F.Left + 100
F.Caption = "Form 2"
Set TextBox = F.Controls.Add("forms.TextBox.1")
    TextBox.Top = 0


Set ListBox = F.Controls.Add("forms.ListBox.1")
    ListBox.Top = 30
作者: clio    時間: 2016-3-16 11:31

所以一定要有一個先存在的UserForm,而裡面的Controls都可以自動加,唯有最上層的UserForm一定要先存在,無法自動建立最上層的UserForm,這樣說對吧
作者: jackyq    時間: 2016-3-16 12:40

自動建立 UserForm
https://support.microsoft.com/en-us/kb/204330
作者: clio    時間: 2016-3-16 16:37

看了,但是仍然有些問題,像Excel我用
Set mynewform = Application.VBE.ActiveVBProject.VBComponents.Add(vbext_ct_MSForm)

但是會出現失敗說,不知道要改什麼
作者: jackyq    時間: 2016-3-16 20:24

建議大大 UserForm 不要用動態

Set FC = Application.VBE.ActiveVBProject.VBComponents.Add(3)
Set F = UserForms.Add(FC.Name)
    F.Show 0
            
Set TextBox = F.Controls.Add("forms.TextBox.1")
    TextBox.Top = 0
Set ListBox = F.Controls.Add("forms.ListBox.1")
    ListBox.Top = 30
   
MsgBox "Stop"
Application.VBE.ActiveVBProject.VBComponents.Remove FC
作者: 准提部林    時間: 2016-3-17 09:59

本帖最後由 准提部林 於 2016-3-17 10:06 編輯

除非專業, 動態表單及物件增刪, 對新手是高難度, 老手不必然可以完全掌握,
如果還要讓新增物件有觸發事件程式, 就更複雜,
我的方式是預設必要物件, 再以程式去決定哪些物件顯示與否,
至於CHECKBOX的功能, 有時用LISTBOX的多重選擇也可達到目的,
不過表單的設計不算單純, 對新手並不容易, 最好去買本專門介紹表單的書看,
有基礎才能去運用各項技巧~~~
作者: clio    時間: 2016-3-17 14:27

回復 11# jackyq

感謝大大的回覆:
我好像在第一行就會卡住,無法執行的過去說,大大的也會這樣子嗎?
感謝大大的提醒,我會聽從您的建議,UserForm不使用動態的,因為這邊有些觸發點,不好處理,只是會想知道怎麼樣可以動態建立UserForm只是好奇,想說可以多學一樣而已
作者: clio    時間: 2016-3-17 14:35

回復 12# 准提部林

感謝准提部林大大的回覆
確實如同大大所說,這二天研究的過程中,有試過動態建立Control,所以也好奇是否能動態建立UserForm,但是也如同大大所說,物件的觸發,這個倒是一個大大的問題
會接受准大的建議,把一些可能會用到的預設在UserForm內,再依程式代入的參數,來決定那些要顯示,這個確實也是我考慮過的方法之一,只是對於這方面的研究還真的是有時會想知道
有沒有機會這樣作?才會又問了動態UserForm的問題,我也有去讀書館查了一些書,但是對於VBA詳盡的好像沒有見到,不知道准提部林大大有沒有建議的書籍,可以讓我去買回來參考的,感謝您。
作者: 准提部林    時間: 2016-3-17 15:08

回復 14# clio


沒辦法提供有哪些書籍的參考, 建議去書局找, 這是工具書, 可多買幾本,
除了表單應用, VBA最基礎的書也必備, 放在手邊, 遇問題就去翻, 找到解決方法, 就學一招,
若沒有基礎, 只在此發問, 不止問不到重點, 別人給的答案, 也是一知半解,
另, VBE內建說明檔是非常好的學習管道, 花些時間去尋寶~~~

學VBA, 我只建議用〔三花牌〕--花時間.花精神,花金錢(買書)∼∼∼別無它途
有了基礎,再來看別人寫的程式,就有豁然開朗的感覺,急不來!!!
作者: clio    時間: 2016-3-17 16:48

回復 15# 准提部林


    感謝大大的回覆,我也是主要是在說明內找範例,學的,這個真的要花時間,研究、測試,就會發現要領在那邊,學習過程真的是很愉快…
作者: linyancheng    時間: 2016-3-20 16:26

事件用「物件類別模組」處理,很方便。
作者: mark15jill    時間: 2016-3-21 14:50

回復 1# clio


    1.可以動態產生元件、userform
    2.理論上可以,但看妳要怎判斷,只是 不懂妳說的意思
作者: clio    時間: 2016-3-22 17:23

回復 2# mark15jill

假如,程式動態產生一個Userform, 而裡面有一個ListBox,這樣怎麼做
作者: mark15jill    時間: 2016-3-24 15:53

回復  mark15jill

假如,程式動態產生一個Userform, 而裡面有一個ListBox,這樣怎麼做
clio 發表於 2016-3-22 17:23


     有爬文了嗎??  ...
   
http://forum.twbts.com/viewthread.php?tid=8858

作者: clio    時間: 2016-3-24 16:04

回復 4# mark15jill

感謝大大,這個我會了,有爬文了,之前有人發表過類似的,感謝您的回覆
作者: clio    時間: 2016-3-24 16:07

回復 11# jackyq

感謝前輩的告知,我又爬了一下文,發現我需要在安全設定那邊再把「信任存取VBA專案物件模型(V)」勾選起來,這樣就能正常動作了
作者: mark15jill    時間: 2016-3-24 16:09

回復  mark15jill

感謝大大,這個我會了,有爬文了,之前有人發表過類似的,感謝您的回覆
clio 發表於 2016-3-24 16:04



    你這樣會讓人不想解答...  不爬文  人家提示後 說你會...
作者: clio    時間: 2016-3-24 17:04

回復 6# mark15jill

前輩,我比較不會說話,對不起
因為真的來這邊找資料的時間不久,其實這個問題困擾我很久了,幾年前有問過相同的題目,那時得不到好的決解方式,也找了幾本書,問了一些同事,經過二三年後,真的有遇到非建立UserForm不可的難題
在網路上找了一些資訊,有遇到有人介紹來麻辣家族的論壇,所以發問了一些問題,也有很多前輩的指點,當然我也遇到一些卡關,這二天一直研究,才找到是設定的問題,也是因為這二天一直在論壇找資料也爬
文到前非指引的這一則文,之前有輩問過相同的問題,這個真的很對不起,是我的疏乎,很感謝您給我的指引,真的很感謝您,有造成妳不舒服的地方,真的很對不起,還請見諒,我會多注意的
作者: mark15jill    時間: 2016-3-27 15:47

回復  mark15jill

前輩,我比較不會說話,對不起
因為真的來這邊找資料的時間不久,其實這個問題困擾我 ...
clio 發表於 2016-3-24 17:04



    不用想太多   我上次發的那段話  只是根據你回覆我的內容 加以回覆而已
    至少 你還很有禮貌..  有些人 問了 得到答案  就 不見人影   等下次有問題 才又出現...
   
     給你我之前弄得 和 收集 的程式參考
    [attach]23616[/attach]
作者: modelcrazyer    時間: 2016-3-27 21:03

針對這個想請問前輩,我動態產生了一個label但是卻無法顯示在frame裡,這又該如何解決?
作者: mark15jill    時間: 2016-3-29 15:37

針對這個想請問前輩,我動態產生了一個label但是卻無法顯示在frame裡,這又該如何解決?
modelcrazyer 發表於 2016-3-27 21:03



    請提供該問題區域的原始碼 以便協助
作者: modelcrazyer    時間: 2016-3-30 21:23

謝謝!!我已經解決了!!




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