vba 定义类_VBA|工程中的四类模块的具体含义与比较
新建一個工作簿后的VBE的工程資源管理器:
可以看到默認(rèn)的3個工作表對應(yīng)的模塊和工作簿模塊ThisWorkbook。
選擇sheet1,點擊“對象”列表下拉框:
可以看到一個可供選擇的Worksheet對象。
選擇該對象,將自動建立事件代碼框架,在右邊的“事件”列表中有與對象相關(guān)的事件可供選擇:
工作簿對象也中如此:
在“插入”菜單可以插入三類模塊:用戶窗體、模塊、類模塊。
用戶窗體是與用戶交互的圖形界面,窗體本身和插入的控件都是一個對象:
類模塊用于用戶自定義類和對象:
當(dāng)我們錄制一個宏時,會自動在工程資源管理器中插入一個模塊,默認(rèn)的名稱是“模塊1“,這是一種標(biāo)準(zhǔn)模塊,不與具體的工作表、工作簿、窗體相關(guān)聯(lián):
這就是VBA中的四類模塊:“標(biāo)準(zhǔn)模塊”、Microsoft Excel工作簿和工作表對象、窗體、類模塊。
模塊就是一組聲明和過程。
聲明:不可執(zhí)行的代碼,它命名一常數(shù)、變量或過程,并且指定其特性,比如數(shù)據(jù)類型。對于DLLprocedures,聲明指定名稱、庫和參數(shù)。
過程:命名的語句序列,可作為單元來執(zhí)行。例如,Function、Property和Sub都是過程類型。總是在模塊級別定義過程的名稱,所有可執(zhí)行的代碼必須包含在過程內(nèi),一過程不能套在其它過程中。
我們平常寫的代碼是什么東西,對,就是聲明和過程,也就是在Sheet1、Sheet2、Sheet3、ThisWorkbook、UserForm1、模塊1、類1這些東西里面編寫的代碼,所以我們可以得出結(jié)論,Sheet1、Sheet2、Sheet3、ThisWorkbook、UserForm1、模塊1、類1都是模塊。
這些雖然都叫做模塊,但是卻有所不同,其實微軟是這樣分類的:
文檔模塊:Sheet1,Sheet2,Sheet3,ThisWorkbook;
窗體模塊:UserForm1;
標(biāo)準(zhǔn)模塊:模塊1;
類模塊:類1;
有人可能會問,sheet1、sheet2這些本身就是微軟為我們提供的內(nèi)置對象,怎么能說是模塊呢?誠然,在我們編寫代碼的過程中,它們確實是不同的對象。但是,由于微軟單獨把這些東西提取了出來,允許我們編寫代碼與這些對象進(jìn)行關(guān)聯(lián),所以他們就具有了不同的意義,可以看作是微軟自定義并已經(jīng)嵌入的模塊。由于我們能在他們內(nèi)部編寫并儲存代碼,所以,在這里,你就不要像看待range、cell等對象那樣看待他們,而是要做為模塊來看待他們。(這種思路的轉(zhuǎn)變很重要,他們在這里我們是當(dāng)作模塊看待,而不是我們常用的對象)。
其實,作為VBA語言,來源于VB,所以他繼承了VB語言的大部分功能,只不過微軟單獨為VBA提供了Excel對象(或者Word對象、PPT對象等等)。因為在VB中本身就提供了三種類型的模塊:窗體模塊、標(biāo)準(zhǔn)模塊和類模塊。所以VBA中就有了這三種模塊。為了能夠?qū)xcel對象進(jìn)行操作,微軟又為我們提供了文檔模塊,而且是直接嵌入進(jìn)來的(Sheet1、Sheet2、ThisWorkbook這些文檔模塊不需要我們插入,只要存在這個對象,就有這個文檔模塊)。所以,也就解釋了,VBA為什么會有這四種模塊。
我們通過上面的分析了解到了VBA的模塊分為這四種,從什么地方可以看出微軟是這樣分類的呢,他們到底是不是對象(請一定和Excel模型中的Sheet1、Sheet2對象的概念分開,記住,在這里,他們已經(jīng)是模塊啦),他們到底是什么對象呢?
從VBE資源管理器我們看出Microsoft Excel對象(文檔模塊)、窗體(窗體模塊)、模塊(標(biāo)準(zhǔn)模塊)、類模塊這些模塊都在什么下邊呢,對,都在在VBA Project的下面:
VBA Project是什么呢,就是我們平常說得工程,實際上他是VBA Project對象,他下面的這些Microsoft Excel對象(文檔模塊)、窗體(窗體模塊)、模塊(標(biāo)準(zhǔn)模塊)、類模塊也都是對象,是什么對象呢,VB Component對象。現(xiàn)在可以告訴你,這些模塊就是對象,是叫做VB Component的對象。
為了說明這個問題,需要引入一個概念,VBA擴(kuò)展模型(VBA Extensibility Model),他具有對VBA工程和模塊進(jìn)行操作的功能:
(1)用代碼添加和刪除VBA模塊(而不是手動插入和刪除);
(2)用代碼去創(chuàng)建代碼(說起來有點繞,應(yīng)該是用代碼建立個模塊,然后用代碼在模塊里面寫代碼);
(3)創(chuàng)建用戶窗體;
VBA擴(kuò)展模型的簡單層次結(jié)構(gòu)是這樣(只為說明問題,沒有全部列出來):
VBE
VB Project
VB Component
Code Module
Designer
Property
Reference
Window
CommandBar
其實VB Project對象就是我們在工程資源管理器經(jīng)常看到的,下面的Sheet1、Sheet2、Sheet3、ThisWorkbook、UserForm1、模塊1、類1就是VB Component對象。在這里我們得出了一個結(jié)論:文檔模塊、標(biāo)準(zhǔn)模塊、類模塊、窗體模塊是對象,一種叫做VB Component的對象
VBComponent對象有個type屬性,清楚的告訴了我們Sheet1、Sheet2、Sheet3、ThisWorkbook、UserForm1、模塊1、類1分別屬于什么模塊,也就是上面所說的,微軟是怎么對這些模塊進(jìn)行分類的呢,也就是type屬性來告訴了我們這個問題。
我們用以下代碼來展示這些模塊都屬于哪些類型。
Sub test()Dim VBComps As VBComponents ‘定義VBComponents類的對象變量Dim VBComp As VBComponent ‘定義VBComponent類的對象變量‘這里我們借用了Thisworkbook這個對象來說明Set VBComps = ThisWorkbook.VBProject.VBComponents ‘將對象的引用賦值給對象變量‘利用循環(huán)來獲取工程內(nèi)每個組件的名稱和類型For Each VBComp In VBCompsMsgBox "組件名稱:" & VBComp.name & " 組件常量" & VBComp.TypeNextEnd Sub通過代碼的運行,我們發(fā)現(xiàn)Sheet1、Sheet2、Sheet3、Thisworkbook是一種類型,部件常數(shù)的值是100。
模塊1是一種類型,部件常數(shù)的值是1;
類1是一種類型,部件常數(shù)的值是2;
UserForm1是一種類型,部件常數(shù)的值是3;
通過上面的敘述,總結(jié)起來只是一句話:
文檔模塊、標(biāo)準(zhǔn)模塊、類模塊、窗體模塊是對象,并且都是一個叫做VBComponent的對象,根據(jù)VBComponent屬性"type"(類型)的不同,微軟把他們分為了4類:Vbext_ct_StdModule、Vbext_ct_ClassModule、Vbext_ct_MSForm、Vbext_ct_Document。
VB的代碼存儲在模塊中。在VB中提供了三種類型的模塊:窗體模塊、標(biāo)準(zhǔn)模塊和類模塊。
簡單的應(yīng)用程序可以只有一個窗體,所用的程序都駐留在窗體模塊中,而當(dāng)應(yīng)用程序龐大復(fù)雜時,就要另外附加窗體。最終可能有幾個窗體中有一些共同都要執(zhí)行的代碼,為了在兩個窗體中不產(chǎn)生重復(fù)代碼,可創(chuàng)建一個獨立的模塊,用它實現(xiàn)代碼公用。該獨立模塊即是標(biāo)準(zhǔn)模塊。此外還可以建立包含共享代碼與數(shù)據(jù)的類模塊。
1 窗體模塊
由于VB是面向?qū)ο蟮膽?yīng)用程序開發(fā)工具,所以應(yīng)用程序的代碼結(jié)構(gòu)就是該程序在屏幕上表示的對應(yīng)模型。根據(jù)定義,對象包含數(shù)據(jù)和代碼。應(yīng)用程序中的每個窗體都有一個相對應(yīng)的窗體模塊(文件擴(kuò)展名為.frm)
窗體模塊是VB應(yīng)用程序的基礎(chǔ)。窗體模塊可以包含處理事件的過程、通用過程以及變量、常數(shù)、自定義類型和外部過程的窗體級聲明。寫入窗體模塊的代碼是該窗體所屬的具體應(yīng)用程序?qū)S玫?#xff1b;也可以引用該程序內(nèi)的其它窗體和對象
每個窗體模塊都包含事件過程,在事件過程中有為響應(yīng)該事件而執(zhí)行的程序段。窗體可包含控件。在窗體模塊中,對窗體上的每個控件都有一個對應(yīng)的事件過程集。除了事件過程,窗體模塊還可包含通用過程,它對來自該窗體中任何事件過程的調(diào)用都作出響應(yīng)。
2 標(biāo)準(zhǔn)模塊
標(biāo)準(zhǔn)模塊是程序中的一個獨立容器,包含全局變量、Function(函數(shù))過程和Sub過程(子過程)。
可將那些與特定窗體或控件無關(guān)的代碼放入標(biāo)準(zhǔn)模塊中。標(biāo)準(zhǔn)模塊中包含應(yīng)用程序內(nèi)的允許其它模塊訪問的過程和聲明。它們可以包含變量、常數(shù)、類型、外部過程和全局聲明或模塊級聲明。
3 類模塊
在VB中類模塊是面向?qū)ο缶幊痰幕A(chǔ)。可以在類模塊中編寫代碼建立新對象。這些新對象可以包含自定義的屬性和方法。實際上,窗體正是這樣一種類模塊,在其上可安放控件,可顯示窗體窗口。
用類模塊創(chuàng)建對象,這些對象可被應(yīng)用程序內(nèi)的過程調(diào)用。標(biāo)準(zhǔn)模塊只包含代碼,而類模塊包含代碼又包含數(shù)據(jù),可視為沒有物理表示的控件。
4 標(biāo)準(zhǔn)模塊和對象模塊的區(qū)別
文檔模塊、窗體模塊是屬于對象模塊的,可以作為一類,標(biāo)準(zhǔn)模塊則是不同的,屬于另外一類。
4.1 標(biāo)準(zhǔn)模塊是不支持事件,對象模塊都支持事件過程。
標(biāo)準(zhǔn)模塊本身是沒有事件過程的,這也就是說,你想寫事件過程,絕對不要寫到標(biāo)準(zhǔn)模塊中去,當(dāng)然你也寫不進(jìn)去。
4.2 標(biāo)準(zhǔn)模塊是一個獨立容器,標(biāo)準(zhǔn)模塊中的全局變量、Function(函數(shù))過程和Sub過程(子過程)是不與對象模塊相關(guān)聯(lián)的。
同一個工程中的對象模塊可以共享和使用標(biāo)準(zhǔn)模塊中的全局變量和過程。但是對象模塊的變量和過程,卻是該對象模塊專屬的。如果想調(diào)用的話,必須以對象的方式訪問。
這也就告訴我們一個原則。通常我們在寫VBA代碼的時候,應(yīng)該把公用的變量和過程寫到標(biāo)準(zhǔn)模塊中來,和對象模塊相關(guān)的變量和過程寫到相應(yīng)的對象模塊中去,這樣才不容易出現(xiàn)問題。
-End-
總結(jié)
以上是生活随笔為你收集整理的vba 定义类_VBA|工程中的四类模块的具体含义与比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 变频器常见的十大故障现象和故障分析
- 下一篇: pusher 创建新应用_3.5 使用P