小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

vb中類模塊的說(shuō)明

 nxhujiee 2019-01-23
vb中類模塊的說(shuō)明
━━━━━━━━━━━━━━━━━━━━━━━━━

  這里簡(jiǎn)單地介紹VBA中的類模塊,使大家能夠在應(yīng)用程序中創(chuàng)建并使用簡(jiǎn)單的類。
  類是對(duì)象的“模板”。對(duì)象可以是任何事物,而類不會(huì)做任何事情,也不會(huì)占用內(nèi)存,只有當(dāng)類成為對(duì)象并使用Set語(yǔ)句和New關(guān)鍵字實(shí)例化為具體對(duì)象后,才能做事情并占用內(nèi)存。實(shí)例化類為具體對(duì)象的語(yǔ)法為:
Dim As Class1
Set C = New Class1
上述語(yǔ)句創(chuàng)建了一個(gè)名為C的對(duì)象,該對(duì)象的數(shù)據(jù)類型為定義的類Class1。

  在詳細(xì)介紹類之前,讓我們先看看VBA的用戶自定義數(shù)據(jù)類型,即使用Type關(guān)鍵字定義的變量。例如,下面的Type變量定義了雇員的信息:
Type Employee
    Name As String
    
Address As String
    
Salary As Double
End Type

  上面的語(yǔ)句定義了變量Employee,包含元素Name、Address和Salary。接著,您可以聲明一個(gè)Employee型的變量,并為其中的每個(gè)元素賦值:
Sub test()
    
Dim Fan As Employee
    Fan.Name “fanjy”
    Fan.Address “YiChang”
    Fan.Salary 1000
End Sub

  用戶自定義類型是很有用的,但是有三個(gè)主要的局限:
  1、在編譯時(shí)必須聲明所有的自定義類型變量。雖然可以使用動(dòng)態(tài)數(shù)組來(lái)處理多個(gè)自定義類型,但必須使用Redim Preserve關(guān)鍵詞。并且,不能在運(yùn)行時(shí)添加新的自定義類型變量。
  2、不能控制賦給自定義類型中元素的值。例如,在上述代碼中,有可能給Salary元素賦一個(gè)負(fù)值。
  3、自定義類型不做任何事情,只是靜態(tài)地存儲(chǔ)數(shù)據(jù)。

  用戶自定義類型被廣泛用于在對(duì)Windows API函數(shù)調(diào)用時(shí),除此之外,使用類模塊是更好的選擇。類克服了用戶自定義類型的局限。

  1、使用New關(guān)鍵字,可以創(chuàng)建任意數(shù)量的類的新實(shí)例,并且能夠?qū)⑵浯鎯?chǔ)在Collection對(duì)象中。
  2、使用Property Let / Set / Get語(yǔ)句,可以編寫代碼驗(yàn)證賦給類元素的值,并且可以編寫當(dāng)值改變時(shí)執(zhí)行的相應(yīng)代碼。例如,能夠編寫代碼確保Salary的值不為負(fù)值。
  3、類可以定義方法(使用Sub過(guò)程和Function過(guò)程),執(zhí)行某項(xiàng)動(dòng)作。

━━━━━━━━━━━━━━━━━━━━━━━━━
  下面,讓我們將自定義類型Employee轉(zhuǎn)換為類。首先,在VBE編輯器中插入一個(gè)類模塊,并將其重命名為CEmployee,如圖1所示。(類模塊由屬性和方法組成,類本身類似于名詞;屬性可以當(dāng)作形容詞,用來(lái)描述類;方法則為動(dòng)詞,執(zhí)行操作。)
CEmployee類應(yīng)該有三個(gè)屬性:Name、Address和Salary。在類模塊的聲明部分聲明三個(gè)Private變量來(lái)存儲(chǔ)這些值,屬性的實(shí)際值被存儲(chǔ)在這三個(gè)私有變量中。
Private pName As String
Private 
pAddress As String
Private 
pSalary As Double

因?yàn)檫@些變量都被聲明為私有的,因此僅能在類內(nèi)部訪問(wèn),在類的外部是不可見的。如何為這些變量賦值呢?這就是Property Let語(yǔ)句要做的工作。每個(gè)私有變量都有相應(yīng)的Property Let語(yǔ)句。
Property Let Name(As String)
    
pName S
End Property

Property Let 
Address(As String)
    
pAddress S
End Property

Property Let 
Salary(As Double)
    
pSalary D
End Property

Property 
Let語(yǔ)句用于給屬性賦值,即將值引入類。在上例中,簡(jiǎn)單地將引入的值賦給私有變量。由于Property Let語(yǔ)句中能夠包含代碼,因此能夠編寫用于數(shù)據(jù)驗(yàn)證的代碼。例如,改寫Property Let Salary函數(shù)中的代碼,使之不允許接受負(fù)值:
Property Let Salary(As Double)
If Then
    
pSalary D
Else
    
‘錯(cuò)誤提示
    MsgBox “薪水怎能為負(fù)呢?”
End If
End Property

與Property Let函數(shù)相對(duì)應(yīng)的是Property Get函數(shù),用于從類中獲取屬性的值。在CEmployee類中,相應(yīng)的Property Get語(yǔ)句為:

Property Get Name() As String
    
Name pName
End Property

Property Get 
Address() As String
    
Address pAddress
End Property

Property Get 
Salary() As Double
    
Salary pSalary
End Property

Let語(yǔ)句和Get語(yǔ)句的數(shù)據(jù)類型必須相匹配。例如,Let Salary接受Double類型的值作為其參數(shù),這意味著其返回的相應(yīng)的Get屬性的值必須是Double。如果數(shù)據(jù)類型不一致,就會(huì)導(dǎo)致編譯錯(cuò)誤。
這些Get語(yǔ)句簡(jiǎn)單地將三個(gè)屬性向外公開。要?jiǎng)?chuàng)建只讀屬性,則忽略Property Let語(yǔ)句而僅使用Property Get語(yǔ)句。例如,WithholdingTax屬性是只讀的,在Get語(yǔ)句中的代碼計(jì)算合適的值并將其公開,但避免從外部改變?cè)搶傩缘闹担?
Property Get WithholdingTax() As Double
    
WithholdingTax some_tax_calculation
End Property
該屬性沒有對(duì)應(yīng)的Let語(yǔ)句,因此該屬性只讀,沒有辦法將值賦給WithholdingTax。
類模塊能夠包含方法,例如CEmployee類有一個(gè)用于雇員復(fù)核薪水的方法:
Public Sub PrintPaycheck()
‘放置打印復(fù)核的實(shí)際代碼
End Sub
好了,我們已經(jīng)完成了CEmployee類的初步定義,如圖1所示。

━━━━━━━━━━━━━━━━━━━━━━━━━
下面,在標(biāo)準(zhǔn)模塊的代碼中實(shí)例化類,并使用其屬性和方法。
首先,在VBE編輯器中插入一個(gè)模塊,聲明一個(gè)CEmployee類型的變量。(注意,在復(fù)雜的應(yīng)用程序中,在類模塊中聲明并實(shí)例化另一個(gè)類是完全合法的)
Dim Emp As CEmployee
接下來(lái),實(shí)例化該類,創(chuàng)建一個(gè)可用來(lái)工作的實(shí)際對(duì)象,如下列語(yǔ)句:
Set Emp New CEmployee
上述語(yǔ)句創(chuàng)建了一個(gè)名為Emp的對(duì)象,能夠使用CEmployee類中的屬性來(lái)引用特定的雇員信息,例如:
Emp.Name “fanjy”
Emp.Address “YiChang”
Emp.Salary 1000
這三個(gè)語(yǔ)句調(diào)用在CEmployee類中聲明的Property Let語(yǔ)句來(lái)賦值給類中的私有變量。我們能夠使用下列代碼讀取對(duì)象的屬性的值:
Debug.Print Emp.Name
Debug.Print Emp.Address
Debug.Print Emp.Salary
上述語(yǔ)句調(diào)用類模塊中的Property Get語(yǔ)句并獲取數(shù)據(jù)。我們也能讀取類中的只讀屬性WithholdingTax:
Debug.Print Emp.WithholdingTax
由于WithholdingTax屬性沒有相應(yīng)的Let語(yǔ)句,因此不能給該屬性賦值。如果試圖賦值:
Emp.WithholdingTax 4000
則會(huì)導(dǎo)致:“編譯錯(cuò)誤:不能給只讀屬性賦值”。
也能夠調(diào)用方法來(lái)執(zhí)行操作:
Emp.PrintPaycheck

━━━━━━━━━━━━━━━━━━━━━━━━━
在集合中存儲(chǔ)類的多個(gè)實(shí)例
  如果到運(yùn)行時(shí)還不知道有多少個(gè)雇員,那么能夠在運(yùn)行時(shí)按需要?jiǎng)?chuàng)建多個(gè)Emp對(duì)象,每創(chuàng)建一個(gè)Emp對(duì)象之后將其存儲(chǔ)在集合中。例如:
Dim Coll As New Collection
Dim Ndx As Long
Dim Emp As CEmployee

For Ndx To NumberOfEmployees
Set Emp New CEmployee
‘設(shè)置Emp對(duì)象的屬性
Coll.Add Item: = Emp, Key: = Emp.Name
Next Ndx

  上面的For…Next循環(huán)將創(chuàng)建CEmployee類的NumberOfEmployees個(gè)實(shí)例,具體數(shù)量由運(yùn)行時(shí)決定,并將其存儲(chǔ)在名為Coll的集合對(duì)象中。之后,能夠使用For Each循環(huán)從Coll集合中獲取每個(gè)雇員信息或執(zhí)行操作:
For Each Emp In Coll
Emp.PrintPaycheck
Next Emp
━━━━━━━━━━━━━━━━━━━━━━━━━
類的Instancing屬性
━━━━━━━━━━━━━━━━━━━━━━━━━
  類的Instancing屬性決定其可見性(或稱作作用域),默認(rèn)屬性值為1 - Private,意味著類僅能在包含該類的工程中創(chuàng)建和訪問(wèn)。其他工程不能基于該類創(chuàng)建對(duì)象。對(duì)于絕大多數(shù)應(yīng)用程序來(lái)說(shuō),Private是足夠了。
Instancing屬性的另一個(gè)值是2 - PublicNotCreatable,表明其他工程能夠?qū)⒆兞柯暶鳛樵擃悾遣荒苁褂肧et語(yǔ)句創(chuàng)建該類的實(shí)例。

━━━━━━━━━━━━━━━━━━━━━━━━━
在多個(gè)工程間使用類
━━━━━━━━━━━━━━━━━━━━━━━━━
  如果一個(gè)工作簿需要使用定義在另一個(gè)工作簿中的類,則需要在包含類模塊的工作簿中編寫代碼導(dǎo)出類到另一個(gè)工程。該類的Instancing屬性必須是2 - PublicNotCreatable。
  假設(shè)Book1.xls工作簿中包含一個(gè)名為Class1的類模塊,Book2.xls需要使用該類。首先,將Book1工作簿的工程名稱從缺省的 “VBAProject”修改為唯一的名稱,例如MyProject。然后,在VBE編輯器中激活Book2工作簿的界面,設(shè)置對(duì)Book1工作簿的引用,即在VBE中選擇“工具——引用”,然后在列表中選擇“MyProject”。然后,在Book2中,創(chuàng)建如下聲明:
  Public C As MyProject.Class1
  因?yàn)镮nstancing的屬性值為PublicNotCreatable,所以可以聲明一個(gè)Class1類的變量,但不能創(chuàng)建該類的實(shí)例。因此,需要在Book1中編寫一個(gè)函數(shù)來(lái)創(chuàng)建Class1的新實(shí)例,并返回該實(shí)例給Book2。在Book1中,創(chuàng)建下面的過(guò)程:
Public Function GetClass1() As Class1
    Set GetClass1 New Class1
End Function
然后,在Book2中設(shè)置公共變量C為上述函數(shù)的結(jié)果,例如:
Set C = MyProject.GetClass1()
現(xiàn)在,C被設(shè)置為Class1的新實(shí)例。
好了,上面只是對(duì)類模塊的一些初步介紹,還有一些知識(shí)未講述,例如Property Set語(yǔ)句,留待以后在慢慢整理。>

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多