程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB6 >> VBA概述之在Office產品中創建自己的應用程序

VBA概述之在Office產品中創建自己的應用程序

編輯:VB6

VBA概述

VBA(Visual Basic For Application)是VB語言在Office產品中的應用,它基於Visual Basic For Windows發展而來,Visual Basic For Windows是Microsoft於1992年推出的開發Windows應用程序的程序設計語言,由於語言簡單,易用易學,所以深受用戶的歡迎。而VBA的語法結構與Visual Basic For Windows基本相似,但它們之間是有本質區別的,Visual Basic For Windows是一種編程語言,它可以創建獨立的應用程序,而VBA是一種語法結構類似於Visual Basic For Windows的腳本語言,一般來說,它都是被嵌入在Microsoft的Office產品中來執行的。

在Office 2000之前,VBA在Word、Excel、Access等Office系統軟件中的運用是不一樣的(那個時候Office家族中的產品為數不多),但是到Office 2000就統一起來了。Excel是第一個包含有VBA的Office產品,也是至今應用VBA最廣泛的軟件之一。自Office 2000之後,Excel、Word、PowerPoint、Access中已經有了統一標准的宏語言VBA,其中Excel和Access的VBA最為成熟(從Office 2000開始,Office家族中的產品開始多起來)。

從Office 2003開始,Microsoft在Office家族中逐漸增加了很多產品,如OneNote、Publisher、InforPath、Visio等,但是除了對VBA中的對象進行了擴充外,在VBA的應用推廣上並沒有特別大的改變,而且有些產品由於使用上的問題也沒有提供對VBA的擴展。

如今,Office 2007已經到來,並且在對VBA的支持上也出現了一些變化,隨著Microsoft .NET產品系列的不斷擴大和深入,.NET也嵌入到Microsoft的各個不同的產品中,而其中VSTO就是專門針對VBA在Office產品中應用的一個升級方案,我會在接下來的一些文章中向讀者介紹它。不過Excel仍然是Office家族中使用VBA最廣泛的產品,因此,我會以Excel為例來介紹VBA的使用,並在Office 2007軟件基礎上做一些示例。

首先來看看我們使用VBA在Excel中可以做些什麼事情。

Excel是一款功能很強大的用於處理表格數據的軟件,它可以被用來做很多不同的工作,如記錄客戶的名字和學生的考試分數、進行收支預算、分析實驗數據、制作發貨單和表格、通過給定的數據統計圖表等等,Excel的各種不同的功能被應用到各行各業,但有一點是相同的,那就是當要處理的數據量很大時,所有的用戶都期望讓Excel可以非常聰明地自己處理一些事情,“讓Excel動起來”正是VBA可以辦到的!

例如我們可以寫一個VBA程序來格式化報表,並把它打印出來,經過開發和測試,我們最終可以只用一個命令就完成所有的工作,而不用自己動手去一個個地敲命令、點擊鼠標查找菜單…Excel可以在一瞬間完成所有的工作,何樂而不為呢?

VBA在Excel中的幾種習慣用法

先看看我們在Excel中經常會用到的VBA:

1.反復插入文本。如果你經常需要在表格裡插入一段文本,如公司的名稱、版權信息等,你就可以寫一個VBA程序來代替你做這件事。當然這再簡單不過了,類似的情況會有很多,例如你還可以讓VBA幫助你插入公司所有員工的姓名(這些信息也許來源於一個網站或者數據庫)。

2.自動完成反復的工作。如果你是一名銷售經理,需要經常寫一份“月底銷售報告”遞交給老板,如果這些表格裡的數據來源於同一個地方,並且表格的樣式沒有特別大的變動,那麼你完全可以通過VBA編寫一個邏輯,讓Excel自己去搜集這些信息然後生成一張漂亮的表格,而這個時間裡你要麼去做其它更重要的事情,要麼在一邊舒舒服服地喝一杯咖啡看著電腦為你干活兒。而老板也會為你有如此高的工作效率而對你另眼相看。

3.錄制宏完成相同的動作。Excel中的宏其實也是VBA應用的一種,它是由Excel自動根據你所指定的命令生成的VBA代碼,執行這些代碼就相當於執行了這些命令。在Excel中,我們在一個表格裡做完一項工作,同時錄制了一個宏,然後可以在其它的表格裡反復執行這個宏,Excel可以毫無保留地幫我們將這項工作“復制”在所有的表格裡。

4.自定義命令。在Excel中,我們可以把反復要使用的一系列操作寫到一個宏裡,然後綁定到快捷鍵或按鈕上,以後只需要使用一個快捷鍵或點擊一個按鈕就可以迅速地完成一系列命令。

5.自定義工具欄。聽起來有些不可思議!我們可以通過VBA編寫的代碼在Excel的工具欄上放置自己的按鈕,隨時點擊它。

6.自定義菜單。不僅可以定制工具欄,我們甚至可以通過VBA將自己的命令放到Excel的菜單上,是不是很強啊?

7.制作數據表模板。通過制作數據表模板來幫助那些Excel初學者更快地完成工作,以減少他們所浪費的時間。

8.自定義工作表函數。雖然Excel擁有很多的功能函數(如Sum何Average等),但總是在實際的應用中顯得不夠,我們可以通過VBA添加自己的功能函數,用來完成一些特定的計算,從而簡化計算過程。

9.開發完全由宏來驅動的應用。花點時間,VBA還可以讓你做很多大型的應用程序,包括定制對話框、OnScreen Help、數據同步、數據搜集工具,以及其它更多的功能組件。

10.打造完全屬於自己的Excel插件。Excel本身的插件已經很多了,通常情況下都夠用,不過我們還是可以通過VBA開發屬於自己的專有插件。Excel中用來生成統計圖表的功能就是一個插件,叫Analysis ToolPak。

通過VBA可以開發Excel的很多功能,甚至於訪問網絡資源、遍歷Windows域、訪問遠程機器上的文件等,只要去認真研究VBA語言本身提供的對象,我們還可以發現更多令人驚奇的東西。VBA真的很強大!

VBA的優缺點

前面說了那麼多VBA可以做的事情(盡管還遠遠不止這些),那麼VBA到底好在哪些地方呢?Excel幾乎能自動完成所有你想做的事,只要能寫出Excel命令,它就可以完成功能,所以VBA的自動化就體現了下面這些優點:

1.Excel在自動化具體任務時代碼執行的順序不變(有的時候這看起來倒是一件好事)。

2.可以肯定的是,讓Excel自動化一項工作肯定比手動去完成要快得多(我想沒有人願意手動去完成那些繁瑣而重復性的工作)。

3.如果擁有近乎完美的宏代碼,Excel會永遠無故障地運行(不過任何代碼都是有缺陷的)。

4.任何人都可以用Excel自動化一項具體工作,即使他根本不懂計算機編程(Excel的宏錄制功能幫了很大的忙)。

5.很多看似不太可能做到的事情都可以用Excel做得漂漂亮亮的(前段時間我剛用Excel為一個網站做了一個前台數據錄入工具)。

6.對於那些既花時間又費精力的事兒,你再也不用坐在電腦前郁悶了,調用一個VBA編寫的命令,剩下的事情你就不用管了,出去放松一下吧。

當然,就像所有的編程語言一樣,VBA也會有一些缺點,從應用的角度來看有以下幾點(其它不好的地方應該也都從Visual Basic For Windows那裡繼承過來了):

1.Excel的宏雖然可以為你自動生成一些VBA代碼,但大多數時候還是需要你自己去編寫代碼將這些功能組織起來,如果你沒有一點編程經驗的話,這個對你來說恐怕有點棘手。不過還好,VBA學起來還是很容易的。

2.想要運行VBA必須要事先安裝Office軟件,尤其是Excel。它不可能像Visual Basic For Windows程序那樣只需要雙擊一個exe文件就能執行起來(這看來也是腳本語言的局限性)。

3.VBA是變化的,在不同的Office版本中,VBA都有一些細微的變化,這將導致你在Office 2000中編寫的VBA代碼在Office 2003中無法正確執行,反過來也一樣。

在Excel中開始VBA程序

我所演示和開發測試的環境都是建立在Excel 2007上,讀者如果想演練,最好也在相同的軟件環境下。

首先打開Excel,默認安裝配置下Excel 2007沒有顯示“開發工具”菜單,我們需要打開它。點擊窗體左上角的“Office按鈕”,選擇“Excel選項”,在對話框中選擇“常用”選項卡,勾選“在功能區顯示‘開發工具’選項卡(D)”,確定。現在我們在Excel的菜單區就可以看到“開發工具”了,點擊它,就可以開始我們的VBA程序了。

為了讓你的VBA程序或者宏代碼能夠順利運行,你需要確認一下宏的執行安全設置。點擊“宏安全性”,在對話框中選擇“啟用所有宏”,並勾選“信任對VBA工程對象模型的訪問”。現在我們可以完全自由地去編寫我們的VBA程序了。

點擊Visual Basic,可以打開VB編輯器(簡稱VBE),我們的幾乎所有的VBA代碼都是在這裡編寫的。當然,如果你曾經是一位VB程序員,那麼你會對這個編輯界面再熟悉不過了,它幾乎就和VB 6的編輯界面一樣,也有工程窗口、屬性窗口和代碼窗口,在這裡我們同樣可以添加控件、引用、模塊以及Excel對象等元素。另外,通過選擇代碼編輯窗口上方的兩個下拉列表,我們可以為不同對象的不同事件編寫代碼。所謂事件,就是我們在點擊或選擇控件時所完成的一系列動作,如命令按鈕的點擊事件,下拉列表下拉項的選擇,復選框或單選框的選擇等。

有關如何編寫VB代碼以及VB代碼的基本特性已經不是本文要討論的內容(事實上這些內容大家在學習計算機編程基礎知識時也已經都了解過了),這裡只對在Excel中使用VBA的一些情況做一下介紹。

1.VBA中將Excel錄制的宏寫到一個VBA模塊中(先了解了解什麼叫做VB模塊),它已經包含了一系列獨立的命令,可以作為一個VBA過程被調用。

2.一個VBA模塊有很多“子過程”組成,它執行了“對象”上的一些操作,可以獨立運行。例如我們在Excel Sheet上添加一個Active控件(注意大多數時候我們在VBA中所使用的都是Active控件而不是表單控件),比如添加一個命令按鈕,雙擊它,在代碼編輯窗口中就可以添加相應的命令了。下面的代碼是當用戶點擊命令按鈕後提示1+1的結果。

Private Sub CommandButton1_Click()
Dim sum As Integer
sum = 1 + 1
MsgBox "The answer is " & sum
End Sub

Excel中可以使用的Active控件不是特別多,這也表示了在VBA中用戶對UI的控制沒有特別多的選擇,當然,如果你的電腦上注冊了其它可用的Active控件,只要允許,你完全也可以把它們引用到Excel中,只要點擊“Active控件”中的最後一個圖標,在對話框中選擇要引用的Active控件即可。VBA中控件的使用和VB中相同,這裡就不再一一介紹了。回到Excel主界面,退出設計模式(只需要再次點擊“設計模式”按鈕即可),點擊我們剛才添加的命令按鈕,屏幕上出現了我們剛才在代碼中添加的對話框。

3.VBA模塊中有很多的函數,函數一般返回單一值,它既可以被別的模塊調用,也可以當做工作表函數來使用。

4.VBA提供了很多的已有對象,其中包括了WorkBook、WorkSheet、Cell Range、Chart以及Shape等重要對象。

5.Excel對象有其自身的層次結構。一個對象可以包含其它的對象,占據層次結構最頂端的是Excel,而它本身就是一個對象,在代碼中叫做Application,它包含了WorkBook和CommandBar等重要對象,WorkBook則又包含了WorkSheet和Chart等對象,WorkSheet又包含了Range和PivotTable等對象…這些層次結構的對象組成了我們VBA代碼的基本部分。

6.同類對象組織在一起就形成了集合,如WorkBook中包含的所有WorkSheet被稱之為WorkSheet集合,而Chart集合則由全部的Chart對象組成。

7.凡是層次結構中的對象都可以在VBA中使用,跟大多數面向對象語言一樣(雖然VB和VBA還不能被稱之為完全意義上的面向對象語言),我們使用“.”運算符來調用。如Application.WorkBooks(“Book1.xls”),它表示WorkBooks集合中的一個名稱為Book1.xls的對象(該對象為一個Excel文件),然後我們可以在這個對象中引用Sheet對象,如Application.WorkBooks(“Books.xls”).WorkSheets(“Sheet1”)。如果想進一步指定一個具體的單元格,就可以這樣Application.WorkBooks(“Books.xls”).WorkSheets(“Sheet1”).Range(“A1”)。

8.Excel中的當前活動對象可以讓我們在代碼中使用一種簡便的方式來調用對象。如果Book1.xls就是當前正在編輯的工作表,那麼剛才我們引用對象的方式就可以簡寫為WorkSheets(“Sheet1”).Range(“A1”)。當然,如果當前編輯的工作表就是Sheet1,可以直接寫成Range(“A1”)。

9.Excel中各種對象都有其自身的屬性。對象的屬性可以理解為對象的設置項,即便是一個單元格(Range),也有它自己的屬性,如Value(單元格的當前值)和Address(單元格在工作表中的地址)等。HasTitle(是否包含標題)和Type(圖表類型)則是Chart對象的屬性。VBA允許用戶判斷或更改對象的屬性值。

10.在使用對象屬性時,必須用“.”運算符來連接對象名和屬性名,如WorkSheets(“Sheet1”).Range(“A1”).Value可以查看當前工作表Sheet1中單元格A1的當前值。

11.變量賦值。同VB代碼一樣,在VBA代碼中允許使用變量來存儲數值、文本和對象,如interest = WorkSheets(“Sheet1”).Range(“A1”).Value將工作表Sheet1的單元格A1的值賦值給一個interest變量。

12.對象還包括了可以在其上調用的方法。所謂方法,就是Excel在對象上可以執行的動作,如ClearContents被用來清除Range內的內容。

13.方法的調用和屬性的獲取類似,也需要使用“.”運算符,如WorkSheets(“Sheet1”).Range(“A1”).ClearContents。

14.VBA包含了現代編程語言的所有語言結構,如數組、分支結構、循環結構、集合對象等。

通過以上一些簡單的介紹,相信讀者已經對VBA有了一個大致的了解,我在後面的章節中將會陸續介紹VBA中的一些對象和用法。

Excel簡史

我覺得還是有必要在這裡介紹一下Excel的發展歷史,因為不同版本的Excel對VBA的支持是不一樣的。

1.Excel 2:在Windows平台上,Excel最開始的版本號是2,這是為了和Mac平台上的Excel保持版本一致。Excel 2誕生於1987年,不過後來幾乎沒有人再用它。

2.Excel 3:於1990年末發布,其中XLM宏語言也隨之一起發布。

3.Excel 4:於1992年初面試,繼續包含了XLM宏語言。

4.Excel 5:1994年上半年問世,VBA第一次在這個版本中露面。

5.Excel 95:從技術角度講應該是Excel 7(其中沒有Excel 6這個版本),該版本於1995年夏天開始問世,是一個32位的版本,運行在Windows 95和NT平台上,其中增強了一些VBA的功能,並繼續支持XLM。不過,Excel 95的文檔格式和Excel 5相同。

6.Excel 97:也可以被稱為Excel 8,誕生於1997年元月,需要Windows 95和NT的支持。在此版本中,VBA在功能上有了很大的增強,其接口幾乎全部被重新設計過,同時它還采用了全新的文件格式(之前的版本不能打開這種格式)。

7.Excel 2000:即Excel 9,於1999年6月發布,僅增強了一點點功能,不過在用戶體驗方面改善了很多,尤其是網絡用戶。

8.Excel 2002:也叫Excel 10或Excel XP,於2001年下半年發布。在這個版本中最大的特性就是數據恢復(即Excel崩潰之後可以自動恢復崩潰之前的數據),同時它也是第一個使用版權保護的版本。

9.Excel 2003:Excel 11,這應該是目前來說使用人數最多的版本,也是最為成熟的版本,不過較前一版本而言它並沒有增加什麼新特性。

10.Excel 2007:隨Office 2007產品同時發布,這個版本有了很大的改變,除了界面風格的改變外,還增加了按顏色篩選和排序的功能(這可是個很有用的功能,我在Excel 2003的時候還曾經用VBA開發過類似於這樣的功能),同時,Office 2007的系列產品在文件格式上也有了很大的改變,Excel 2007的文件後綴為xlsx,它是一種完全公開的支持XML可擴展的文件格式,這裡有一篇文章介紹了Excel 2007的這種新文件格式。

http://blog.excelhome.net/user1/fanjy/archives/2007/940.html

了解Excel的發展歷史和各個版本的不同是非常重要的,因為我們需要確保不同版本的Excel對VBA的支持情況,避免別人在使用我們編寫的VBA程序時出現莫名其妙的錯誤,如VBA的Split函數是在Excel 2000中才引入的,如果在Excel 2000之前的版本中使用含有Split函數的VBA程序,則會出現編譯錯誤。

結語

VBA在Excel中的應用非常廣泛,深入了解並應用VBA,可以大大提高我們在使用Excel時的工作效率,達到意想不到的效果。另外,順便還要說一句,Excel在針對不同的數據類型時可以保存為不同類型的文件,在含有VBA的Excel文件中,為了保證今後能夠順利打開文件並執行其中的VBA代碼,建議讀者將Excel文件保存為xlsm類型(它表示一種啟用宏的工作簿)。

本文只是一個開篇,簡單介紹了VBA的發展歷史和應用范圍,並舉例說明了一下如何在Excel中編寫並運行自己的VBA程序,接下來我會詳細向大家介紹VBA中形形色色的對象的使用方法,其中大家也會看到一些難以想象的功能,不過這都很簡單,畢竟VBA只是腳本,它並不復雜!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved