APP下载

VBA实现按合并单元格拆分Excel工作表

2018-06-19姚晔石翠

无线互联科技 2018年3期

姚晔 石翠

摘要:在Excel应用中,部门信息常见的格式设置,一种是占据一列,另一种格式为合并单元格,占据一行,文章讨论的是后一种,通过合并单元格的判定,确定要包含的数据范围,然后复制到以合并单元格提取的内容作为新建工作簿命名的文件中去。

关键词:VBA;合并单元格;Excel

1 问题提出

在Excel应用中,常会遇到以合并单元格拆分数据[1],如图1所示。

2 解决方法

经过多次尝试,在Excel表格中,简单的函数功能无法实现,因此选择采用宏(Macro)来实现。 宏是一种批处理,是一些命令组织在一起,作为一个单独命令完成一个特定任务。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计算列

计算总列数的前提条件是最后一列必须保证为数据,因为列标题行所有单元格都有数据,因此,选择标题行计算工作表的列数,再以列数得到最后一列的字母列名,这样无论是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提取合并单元格内容

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复制表头

Windows(sourceFile).Activate

ThisWorkbook.Sheets("sheetl").Activate

Range("Al:"&columnLetter;&titleCounts;).Copy

Windows(targetFile).Activate

Range("Al").Select

ActiveSheet.Paste

2.5復制内容

拆分工作表,首先确定拆分范围。起止行的判定也是通过合并单元格的判定来完成。

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 结语

由于微软办公自动化软件Office的普及,包含在其中的各个组件都可以利用VBA,VBA的应用有助于使工作自动化,可以使这些软件的应用获得更高的工作效率。另外,由于VBA可以直接應用Office套装软件的各项强大功能,所以,对Office进行二次程序设计和程序开发更加方便快捷。

[参考文献]

[1]廖丽嵘基于Excel VBA的成绩管理系统[J].现代计算机(专业版),2012( 23):64-66

[2]高世萍,翟滨,廉锁原.基于Excel函数及Excel VBA的成绩分析[J].电脑学习,2011(1):18-19.

[3]李利民.基于Exce12007 VBA的学生成绩管理系统的设计与实现[J]电脑知识与技术,2010(5):1128-1129,1137

[4]格林.Excel 2007 VBA参考大全[M].Excel Home,译北京:人民邮电出版社,2009