摘 要:Excel 2007在日常辦公方面應(yīng)用較普遍,但是在合并多個(gè)單元格時(shí),只能保留選擇區(qū)域最左上角的單元格數(shù)據(jù),其他單元格的數(shù)據(jù)將被丟棄。針對(duì)工作中在合并單元格時(shí),需要保留選擇區(qū)域所有單元格的數(shù)據(jù),在此提出基于VBA對(duì)Excel 2007二次開發(fā),結(jié)合Excel 2007對(duì)象模型Application對(duì)象的屬性,設(shè)計(jì)合并單元格控件的方法。在Windows XP SP3+Office 2007環(huán)境下,設(shè)計(jì)并開發(fā)出控件,實(shí)現(xiàn)了合并多個(gè)單元格,保留選擇區(qū)域數(shù)據(jù),解決了工作中的實(shí)際問題。
關(guān)鍵詞:VBA; 二次開發(fā); Excel 2007; 合并單元格
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):1004-373X(2010)10-0055-03
VBA-based Secondary Development of Excel 2007
LIU Ming
(Chongqing Vocational Institute of Engineering, Chongqing400037, China)
Abstract:Excel 2007 has been widely applied in peoptes daily life, but there are also some problems. When merging multiple cells, justthe cells on the very top left can be maintained andall the other cells are deleted. However, All the data of the cells in the selected area need be kept during the mergence of cells. The re-development of Excel 2007 is proposed based on VBA. The control widget of merging the cells is designed in combination with Excel 2007 objective mode and application object′s properties. Under the condition ofWindows XP SP3+Office 2007, the merging of multiple cells and the keeping of data in theselecting area are implemented by designing and developing control widget.
Keywords:VBA; redevelopment; Excel 2007; cell mergence
0 引 言
Microsoft Office已作為企事業(yè)單位解決辦公自動(dòng)化的理想的工具。而 Visual Basic for Application(VBA)是 Office套件的一部分,用來定制和擴(kuò)展Office的功能,讓用戶完成Office本身所不具備的功能,更高效地實(shí)現(xiàn)辦公自動(dòng)化[1]。Microsoft Office中的Excel 2007是一款功能強(qiáng)大的辦公軟件,利用該軟件可以完成信息保存、數(shù)據(jù)計(jì)算、數(shù)據(jù)分析、信息動(dòng)態(tài)發(fā)布等功能。但是在Microsoft Office中的Excel 2007軟件的使用中,對(duì)于單元格的合并處理并不是非常理想,在合并多個(gè)單元格時(shí),Excel 2007總是只保留選擇區(qū)域中左上角單元格的數(shù)據(jù),而將選擇區(qū)域的其他單元格的數(shù)據(jù)全部刪除。當(dāng)使用Excel 2007處理數(shù)據(jù),并需保留合并區(qū)域的所有單元格的數(shù)據(jù)時(shí),Excel 2007就無法滿足要求,只能重新錄入數(shù)據(jù),給工作帶來了極大的不便。
1 VBA對(duì)象
(1) VBA對(duì)象概述
VBA(microsoft visual basic for application)是Microsoft Office的核心組件之一,作為一個(gè)嵌入式二次開發(fā)引擎[2],VBA被集成到許多大型軟件系統(tǒng)之中,眾所周知的就有Word,Excel,PowerPoint,以及其他Office程序。Microsoft VBA建立在COM技術(shù)基礎(chǔ)之上,可以充分定制應(yīng)用系統(tǒng),或進(jìn)行深度的二次開發(fā)。集成VBA可以與Microsoft Office共享同一個(gè)二次開發(fā)環(huán)境。在Office中,宏語言VBA 適用于所有應(yīng)用程序,包括Word,Excel,PowerPoint,Access,Outlook 以及Project。從Office 97 版開始,新增了Visual Basic 編輯器。用戶無論是在Excel 中,還是在Word 中甚至于在Access 中建立和管理VBA 都使用統(tǒng)一的方法和標(biāo)準(zhǔn)。
具有開放性的Microsoft Office使用VBA語言進(jìn)行二次開發(fā)。在Microsoft Office Excel 2007平臺(tái)上使用的VBA為用戶定制開發(fā)的應(yīng)用程序,可以解決Excel 2007在具體使用過程中標(biāo)準(zhǔn)命令無法滿足用戶需求或者標(biāo)準(zhǔn)命令的操作過程過于繁瑣等方面的實(shí)際問題,達(dá)到幫助用戶減輕煩瑣、機(jī)械的日常工作,從而提高用戶的工作效率和程序的實(shí)用性。
VBA的Application對(duì)象共有AddIns集合、Columns和Rows集合、Dialogs集合、Sheets集合等對(duì)象集合[3],它們的作用有:
AddIns集合:AddIns集合表示所有當(dāng)前加載的Excel Add-in;
Columns和Rows集合:這兩個(gè)集合表示活動(dòng)工作簿中的列和行;
Dialogs集合:Dialogs集合包括Excel程序中所有的對(duì)話框;
Sheets集合:Sheets集合表示返回指定或活動(dòng)工作簿中所有工作表的集合。
VBA的Application對(duì)象常用的屬性有ActiveCell,ActiveChart,ActiveSheet,ActiveWindow,ActiveWorkbook,RangeSelection,Selection,StatusBar,ThisWorkbook等。
ActiveCell屬性:Application對(duì)象的ActiveCell屬性表示返回一個(gè)表示活動(dòng)工作簿中活動(dòng)工作表的活動(dòng)單元格的Range對(duì)象。
ActiveChart屬性:ActiveChart屬性表示返回表示活動(dòng)圖表的Chart對(duì)象,不管它是嵌入的圖表還是圖表工作表。
ActiveSheet屬性:ActiveSheet屬性表示返回一個(gè)表示當(dāng)前選中的工作表(頂部工作表)的Worksheet對(duì)象。
ActiveWindow屬性:ActiveWindow屬性表示返回一個(gè)表示活動(dòng)窗口(頂部窗口)的Window對(duì)象。
ActiveWorkbook屬性:ActiveWorkbook屬性表示返回一個(gè)表示活動(dòng)窗口(頂部窗口)中的工作簿的Workbook對(duì)象。
RangeSelection屬性:RangeSelection屬性表示返回一個(gè)表示指定窗口中工作表里選擇單元格的Range對(duì)象,即使在工作表中一個(gè)圖表對(duì)象已經(jīng)被選擇或激活。
Selection屬性:Selection屬性表示返回活動(dòng)窗口中被選擇的對(duì)象。
StatusBar屬性:StatusBar屬性表示返回或設(shè)置狀態(tài)欄的文本,這個(gè)屬性允許你更改在Excel窗口底部的狀態(tài)欄中顯示的信息。
ThisWorkbook屬性:ThisWorkbook屬性表示返回一個(gè)表示當(dāng)前運(yùn)行的宏代碼所在工作簿的 Workbook對(duì)象,這個(gè)屬性允許載入宏定義包含代碼的工作簿。
(2) Application對(duì)象概述[9]
Application對(duì)象是Microsoft Office Excel 2007對(duì)象模型中最高級(jí)別的對(duì)象,表示Excel程序自身。Application對(duì)象提供正在運(yùn)行的程序的信息、應(yīng)用于程序?qū)嵗倪x項(xiàng)以及實(shí)例中打開的當(dāng)前對(duì)象。因?yàn)樗菍?duì)象模型中最高的對(duì)象,Application對(duì)象也包含組成一個(gè)工作簿的很多部件,包括如工作簿、工作表集合、單元格以及這些對(duì)象所包含的數(shù)據(jù)等。Application對(duì)象帶有175個(gè)屬性和52個(gè)方法,可以設(shè)置整個(gè)應(yīng)用程序的環(huán)境或配置應(yīng)用程序。
有很多Application對(duì)象的屬性可以用來訪問Excel 2007程序的各種對(duì)象,但是只有小部分是你可能經(jīng)常使用的。即如:
ActiveCell:返回一個(gè)表示活動(dòng)工作簿中活動(dòng)工作表的活動(dòng)單元格的Range對(duì)象。
ActiveChart:返回表示活動(dòng)圖表的Chart對(duì)象,不管是嵌入的圖表還是圖表工作表。在一個(gè)嵌入的圖表被選擇或激活時(shí),它就是活動(dòng)圖表。
ActiveSheet:返回一個(gè)表示當(dāng)前選中的工作表(頂部工作表)的Worksheet對(duì)象。在一個(gè)工作簿中只有一個(gè)工作表能成為活動(dòng)工作表。
ActiveWindow:返回一個(gè)表示活動(dòng)窗口(頂部窗口)的Window對(duì)象。
ActiveWorkbook:返回一個(gè)表示活動(dòng)窗口(頂部窗口)中的工作簿的Workbook對(duì)象。
RangeSelection:返回一個(gè)表示指定窗口中工作表里選擇的單元格的Range對(duì)象,即使在工作表中一個(gè)圖表對(duì)象已經(jīng)被選擇或激活。
Selection:返回活動(dòng)窗口中被選擇的對(duì)象。
StatusBar:返回或設(shè)置狀態(tài)欄的文本。
ThisWorkbook:返回一個(gè)表示當(dāng)前運(yùn)行的宏代碼所在工作簿的 Workbook對(duì)象。
(3) Application對(duì)象的Selection屬性使用方法[9]
Selection屬性返回活動(dòng)窗口中被選擇的對(duì)象。例如,對(duì)于單元格,這個(gè)屬性返回Range對(duì)象;對(duì)于圖表,它返回Chart對(duì)象。如果使用屬性而沒有對(duì)象限定符,等于使用Application.Selection。
2 方案設(shè)計(jì)
使用VBA在Microsoft Office Excel 2007中進(jìn)行二次開發(fā)時(shí),利用Application對(duì)象的Selection屬性,設(shè)計(jì)一個(gè)控件。Selection屬性返回活動(dòng)窗口中被選擇的對(duì)象,如果使用屬性而沒有對(duì)象限定符,等于使用Application.Selection。該控件需要能夠?qū)icrosoft Office Excel 2007中的合并區(qū)域進(jìn)行處理,先要讀出合并區(qū)域的所有單元格的數(shù)據(jù),并保存起來,以備使用;然后對(duì)所選擇的區(qū)域進(jìn)行合并操作,合并操作后,將保存的數(shù)據(jù)再寫回到合并后的單元格中,就完成合并操作。設(shè)計(jì)框圖如圖1所示。
3 系統(tǒng)設(shè)計(jì)
在程序系統(tǒng)設(shè)計(jì)中,可直接在Microsoft Office Excel 2007提供的Visual Basic編輯器中進(jìn)行,系統(tǒng)設(shè)計(jì)分成選擇區(qū)域數(shù)據(jù)記數(shù)、數(shù)據(jù)讀出、數(shù)據(jù)寫入、程序加載等4個(gè)方面的設(shè)計(jì)。
圖1 設(shè)計(jì)框圖
(1) 選擇區(qū)域識(shí)別
在Microsoft Office Excel 2007進(jìn)行區(qū)域選擇后,形成一個(gè)選擇區(qū)域,要由系統(tǒng)自動(dòng)確認(rèn)選擇區(qū)域的大小和編號(hào)。在Excel 2007提供的VBA中,使用下面的語句直接識(shí)別出選擇區(qū)域的大小:
行數(shù):Selection.Rows.Count
列數(shù):Selection.Columns.Count
(2) 數(shù)據(jù)讀出
識(shí)別出選擇區(qū)域的大小后,立刻讀出選擇區(qū)域中所有單元格的數(shù)據(jù),并把數(shù)據(jù)保存起來,此時(shí)并不知道數(shù)據(jù)的類型,以及數(shù)據(jù)量的大小。在Microsoft Office Excel 2007中,在進(jìn)行區(qū)域合并時(shí),根據(jù)實(shí)際需要,其參與工作的數(shù)據(jù)量并不是很大,并且也不需要考慮每一個(gè)單元格的數(shù)據(jù)類型,只需要做簡單的保存即可。因此,用1個(gè)萬能型的變量,進(jìn)行保存,把選擇區(qū)域中所有單元格的數(shù)據(jù)采用字符串的連接方法,按順序連接起來,保存在1個(gè)變量中。方法如下:
For i = 1 To Selection.Rows.Count
For j = 1 To Selection.Columns.Count
MergeData = MergeData \",\"
Selection.Cells(i, j)
Next j
Next i
(3) 數(shù)據(jù)寫入
在單元格合并完成以后,所有選擇的單元格合并成1個(gè)單元格,這時(shí)的數(shù)據(jù)寫入是非常簡單的,采用下面的方法即可:
Selection.Cells(1, 1) = MergeData
(4)程序加載
程序設(shè)計(jì)好后,Excel有2種加載宏的方法。第一種是在運(yùn)行Microsoft Office Excel 2007后,在宏中直接加載運(yùn)行即可;第二種是在Microsoft Office Excel 2007運(yùn)行的時(shí)候進(jìn)行加載,并且嵌入在Microsoft Office Excel 2007的工具欄上,這種方法使用比較方便,能夠直接使用。
Excel有3種類型的加載宏程序,即:Excel 加載宏、自定義的組件對(duì)象模型 (COM) 加載宏和自動(dòng)化加載宏。此處所指的加載宏采用第一類加載宏。將寫好的宏文件,保存在Office的安裝盤Program Files/Microsoft Office/Office12/Library文件夾中,在Excel 2007啟動(dòng)時(shí),可以自動(dòng)加載該宏文件[8]。建立如下宏:
Sub Macro_Merge()
Dim MergeData
Dim i, j As Integer
For i = 1 To Selection.Rows.Count
For j = 1 To Selection.Columns.Count
If MergeData <> \"\" Then
MergeData = MergeData \",\" Selection.
Cells(i, j)
Else
MergeData = Selection.Cells(i, j)
End If
Next j
Next i
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Selection.Merge
Selection.Cells(1, 1) = MergeData
End Sub
完成后,以Merge_Macro.xlam保存在Program Files/Microsoft Office/Office12/Library文件夾中。
選擇Excel 2007中的“Office按鈕”,選擇菜單中的按鈕,彈出“Excel 選項(xiàng)”對(duì)話框,在對(duì)話框中,選擇“加載項(xiàng)”,再選擇最下面的“轉(zhuǎn)到”按鈕,彈出“加載宏”對(duì)話框,在對(duì)話框中,勾選“Merge_Macro”,單擊確定。
再選擇Excel 2007中的“Office按鈕”,選擇菜單中的按鈕,彈出“Excel 選項(xiàng)”對(duì)話框,在對(duì)話框中,選擇“自定義”選項(xiàng),將自己編寫的宏Macro_Merge添加到“快速訪問工具欄”,即可。
該宏程序在Windows XP SP3+Office 2007下調(diào)試通過。
4 結(jié) 語
Microsoft Visual Basic for Application是Microsoft Office的核心組件之一,作為嵌入式二次開發(fā)引擎,VBA得到廣泛的應(yīng)用,二次開發(fā)對(duì)軟件在使用方面的性能得到很好的擴(kuò)展。本文基于VBA對(duì)Excel 2007做了一個(gè)簡單的二次開發(fā),還可以基于VBA對(duì)其他軟件做二次開發(fā),可以更好地解決工作中的問題,提高了辦事效率。