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...