我學習的教程幾乎都是講解語法在前,羅列對象在后,給一堆例子在最后。我在學習的過程中,這些很重要,但不是最重要的,我覺得最重要的事是要教會我怎么解決實際的問題。所以我總結(jié)的時候,單獨拿出開發(fā)模式這一塊,我決定要重點強調(diào)實際應用的作用??v觀我所學的C/C++/C#,VB語言,我覺得學會簡單的語法并不難,難的是應用所學去解決實際的問題。我解決問題的一般步驟是:分析問題規(guī)模,采用合適的算法,引用恰當?shù)念悗?,然后是使用語法去表述并解決問題。
VBA的開發(fā)模式其實也是解決問題的一般步驟。典型的VBA開發(fā)步驟是這樣的,先錄制符合條件的宏,然后修改宏,去掉冗余的步驟,調(diào)整代碼,最后是部署宏。實際上這個開發(fā)的過程在VBA中是通吃一切的"萬金油",學習走的是這個過程,開發(fā)走的還是這個過程。哪怕是啥都不懂的人,只想重復完成一些單調(diào)的任務,也是輕車熟路的完成這個自動化的過程。
以下的操作過程是在Excel2010中完成的,其它的版本基本都差不多。
1. 錄制宏
錄制宏很簡單,操作步驟如下:
在"View" Ribbon菜單下,點擊"Macros" Tab下的"Record Macro..."按鈕。如下圖:
在彈出的宏設置框中,設置宏的名字,快捷鍵,保存位置,說明信息,然后點擊"OK"按鈕開始錄制。如下圖:
做你想做的事。
錄制宏的時候,"Record Macro..."按鈕會變成"Stop Recording..."按鈕,點擊它停止錄制。如下圖:
說明:宏的保存位置有3種:如果保存宏到當前文檔中,那么這個宏只能在當前文檔中使用;如果保存到新文檔中,這個意思很直接;最后一個是保存到個人宏工作簿中,這個說明這個宏可以被所有的文檔使用。個人宏工作簿是一個隱藏的工作簿,如果本機沒有的話,Excel會自動創(chuàng)建的。打開Excel文檔后,Excel也會打開這個個人宏工作簿,你可以選擇顯示/隱藏這個工作簿。
2. 修改宏
打開宏列表(快捷鍵"Alt+F8"),可以看到所有打開Excel文檔中的宏。如下圖:
選擇宏,然后點擊"Edit"就可以打開VB編輯器,編輯宏。在這個窗口中也可以刪除錄制的宏。
3. 運行/部署宏
錄好宏以后,我們可以通過以下幾種方式運行這個宏:
在宏列表窗口中,選中宏,點擊“Run”運行宏;這種方式很然很不方便,很少人會用。
如果設置了宏快捷鍵的,在任意時候,按快捷鍵運行宏;這種方式比較方便,但是快捷鍵還是很難記的。
在Sheet中拖入一個Button控件(其它控件也是可以的,自己可以多嘗試),當讓你選擇宏的時候,你把宏分配給它即可。然后鼠標點擊別的地方,等控件脫離編輯狀態(tài)后,點擊就生效。當然不選也是可以的,后期可以鼠標右擊控件,然后選擇"Assign Macro..."分配宏。這種最常用,也是開發(fā)中主流的使用方式。
自定義Ribbon菜單,把宏加到菜單中(也可以加到快捷菜單中,老版本中也可以加到Toolbar中)。這種方式也比較常見,就是設置有時候麻煩。需要右擊Ribbon菜單的空白部分,選擇自定義Ribbon菜單等選項,然后選擇宏,最后加到相應的位置就可以了。
其實,宏的保存位置和運行方式就決定了宏的部署情況,這個針對不同的用戶,這個選擇是不一樣的。
下面我也簡單總結(jié)一下VBA主要的開發(fā)工具與常用的類型。
a. VB編輯器
在宏列表窗口中,點擊"Edit..."就可以進入宏的編輯器:VB Editor;也可以直接按快捷鍵Alt+F11打開VB編輯器。如下圖所示:
這個編輯器與大多數(shù)的IDE基本都是一樣的,都包含菜單,代碼編輯區(qū),工程文檔視圖,屬性窗口等等,這里就不詳述了,試試就知道了。
b. Form控件與ActiveX控件
這兩個是有區(qū)別的,F(xiàn)orm控件可以直接拖到Sheet中使用,而ActiveX控件是不可以直接在Sheet中使用的,它是放到User Form中使用的。Form控件的使用也比較簡單,通常就是分配宏,或者點擊右鍵菜單(基本上要拖動,或者設置Form控件的屬性,都是要在空間上單擊右鍵,讓控件進入開發(fā)狀態(tài);設置好以后鼠標打擊其它的單元格,就可以讓Form控件進入使用狀態(tài))中的“Format Control...”做一些簡單的設置。而ActiveX控件是開發(fā)中用的比較多的,配合User Form,可以提供相當專業(yè)的窗體應用程序體驗。
c. User Form
為什么要使用User Form呢?對于很多的用戶而言,直接在Excel中錄入程序用到得數(shù)據(jù),或者直接通過簡單的InputBox,或者MsgBox是不夠的,有時候以窗口的形式呈現(xiàn)這些項會更方便。使用User Form也比較簡單,基本與別的IDE是一樣的,拖放控件上去,設置相關(guān)屬性,編寫相關(guān)的事件,就OK了。
這里有個小技巧:在往User Form上畫控件的時候,如果雙擊某個Toolbox上的控件,那么這個控件就會一直被選中,如果是重復畫同一個類型的控件,這樣比較方便。畫完后,單擊Toolbox上的控件,就會取消選中。
對于User Form:
最重要的幾個屬性是:Name(設置名稱), Caption(設置標題)。
最重要的幾個操作是:Show(顯示窗體,窗體的方法,一般在需要使用窗體的時候調(diào)用), Unload Me (關(guān)掉本窗體,一般在窗體的事件里用于關(guān)掉自己)。
最重要的幾個事件:Activate(用于初始化窗體),QueryClose(窗體關(guān)閉時觸發(fā),取消窗體關(guān)閉的最后機會,一般可用于判斷窗體的關(guān)閉條件是否成立)。
對于ActiveX控件:
最重要的幾個屬性是:Name(名稱), Caption(標題), Accelerator(快捷鍵), TabIndex(Tab順序), Enabled(是否啟用)。還有每個控件獨有的一些屬性。
事件基本都差不多重要,需要使用哪個就用哪個
d. Module 與 Class Module
簡答的說,Module就是放代碼的地方,并沒有什么特殊的意義,放在其中的成員和方法,Private的只有本Module中的方法可訪問,Public的則程序中所有的Module都可以訪問,而且訪問的都是同一個值,修改以后,其他人得到的就是修改后的值。
而Class Module就是面向?qū)ο笾袑ο蟮母拍盍?,它封裝了成員和方法,可以New不同的實例(實例聲明的類型是Object),實例有各自單獨的成員區(qū)間,每個實例之間互不干擾。調(diào)用類的屬性和方法的時候,都要通過實例去調(diào)用。
所以簡單的操作直接用Module就可以了,而復雜,重用度高的就可以封裝成對象,以便多次重復使用。
e. 調(diào)試與運行程序
F5直接運行當前鼠標所在的方法/窗口。F8, Shift+F8, Ctrl+F8單調(diào)。F9設置斷點。
Debug.Print可以在Immediate Window (快捷鍵Ctrl+G)輸出變量值。也可以在該Window中直接輸入表達式,查看值。
可以通過Watch Window,Locals Window查看變量值。