论文部分内容阅读
摘要:本文主要讨论如何利用Microsoft Visual Basic程序来调用Microsoft Excel对象,把数据库文件转换为Microsoft Excel电子表格进行打印输出的方法,并给出部份源代码。
关键词:Visual Basic;Excel;VBA
中图分类号:TP31 文献标识码:A 文章编号:1009-3044(2007)05-11303-03
1 引言
为了在程序中输出符合用户需要的报表,可以采用“水晶报表”(Crystal Report)或其他第三方报表输出控件来编程。本文要讨论的是在Visual Basic程序中使用微软电子表格软件(MS Excel)强大的报表输出功能来输出报表。
我们知道,MS Office的每一组件都具有VBA(Visual Basic for Application)功能,可以在组件中利用内嵌的Visual Basic拓展该应用程序的功能,以适应用户更复杂、更特殊的需求。微软电子表格软件(Excel)除具有强大的计算功能外,还具有灵活的报表打印输出功能,我们可以在应用程序中调用Excel对象,利用此对象内嵌的VBA对输出报表进行控制。在计算机中安装有Excel的前提下,此方法可以满足大多数情况下的需要,具有一定的灵活性,在打印输出时也较为方便。本文将介绍如何用Visual Basic来对电子表格的输出进行控制,并给出一实例及其部份VB代码。
2 在VB中调用Excel对象
在VB中创建Excel对象的语句为:
Dim ExcelApp As Object
Set ExcelApp = CreateObject("Excel.Application")
对象创建后,打开工作薄进行设置,可用如下的语句:
With ExcelApp
'打开工作薄
.Workbooks.Add
'工作薄设置为可见
.Visible = True
'设置工作表的名称
.Worksheets(1).Name = "成绩表"
.Worksheets(2).Name = "论文表"
.Worksheets(3).Name = "课程表"
'选中第二个工作表
.Worksheets(2).Select
End With
这样,程序就开始打开Excel,三个工作表的名称分别为:“成绩表”、 “论文表”、 “课程表”,并且令当前工作表为“论文表”。需要插入一个新的工作表时,可以使用下面的语句:
ExcelApp.Workbooks.Add
3VB中Excel单元格的表达
ExcelApp.Range("A1") = "姓名"
这个语句设置单元格A1的内容为字符串"姓名",依此类推,只要知道了单元格的标号,就可以
往这个单元格中写入内容了。例:
Dim Txt as String
Txt = "A2"
ExcelApp.Range(Txt) = "职务"
此外,还有一种方法来表示单元格:
ExcelApp.Cells(5, 1)=100
这个语句表示位于第5行第1列的单元格的值是100。
还可以对固定范围内的单元格进行函数运算。例如:
'对B10之上的第一到第四个单元格求和,即对B6:B9求和
ExcelApp.Cells(10, 2)="=SUM(R[-4]C:R[-1]C)"
'对B10之上的第一到第四个单元格求平均值,即对B6:B9求平均值
ExcelApp.Cells(10, 2)="=AVERAGE(R[-4]C:R[-1]C)"
4VB中Excel单元格属性的表达
单元格的属性主要是指单元格内文字的字体类型,字体的大小,单元格高度和宽度,单元格的对齐属性等等。例如:
With ExcelApp
'设置字体名称
.Range("A1").Font.Name = "黑体"
'设置字体大小
.Range("A1").Font.Size = 14
'设置是否为粗体
.Range("A1").Font.Bold = True
'设置单元格高度
.Range("A1").RowHeight = 24.75
'单元格水平对齐方式,3表示水平居中对齐
.Range("A1").HorizontalAlignment = 3
'单元格垂直对齐方式,2表示垂直居中对齐
.Range("A1").VerticalAlignment = 2
'设置单元格内文字是否自动换行
.Range("A1").WrapText = True
'设置单元格边框类型,1为实线
.Range("A1").Borders.LineStyle = 1
'选中A2到A5范围内的单元格
.Range("A2:A5").Select
'合并选中的单元格
.Selection.merge
End With
5VB中Excel页面属性的设置
在使用Excel时,为确保打印的结果符合要求,我们通常会进行页面属性的设置,在VB中可以使用如下的语句来设置Excel页面:
With ExcelApp.ActiveSheet.PageSetup
'设置页边距(括号中的数字为距离),分别是左、右、上、下边距
.LeftMargin = ExcelApp.InchesToPoints(0.3)
.RightMargin = ExcelApp.InchesToPoints(0.3)
.TopMargin = ExcelApp.InchesToPoints(0.3)
.BottomMargin = ExcelApp.InchesToPoints(0.3)
'打印页面是否水平居中
.CenterHorizontally = True
'是否垂直居中
.CenterVertically = False
'设置打印方向:1为纵向打印,2为横向打印
.Orientation =1
'设置打印纸的类型,例如A3为8,A4为9
.PaperSize = 9
'设置页面缩放的百分比
.Zoom = 100
End With
6生成学生成绩单的部份VB代码
假设一数据库(chenjidan.mdb)中的学生成绩表(chenji)由以下8个字段构成,分别是:学号、姓名、班级、数学、外语、哲学、物理、语文字段,以下的代码可以从该数据表中读取数据,在Excel中生成图1样式的成绩单,并自动计算平均分。
图1
Private Sub ChenJiDan()
Dim Db As Database
Dim rsChenji as Recordset
Dim DbPath as String
DbPath = App.Path + "\chenjidan.mdb"
'打开数据库和有成绩数据的表
Set Db = OpenDatabase(DbPath, True, False, Pass)
Set rsChenji = Db.OpenRecordset("chenji", dbOpenDynaset)
'计算学生的数量,用变量I表示
Dim I as Integer
rsChenji.MoveFirst
I=0
If rsChenji.EOF Then Exit Sub
While Not rsChenji.EOF
I=I+1
rsChenji.MoveNext
Wend
'打开Excel,在电子表格中导入数据
Dim ExcelApp As Object
Set ExcelApp = CreateObject("Excel.Application")
With ExcelApp
.Workbooks.Add
.Visible = True
.Worksheets(1).Name = "成绩表"
.Worksheets(1).Select
'表的第一行是标题
.Range("A1") = "2005级期末考试成绩表"
.Range("A1").Font.Size = 14
.Range("A1").Font.Name = "黑体"
.Range("A1").Font.Bold = True
.Range("A1").RowHeight = 24.75
.Range("A1:H1").Merge
.Range("A1:A8").HorizontalAlignment = 3
.Range("A1:A8").VerticalAlignment = 2
'第二行是字段名称
.Range("A2") = "学号"
.Range("B2") = "姓名"
.Range("C2") = "班级"
.Range("D2") = "数学"
.Range("E2") = "外语"
.Range("F2") = "哲学"
.Range("G2") = "物理"
.Range("H2") = "语文"
rsChenji.MoveFirst
'RowNow是当前数据要写入的行标,从第三行开始写入数据
Dim RowNow as Integer
RowNow = 3
'开始写入数据
While Not rsChenji.EOF
.Cells(RowNow, 1) = rsChenji!学号
.Cells(RowNow, 2) = rsChenji!姓名
.cells(RowNow, 3) = rsChenji!班级
.Cells(RowNow, 4) = rsChenji!数学
.Cells(RowNow, 5) = rsChenji!外语
.Cells(RowNow, 6) = rsChenji!哲学
.Cells(RowNow, 7) = rsChenji!物理
.Cells(RowNow, 8) = rsChenji!语文
'行标加1,以便数据写入下一行
RowNow = RowNow + 1
rsChenji.MoveNext
Wend
.Cells(RowNow, 1) = "平均分"
'计算每一科的平均分,从第四列开始,到第八列结束
For x = 4 To 8
.Cells(RowNow, x) = "= AVERAGE(R[-" + Trim(Str(I)) + "]C:R[-1]C)"
Next
'为表格画边框,P表示范围,起始为A2,终止单元格由RowNow决定行,所在列为H
Dim P as String
P="A2"+":H"+Trim(Str(RowNow))
.Range(P).Borders.LineStyle = 1
'设置表格的属性
.Range(P).Font.Size = 12
.Range(P).Font.Name = "宋体"
.Range(P).HorizontalAlignment = 3
.Range(P).VerticalAlignment = 2
.Range(P).WrapText = True
.Range(P).RowHeight = 25
End With
'进行打印前的页面设置
With ExcelApp.ActiveSheet.PageSetup
.LeftMargin = ExcelApp.InchesToPoints(0)
.RightMargin = ExcelApp.InchesToPoints(0)
.TopMargin = ExcelApp.InchesToPoints(0.3)
.BottomMargin = ExcelApp.InchesToPoints(0.3)
.PrintHeadings = False
.PrintGridlines = False
.CenterHorizontally = True
.CenterVertically = False
.Orientation = 2
.Draft = False
.PaperSize = 9
.Order = 1
.BlackAndWhite = False
.Zoom = 100
End With
rsChenji.Close
Db.Close
End Sub
程序运行后,即在Excel中生成如图一样式的表格,并自动计算各科的平均分,选择Excel中的“打印”菜单即可打印。上述程序只是起到一个抛砖引玉的作用,如果要让Excel生成其他符合用户需求的表格,只要修改程序代码即可。
7结束语
本文介绍了VB调用 Excel对象的基本方法,通过VBA的编程,可以轻松地将数据写入电子表
格中,不仅可以将数据以格式化方式保存成文件,也使得打印输出更加得心应手。VBA中的属性及方法众多,有的不方便记忆,我们可以通过调用VBA宏的方法来查看。具体方法是:在Excel中录制一段宏,这段宏是与所编程序的操作有关系的,然后可以编辑此宏,就得到Visual Basic代码,再查找相对应的属性或方法,复制下来粘贴到VB程序中去。利用此法是学习VBA的一个捷径,可以起到事半功倍的效果。我们可以举一反三,利用上述录制宏的方法,学习到更多Office组件的VBA编程,例如Word,Access,PowerPoint等,有了这些VBA代码,就可以在VB程序中操作相应的Office对象了,从而使我们的程序如虎添翼。
参考文献:
[1][美]Evangelos Petroutsos,邱仲潘等译.Visual Basic 5从入门到精通[M].北京:电子工业出版社,1997.
[2]许舜渊编著,周晓津改编,Visual Basic数据库程序设计——提高篇[M]. 北京:人民邮电出版社,1997
[3]赵栋伟,松蕊等,Excel2000中文版速成[M].北京:机械工业出版社,1999
[4]孙敬杰,Excel VBA入门与实例演练[M].北京:中国青年出版社,2005
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:Visual Basic;Excel;VBA
中图分类号:TP31 文献标识码:A 文章编号:1009-3044(2007)05-11303-03
1 引言
为了在程序中输出符合用户需要的报表,可以采用“水晶报表”(Crystal Report)或其他第三方报表输出控件来编程。本文要讨论的是在Visual Basic程序中使用微软电子表格软件(MS Excel)强大的报表输出功能来输出报表。
我们知道,MS Office的每一组件都具有VBA(Visual Basic for Application)功能,可以在组件中利用内嵌的Visual Basic拓展该应用程序的功能,以适应用户更复杂、更特殊的需求。微软电子表格软件(Excel)除具有强大的计算功能外,还具有灵活的报表打印输出功能,我们可以在应用程序中调用Excel对象,利用此对象内嵌的VBA对输出报表进行控制。在计算机中安装有Excel的前提下,此方法可以满足大多数情况下的需要,具有一定的灵活性,在打印输出时也较为方便。本文将介绍如何用Visual Basic来对电子表格的输出进行控制,并给出一实例及其部份VB代码。
2 在VB中调用Excel对象
在VB中创建Excel对象的语句为:
Dim ExcelApp As Object
Set ExcelApp = CreateObject("Excel.Application")
对象创建后,打开工作薄进行设置,可用如下的语句:
With ExcelApp
'打开工作薄
.Workbooks.Add
'工作薄设置为可见
.Visible = True
'设置工作表的名称
.Worksheets(1).Name = "成绩表"
.Worksheets(2).Name = "论文表"
.Worksheets(3).Name = "课程表"
'选中第二个工作表
.Worksheets(2).Select
End With
这样,程序就开始打开Excel,三个工作表的名称分别为:“成绩表”、 “论文表”、 “课程表”,并且令当前工作表为“论文表”。需要插入一个新的工作表时,可以使用下面的语句:
ExcelApp.Workbooks.Add
3VB中Excel单元格的表达
ExcelApp.Range("A1") = "姓名"
这个语句设置单元格A1的内容为字符串"姓名",依此类推,只要知道了单元格的标号,就可以
往这个单元格中写入内容了。例:
Dim Txt as String
Txt = "A2"
ExcelApp.Range(Txt) = "职务"
此外,还有一种方法来表示单元格:
ExcelApp.Cells(5, 1)=100
这个语句表示位于第5行第1列的单元格的值是100。
还可以对固定范围内的单元格进行函数运算。例如:
'对B10之上的第一到第四个单元格求和,即对B6:B9求和
ExcelApp.Cells(10, 2)="=SUM(R[-4]C:R[-1]C)"
'对B10之上的第一到第四个单元格求平均值,即对B6:B9求平均值
ExcelApp.Cells(10, 2)="=AVERAGE(R[-4]C:R[-1]C)"
4VB中Excel单元格属性的表达
单元格的属性主要是指单元格内文字的字体类型,字体的大小,单元格高度和宽度,单元格的对齐属性等等。例如:
With ExcelApp
'设置字体名称
.Range("A1").Font.Name = "黑体"
'设置字体大小
.Range("A1").Font.Size = 14
'设置是否为粗体
.Range("A1").Font.Bold = True
'设置单元格高度
.Range("A1").RowHeight = 24.75
'单元格水平对齐方式,3表示水平居中对齐
.Range("A1").HorizontalAlignment = 3
'单元格垂直对齐方式,2表示垂直居中对齐
.Range("A1").VerticalAlignment = 2
'设置单元格内文字是否自动换行
.Range("A1").WrapText = True
'设置单元格边框类型,1为实线
.Range("A1").Borders.LineStyle = 1
'选中A2到A5范围内的单元格
.Range("A2:A5").Select
'合并选中的单元格
.Selection.merge
End With
5VB中Excel页面属性的设置
在使用Excel时,为确保打印的结果符合要求,我们通常会进行页面属性的设置,在VB中可以使用如下的语句来设置Excel页面:
With ExcelApp.ActiveSheet.PageSetup
'设置页边距(括号中的数字为距离),分别是左、右、上、下边距
.LeftMargin = ExcelApp.InchesToPoints(0.3)
.RightMargin = ExcelApp.InchesToPoints(0.3)
.TopMargin = ExcelApp.InchesToPoints(0.3)
.BottomMargin = ExcelApp.InchesToPoints(0.3)
'打印页面是否水平居中
.CenterHorizontally = True
'是否垂直居中
.CenterVertically = False
'设置打印方向:1为纵向打印,2为横向打印
.Orientation =1
'设置打印纸的类型,例如A3为8,A4为9
.PaperSize = 9
'设置页面缩放的百分比
.Zoom = 100
End With
6生成学生成绩单的部份VB代码
假设一数据库(chenjidan.mdb)中的学生成绩表(chenji)由以下8个字段构成,分别是:学号、姓名、班级、数学、外语、哲学、物理、语文字段,以下的代码可以从该数据表中读取数据,在Excel中生成图1样式的成绩单,并自动计算平均分。
图1
Private Sub ChenJiDan()
Dim Db As Database
Dim rsChenji as Recordset
Dim DbPath as String
DbPath = App.Path + "\chenjidan.mdb"
'打开数据库和有成绩数据的表
Set Db = OpenDatabase(DbPath, True, False, Pass)
Set rsChenji = Db.OpenRecordset("chenji", dbOpenDynaset)
'计算学生的数量,用变量I表示
Dim I as Integer
rsChenji.MoveFirst
I=0
If rsChenji.EOF Then Exit Sub
While Not rsChenji.EOF
I=I+1
rsChenji.MoveNext
Wend
'打开Excel,在电子表格中导入数据
Dim ExcelApp As Object
Set ExcelApp = CreateObject("Excel.Application")
With ExcelApp
.Workbooks.Add
.Visible = True
.Worksheets(1).Name = "成绩表"
.Worksheets(1).Select
'表的第一行是标题
.Range("A1") = "2005级期末考试成绩表"
.Range("A1").Font.Size = 14
.Range("A1").Font.Name = "黑体"
.Range("A1").Font.Bold = True
.Range("A1").RowHeight = 24.75
.Range("A1:H1").Merge
.Range("A1:A8").HorizontalAlignment = 3
.Range("A1:A8").VerticalAlignment = 2
'第二行是字段名称
.Range("A2") = "学号"
.Range("B2") = "姓名"
.Range("C2") = "班级"
.Range("D2") = "数学"
.Range("E2") = "外语"
.Range("F2") = "哲学"
.Range("G2") = "物理"
.Range("H2") = "语文"
rsChenji.MoveFirst
'RowNow是当前数据要写入的行标,从第三行开始写入数据
Dim RowNow as Integer
RowNow = 3
'开始写入数据
While Not rsChenji.EOF
.Cells(RowNow, 1) = rsChenji!学号
.Cells(RowNow, 2) = rsChenji!姓名
.cells(RowNow, 3) = rsChenji!班级
.Cells(RowNow, 4) = rsChenji!数学
.Cells(RowNow, 5) = rsChenji!外语
.Cells(RowNow, 6) = rsChenji!哲学
.Cells(RowNow, 7) = rsChenji!物理
.Cells(RowNow, 8) = rsChenji!语文
'行标加1,以便数据写入下一行
RowNow = RowNow + 1
rsChenji.MoveNext
Wend
.Cells(RowNow, 1) = "平均分"
'计算每一科的平均分,从第四列开始,到第八列结束
For x = 4 To 8
.Cells(RowNow, x) = "= AVERAGE(R[-" + Trim(Str(I)) + "]C:R[-1]C)"
Next
'为表格画边框,P表示范围,起始为A2,终止单元格由RowNow决定行,所在列为H
Dim P as String
P="A2"+":H"+Trim(Str(RowNow))
.Range(P).Borders.LineStyle = 1
'设置表格的属性
.Range(P).Font.Size = 12
.Range(P).Font.Name = "宋体"
.Range(P).HorizontalAlignment = 3
.Range(P).VerticalAlignment = 2
.Range(P).WrapText = True
.Range(P).RowHeight = 25
End With
'进行打印前的页面设置
With ExcelApp.ActiveSheet.PageSetup
.LeftMargin = ExcelApp.InchesToPoints(0)
.RightMargin = ExcelApp.InchesToPoints(0)
.TopMargin = ExcelApp.InchesToPoints(0.3)
.BottomMargin = ExcelApp.InchesToPoints(0.3)
.PrintHeadings = False
.PrintGridlines = False
.CenterHorizontally = True
.CenterVertically = False
.Orientation = 2
.Draft = False
.PaperSize = 9
.Order = 1
.BlackAndWhite = False
.Zoom = 100
End With
rsChenji.Close
Db.Close
End Sub
程序运行后,即在Excel中生成如图一样式的表格,并自动计算各科的平均分,选择Excel中的“打印”菜单即可打印。上述程序只是起到一个抛砖引玉的作用,如果要让Excel生成其他符合用户需求的表格,只要修改程序代码即可。
7结束语
本文介绍了VB调用 Excel对象的基本方法,通过VBA的编程,可以轻松地将数据写入电子表
格中,不仅可以将数据以格式化方式保存成文件,也使得打印输出更加得心应手。VBA中的属性及方法众多,有的不方便记忆,我们可以通过调用VBA宏的方法来查看。具体方法是:在Excel中录制一段宏,这段宏是与所编程序的操作有关系的,然后可以编辑此宏,就得到Visual Basic代码,再查找相对应的属性或方法,复制下来粘贴到VB程序中去。利用此法是学习VBA的一个捷径,可以起到事半功倍的效果。我们可以举一反三,利用上述录制宏的方法,学习到更多Office组件的VBA编程,例如Word,Access,PowerPoint等,有了这些VBA代码,就可以在VB程序中操作相应的Office对象了,从而使我们的程序如虎添翼。
参考文献:
[1][美]Evangelos Petroutsos,邱仲潘等译.Visual Basic 5从入门到精通[M].北京:电子工业出版社,1997.
[2]许舜渊编著,周晓津改编,Visual Basic数据库程序设计——提高篇[M]. 北京:人民邮电出版社,1997
[3]赵栋伟,松蕊等,Excel2000中文版速成[M].北京:机械工业出版社,1999
[4]孙敬杰,Excel VBA入门与实例演练[M].北京:中国青年出版社,2005
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。