VBA類模組初步

2021-06-01 21:31:48 字數 3644 閱讀 3820

property let address(s as string)

paddress = s

end property

property let salary(d as double)

psalary = d

end property

property let語句用於給屬性賦值,即將值引入類。在上例中,簡單地將引入的值賦給私有變數。由於property let語句中能夠包含**,因此能夠編寫用於資料驗證的**。例如,改寫property let salary函式中的**,使之不允許接受負值:

property let salary(d as double)

if d > 0 then

psalary = d

else

『錯誤提示

msgbox 「薪水怎能為負呢?」

end if

end property

與property let函式相對應的是property get函式,用於從類中獲取屬性的值。在cemployee類中,相應的property get語句為:

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語句和get語句的資料型別必須相匹配。例如,let salary接受double型別的值作為其引數,這意味著其返回的相應的get屬性的值必須是double。如果資料型別不一致,就會導致編譯錯誤。

這些get語句簡單地將三個屬性向外公開。要建立唯讀屬性,則忽略property let語句而僅使用property get語句。例如,withholdingtax屬性是唯讀的,在get語句中的**計算合適的值並將其公開,但避免從外部改變該屬性的值:

property get withholdingtax() as double

withholdingtax = some_tax_calculation

end property

該屬性沒有對應的let語句,因此該屬性唯讀,沒有辦法將值賦給withholdingtax。

類模組能夠包含方法,例如cemployee類有乙個用於雇員複核薪水的方法:

public sub printpaycheck()

『放置列印複核的實際**

end sub

好了,我們已經完成了cemployee類的初步定義,如圖1所示。

圖1:cemployee類

下面,在標準模組的**中例項化類,並使用其屬性和方法。首先,在vbe編輯器中插入乙個模組,宣告乙個cemployee型別的變數。(注意,在複雜的應用程式中,在類模組中宣告並例項化另乙個類是完全合法的)

dim emp as cemployee

接下來,例項化該類,建立乙個可用來工作的實際物件,如下列語句:

set emp = new cemployee

上述語句建立了乙個名為emp的物件,能夠使用cemployee類中的屬性來引用特定的雇員資訊,例如:

emp.name = 「fanjy」

emp.address = 「yichang」

emp.salary = 1000

這三個語句呼叫在cemployee類中宣告的property let語句來賦值給類中的私有變數。我們能夠使用下列**讀取物件的屬性的值:

debug.print emp.name

debug.print emp.address

debug.print emp.salary

上述語句呼叫類模組中的property get語句並獲取資料。我們也能讀取類中的唯讀屬性withholdingtax:

debug.print emp.withholdingtax

由於withholdingtax屬性沒有相應的let語句,因此不能給該屬性賦值。如果試圖賦值:

emp.withholdingtax = 4000

則會導致:「編譯錯誤:不能給唯讀屬性賦值」。

也能夠呼叫方法來執行操作:

emp.printpaycheck

在集合中儲存類的多個例項

如果到執行時還不知道有多少個雇員,那麼能夠在執行時按需要建立多個emp物件,每建立乙個emp物件之後將其儲存在集合中。例如:

dim coll as new collection

dim ndx as long

dim emp as cemployee

for ndx = 1 to numberofemployees

set emp = new cemployee

『設定emp物件的屬性

coll.add item:=emp, key:=emp.name

next ndx

上面的for…next迴圈將建立cemployee類的numberofemployees個例項,具體數量由執行時決定,並將其儲存在名為coll的集合物件中。之後,能夠使用for each迴圈從coll集合中獲取每個雇員資訊或執行操作:

for each emp in coll

emp.printpaycheck

next emp

類的instancing屬性

類的instancing屬性決定其可見性(或稱作作用域),預設屬性值為1-private,意味著類僅能在包含該類的工程中建立和訪問。其他工程不能基於該類建立物件。對於絕大多數應用程式來說,private是足夠了。

instancing屬性的另乙個值是2-publicnotcreatable,表明其他工程能夠將變數宣告為該類,但是不能使用set語句建立該類的例項。

在多個工程間使用類

如果乙個工作簿需要使用定義在另乙個工作簿中的類,則需要在包含類模組的工作簿中編寫**匯出類到另乙個工程。該類的instancing屬性必須是2-publicnotcreatable。

假設book1.xls工作簿中包含乙個名為class1的類模組,book2.xls需要使用該類。首先,將book1工作簿的工程名稱從預設的 「vbaproject」修改為唯一的名稱,例如myproject。然後,在vbe編輯器中啟用book2工作簿的介面,設定對book1工作簿的引用,即在vbe中選擇「工具——引用」,然後在列表中選擇「myproject」。然後,在book2中,建立如下宣告:

public c as myproject.class1

因為instancing的屬性值為publicnotcreatable,所以可以宣告乙個class1類的變數,但不能建立該類的例項。因此,需要在book1中編寫乙個函式來建立class1的新例項,並返回該例項給book2。在book1中,建立下面的過程:

public function getclass1() as class1

set getclass1 = new class1

end function

然後,在book2中設定公共變數c為上述函式的結果,例如:

set c=myproject.getclass1()

現在,c被設定為class1的新例項。

好了,上面只是對類模組的一些初步介紹,還有一些知識未講述,例如property set語句,留待以後在慢慢整理。

VBA標準模組與類模組

大家通過之前的介紹,已知道怎麼將乙個空模組插入vba的工程中。從插入模組中可以看到,模組有有兩種 標準模組與類模組。類模組是含有類定義的特殊模組,包括其屬性和方法的定義。在後面會有介紹與說明。隨著工程越來越委員複雜,我們就有可能會有多個模組。使用多模組的好處就是,它允許將相關的過程聚合在一起,使 的...

VBA 觸 類 旁通 類模組

公有與私有 private sub test privete私有的,這有在這個模組下可以被呼叫,相反為 public公有的 msgbox aaa end sub sub test1 call test end sub 還有乙個小知識點 dim i as integer 將i 定義在外面,那麼所有的過...

VBA類模組 建立Table類(1)

vba開發接觸了兩個月,自認為拜託了新手期,遇到很多問題,也有一些心得。根據開發中遇到的問題開始陸續總結。開發過程中,遇到程式執行過程中的儲存大量臨時資料問題,這些資料只是用於下一步的計算,不需要呈現在最後的結果中。為了後面步驟使用和管理方便,建立了table類模組。類模組 ctable 1 opt...