VBA代碼是隨文件一起保存的,個人一直以來,使用都是在某一個文件里來編輯代碼。
隨著VBA使用的增多,必然會積累一些常用的代碼,甚至在網上也會找到一些功能強大的類。每次使用也都是復制到某個文件里使用,這些代碼在自己電腦里就存在許多個副本。使用過程中難免會發(fā)現(xiàn)一些問題,對代碼進行一些小的修改,一些類也可能增加一些實用的方法、函數(shù)。但是修改了其中一個副本,電腦里其他使用了的文件沒法一同更改。久而久之,各個副本中就會存在不同時間里修改過的代碼,想把他們放一起會發(fā)現(xiàn)變得非常困難。
自己有時候就希望如果VBA能像C語言那樣有#include <xx>*這種方式就好了,所有程序都引用的是同一個文件里的代碼,只需修改一處即可。
后來發(fā)現(xiàn)其實利用工具-引用?VBAProject也能達到類似效果,缺點是想把做好的程序文件發(fā)給別人時不大方便。使用方法比較簡單:
1 創(chuàng)建1個加載宏,修改VBAProject屬性里的工程名稱,以保證是唯一的,如vbapTest。使用加載宏的目的只是為了不在前臺顯示出文件。
2 將一些常用的代碼保存在這個加載宏中,需要對外公開的用Public修飾,也可以省略修飾。
3 在需要使用這些代碼的文件里,添加工具-引用,瀏覽找到加載宏,注意選擇文件類型(默認是olb,tlb,dll,這樣看不到xla和xlam,選所有文件或者Mircosoft Excel Files)。
4 這樣只要在需要使用代碼的地方,加上vbapTest.就可以調用函數(shù)或者方法了。
類的使用
用上述方法在碰到類的時候,會發(fā)現(xiàn)根本無法定義、創(chuàng)建類,類的使用方法需要再做1點工作,有3種方法:
1. 用自定義數(shù)據(jù)類型封裝一下?在vbapTest里增加1個自定義的類型和一個函數(shù):
Type Test
c As CTest
End Type
Function NewCTest() As CTest
Set NewCTest = New CTest
End Function
在使用代碼的文件聲明變量a為vbapTest.Test,并創(chuàng)建類
set a.c = vbapTest.NewCTest()
然后就可以像使用同1個文件的類一樣使用了。
2. 設置類屬性Instancing
類模塊有1個叫做Instancing的屬性,默認是1-Private,還有1個是2-PublicNotCreatable(字面理解:公開但是不能被創(chuàng)建),設置為2后,在其他文件中可以聲明,但不能創(chuàng)建,使用方法:
dim a as vbapTest.CTest
set a = vbapTest.NewCTest()
3. 強制設置類屬性Instancing為5-MultiUse:
ThisWorkbook.VBProject.VBComponents("CTest").Properties("Instancing") = 5
這種方法設置過后,其他文件就完全像是使用同1個文件的類了。
Dim c As vbapSpace.CTest
Set c = New vbapSpace.CTest
這是在網上看到的,至于為什么故意不公開這個屬性5,是不是會出現(xiàn)什么問題,目前不知道。
歡迎添加我的公眾號xyjvba,一起學習。