NO.1
使用VBA代碼添加Form窗體表單,對於一些初學者來說,似乎真的很為難。
除了對代碼陌生之外,並不知道如何來進行操作添加後的窗體。
這也是一件十分困擾的事情。
本節將介紹一下,使用vba代碼添加窗體,然後在窗體上添加控制項,如標籤按鈕等等方法。
NO.2
vba中 VBComponents集合裡包含了模塊、窗體、類模塊。
添加窗體就用到VBComponents.Add()來進行操作。
如:
ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
表示添加一個窗體。
其中vbext_ct_MSForm參數,表示將窗體添加到集合。
類模塊vbext_ct_ClassModule標準模塊vbext_ct_StdModule。
新建表單後,運行程序什麼也看不到,還需要對表單進行屬性設置。
這就是像是蓋一棟大樓,只是做了大樓的一個工程設計,僅僅是立項要蓋這棟大樓,而沒有真正實施蓋樓的過程。
所以,名義上的新建了這棟樓,但其並沒有變成實際意義上的大樓。
感覺有點不可接受,不管怎麼說,以上代碼並不能讓你看到新建的窗體。
接下來,要對窗體進行一些屬性設置,就是說要真正的施工對進入工地蓋樓了。
設置窗體屬性,要用到Properties()。中文意思就是不動產、財產、所有物等等。
Properties()括號裡添加窗體屬性名稱,然後等於號,屬性值。
這樣才能夠對新建的Form窗體進行實體化賦值。
如下代碼:
.Properties("caption") ="我是新建窗體"'窗體標籤.Properties("width") = 900'寬.Properties("Height") = 600'高
更多窗體屬性可查詢幫助。
上圖為例,將對表格內容作為新建表單的標題名稱、寬、高,包括窗體裡的標籤名稱和按鈕進行自定義設置。
NO.3
添加窗體之後不是我們的初衷,因為窗體只是一個容器,我們要往裡面放很多東西。
這就像大樓主體已經完工,但是不能住人呀,四面沒有窗戶,也沒有各類消防設施,更沒有電梯,那麼,這就是說,並沒有完全得到我們想要的大樓樣子。
還要對大樓進行配套設施的安裝。
添加標籤
那我們再加一個標籤吧,就像在大樓頂上安裝一個XXX小區的名稱,是不是有點意思了。
添加標籤代碼:
With ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm).Designer.Controls.Add("Forms.Label.1")End With
由於新建的窗體還處在編輯模式下,所以不能直接引用Controls.Add(),要在其前面加Designer。
Designer中文意思就"設計師"。看到了吧,整個過程當中,不能以一種既定的事實來對待這件事情。
就像不能對一棟在建的大樓以成熟小區來對待一樣,不能隨意進出,也不能以為它是一個有人住的地方,真正意義上它還是不算是一個小區。
只有交付使用之後,才能作為一個正常的對象來對待。
所以,要特別注意的地方在對表單裡的對象進行屬性設置的時候,前面添加"設計師"Designer。
示例:
默認F為新建的窗體對象。
Dim Lobj As ObjectSet Lobj = F.Designer.Controls.Add("Forms.Label.1")With Lobj.Caption = "恭喜!你已經成功新建了一個表單窗體。".Top = 50.Left = 0.Height = 90.Width = .Parent.Width.TextAlign = 2With .Font.Size = 28.Name = "黑體".Bold = TrueEnd WithEnd With添加按鈕同理,添加按鈕用如下代碼:With ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm).Designer.Controls.Add("Forms.CommandButton.1")End With
NO.4
顯示窗體
如此進行,對代碼細緻的編寫之後,構造整個表單的過程就完成了。
但是,我們還是不能看到它的模樣,因為沒有把它呈現在眼前。
就比如,在北京蓋了一棟大樓,而你在廣州。
想要看到這樓,是不是有兩個辦法,一你親自來北京,站到大樓下面,二給大樓拍個視頻,通過視頻信息傳輸設備觀看。
這就是說,這樓是蓋好了,在你看到它之前,還有一些方法去完成,不然,真的難說這樓是個什麼樣子。
說了這麼多,編程就是這麼玄乎,真真假假,假假真真,要抓到代碼表示的實際東西,還真不是一件輕鬆的事情。
我們接著就是要把窗體呈現在電腦屏幕上,讓自己或別人看到它,而不只是某種意義上的代碼構造完成這種玄乎的事情。
顯示出來也需要一行代碼,也十分簡單一行代碼,如下:
F默認新建的窗體對象
VBA.UserForms.Add(F.Name).Show
運行後效果如下圖
是不是完整了一些,如不添加標籤和按鈕,那麼什麼也沒有。
這樣新建後的表單就有了更多的內容。
NO.5
刪除窗體
最後一步刪除窗體,這個不提倡使用,但要學會使用。
F為默認新建窗體對象變量。
ThisWorkbook.VBProject.VBComponents.Remove F
這句意思是從VBComponents集合中移除F窗體。
這個不能用大樓來比喻,沒有移除大樓的過程,而且操作起來也太困難,也現實中最大把設計圖紙銷毀,完成移除。
NO.6
完整代碼
以上代碼可作為學習之用,以下偌直接複製到自己的VBE窗體中使用即可。
新建窗體過程函數
Private Sub AddNewForm()Dim w As WorksheetSet w = ActiveSheetDim F As ObjectSet F = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)With F.Properties("caption") ="我新建的表單窗體".Properties("width") =900.Properties("Height") = 600Dim Lobj As ObjectSet Lobj = F.Designer.Controls.Add("Forms.Label.1")With Lobj.Caption = "恭喜!" & VBA.vbCrLf & VBA.vbCrLf & "你已經成功新建了一個表單窗體。".Top = 50.Left = 0.Height = 90.Width = .Parent.Width.TextAlign = 2With .Font.Size = 28.Name = "黑體".Bold = TrueEnd WithEnd WithWith F.Designer.Controls.Add("Forms.CommandButton.1").Caption = "關 閉".Width = 150.Height = 28.Top = Lobj.Top + Lobj.Height + 50.Left = .Parent.Width \ 2 - .Width \ 2End With''''''''''''''''''''''''''''''''''''''''''' Button按鈕 CodeModuleWith ThisWorkbook.VBProject.VBComponents(F.Name).CodeModule.InsertLines 2, "Private Sub CommandButton1_Click()".InsertLines 3, "Unload me".InsertLines 4, "End Sub"End WithEnd WithVBA.UserForms.Add(F.Name).ShowThisWorkbook.VBProject.VBComponents.Remove FEnd Sub
NO.7
學習VBA,從0開始構造一個應用界面,十分不好掌握其中一些代碼應用。
有些代碼在編輯過程中會遇到很多問題,同時也會增加許多不明白的問題,需要一一解決。
本身VBA已經給出很多常用的一些對象,直接拿來使用就可以,但是對於喜歡結構編程方法的人來說,面向對象真的是小兒科。
怎麼辦呢,呵呵!努力吧!
---END---
歡迎關注、收藏