姚曄 石翠
摘要:在Excel應(yīng)用中,部門信息常見的格式設(shè)置,一種是占據(jù)一列,另一種格式為合并單元格,占據(jù)一行,文章討論的是后一種,通過合并單元格的判定,確定要包含的數(shù)據(jù)范圍,然后復(fù)制到以合并單元格提取的內(nèi)容作為新建工作簿命名的文件中去。
關(guān)鍵詞:VBA;合并單元格;Excel
1 問題提出
在Excel應(yīng)用中,常會遇到以合并單元格拆分數(shù)據(jù)[1],如圖1所示。
2 解決方法
經(jīng)過多次嘗試,在Excel表格中,簡單的函數(shù)功能無法實現(xiàn),因此選擇采用宏(Macro)來實現(xiàn)。 宏是一種批處理,是一些命令組織在一起,作為一個單獨命令完成一個特定任務(wù)。Microsoft O伍ce辦公軟件自動集成“VBA”高級程序語言,使用宏語言Visual Basic將宏作為一系列指令來編寫[2]。
定義宏seprateExcel
Sub seprateExcel()
End sub
2.1合并單元格的判定
合并單元格為班級信息,通過MergeCells來判定[3]。
Duni As Long
Dim titleCounts As Long
titleCounts=3
Dun RowCounts As Long
RowCounts= Cells(Rows.Count, l).End(xlUp).Row
Dim cel As Range
For i=titleCounts+1 To RowCounts
Set cel= Range("A"&i;)
If cel.MergeCells Then
…
End If
Nexti
End Sub
2.2計算列
計算總列數(shù)的前提條件是最后一列必須保證為數(shù)據(jù),因為列標題行所有單元格都有數(shù)據(jù),因此,選擇標題行計算工作表的列數(shù),再以列數(shù)得到最后一列的字母列名,這樣無論是Office哪一個版本,都可以通過計算獲得[4]。
columnTitleRow=3
Dim ColumnCounts As Long
ColumnCounts=Cells(columnTitleRow, Columns.Count).End(xlToLeft).Column
卜計算最后一列的列名
Dim columnLetter As String
num= ColumnCounts
Do While num>0
columnLetter=Chr《num -1)Mod 26+65)&columnLetter;
num= Int《num -1)/26)
Loop
2.3提取合并單元格內(nèi)容
titleCounts=3
RowCounts= Cells(Rows.Count, l).End(xlUp).Row
Dim sourceFile As String
sourceFile=”成績表.xls"
Dim targetFile As String
Dim targetFilewithPath As String
Dim cel As Range
For i=titleCounts+1 To RowCounts
Set cel= Range("A"&i;)
Ifcel.MergeCells Then
targetFile= Trim(cel)&".xls"
targetFilewithPath=ThisWorkbook.Path&”\”&Trim;(cel)&”.xls”
Workbooks.Add
ActiveWorkbook.SaveAs targetFilewithPath
Windows(sourceFile).Activate
…
End If
Nexti
2.4復(fù)制表頭
Windows(sourceFile).Activate
ThisWorkbook.Sheets("sheetl").Activate
Range("Al:"&columnLetter;&titleCounts;).Copy
Windows(targetFile).Activate
Range("Al").Select
ActiveSheet.Paste
2.5復(fù)制內(nèi)容
拆分工作表,首先確定拆分范圍。起止行的判定也是通過合并單元格的判定來完成。
Dim BeginRow As Long, EndRow As Long
For i=titleCounts+1 To RowCounts
Set cel= Range("A"&i;)
Ifcel.MergeCells Then
Ifi>titleCounts+1 Then
EndRow=i-1
Windows(sourceFile).Activate
ThisWorkbook.Sheets (" sheetl").Activate
Range( "A" & BeginRow & ":" & columnLetter &EndRow;).Copy
Windows(targetFile).Activate
Range("Al").Select
ActiveSheet.Paste
…
End If
targetFile= Trim(cel)&”.xls” targetFilewithPath=ThisWorkbook.Path&”\”&Trim;(cel)&”.xls”
Workbooks.Add
ActiveWorkbook.SaveAs targetFilewithPath
Windows(sourceFile).Activate
BeginRow= 1+1
End If
Nexti
EndRow= RowCounts
Windows(sourceFile).Activate
ThisWorkbook.Sheets(" sheetl").Activate
Range("A"&BeginRow;&”:”&columnLetter;&EndRow;).Copy
Windows(targetFile).Activate
Range("Al").Select
ActiveSheet.Paste
3 結(jié)語
由于微軟辦公自動化軟件Office的普及,包含在其中的各個組件都可以利用VBA,VBA的應(yīng)用有助于使工作自動化,可以使這些軟件的應(yīng)用獲得更高的工作效率。另外,由于VBA可以直接應(yīng)用Office套裝軟件的各項強大功能,所以,對Office進行二次程序設(shè)計和程序開發(fā)更加方便快捷。
[參考文獻]
[1]廖麗嶸基于Excel VBA的成績管理系統(tǒng)[J].現(xiàn)代計算機(專業(yè)版),2012( 23):64-66
[2]高世萍,翟濱,廉鎖原.基于Excel函數(shù)及Excel VBA的成績分析[J].電腦學(xué)習(xí),2011(1):18-19.
[3]李利民.基于Exce12007 VBA的學(xué)生成績管理系統(tǒng)的設(shè)計與實現(xiàn)[J]電腦知識與技術(shù),2010(5):1128-1129,1137
[4]格林.Excel 2007 VBA參考大全[M].Excel Home,譯北京:人民郵電出版社,2009