Excel与VBA

如果你是Excel的资深用户,一定会留恋VBA,实际上你的VBA知识在Foxtable一样有用,原来的VBA代码只需稍作修改,就可以在Foxtable中使用。
Foxtable本身已经提供了很强大的Excel报表功能,可以利用报表模板来批量生成各种复杂的报表,所以本节的内容对于一般用户来说并无意义。

提示:

1、Excel库在Foxtable中的命名空间为MSExcel,所以代码中Excel的类型和函数都必须加上前缀MSExcel,例如:MSExcel.Application、MSExcel.WorkBook。
2、Excel与VBA的内容非常多,可以用一本厚厚的书讲述,我们不可能一一详述,本节的主要目的在于介绍其最基本的类型,以及如何直接在Foxtable中操控Excel。


Application

Application对象代表整个Microsoft Excel应用程序,它处于Excel对象的最高层次。

常用属性

常用方法

重要说明:只要定义了Application,Excel程序就会被打开。如果没有将其Visible属性设为True,这个Excel程序就会一直停留在进程中。为避免这种现象,一定要在代码的最后一行加上App.Quit,如果已经将Visible设为True,就不用加App.Quit。因为Excel程序在可见状态下,可直接手工关闭退出。 

WorkBook

WorkBook对象代表Microsoft Excel工作簿,它在Application对象的下一层。WorkBook是WorkBooks集合的成员。

常用方法

WorkSheet

WorkSheet代表一张工作表,它是WorkBook的下一级对象。WorkSheet是WorkSheets集合的成员。

可以通过位置或者工作表名称来引用工作表,例如引用第一个工作表:

Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("D:\Report.xls")
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)

如要引用最后一个表,可以这样:
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(Wb.WorkSheets.Count)

通过WorkSheets的名称引用。如:

Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets("同期对比")

需要注意的是,和Foxtable不同,这里的编号是从1开始的,而Foxtable的所有集合,包括数组,编号都是从0开始的。

主要属性

主要方法

Range

WorkSheet的下一级对象是Range,它可以是某个单元格、某一行、某一列或者多个相邻或不相邻的单元格区域对象。Range是Excel应用程序中使用最多的对象。在操作Excel的任何单元格区域之前,都要将其表示为一个Range对象,然后再使用该Range对象的属性和方法。

引用单元格 

主要属性

常用方法 

Chart

Chart是Excel提供的对数据进行形象化和直观化处理的图表分析工具。
提示:
CaseStudy目录下有一个演示文件:Excel图表.Table,此文件演示了如何利用本节的内容直接生成Excel的图表。

必须掌握的两个基本概念:

主要属性

 主要方法:

三维图表中的特有属性:

打印输出

利用PageSetup属性,可进行各种打印设置。如:


Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("D:\Report.xls")
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
With Ws.PageSetup
    '设置打印区域
    .PrintArea = "A1:H10"   '打印工作表的指定区域
    .PrintArea = Ws.UsedRange.Address   '打印工作表的使用区域
    .PrintTitleColumns = Ws.Columns("A:H").Address   '打印列标题(在每一页的左边重复出现)
    .PrintTitleRows = Ws.Rows(1).Address '打印行标题(在每一页的顶部重复出现)
    '设置页面
    .PaperSize = MSExcel.XlPaperSize.xlPaperA4   '纸张大小
    .LeftMargin = 30 '页面左边距
    .RightMargin = 30'页面右边距
    .TopMargin = 50  '页面顶部边距
    .BottomMargin = 50   '页面底部边距
    .HeaderMargin = 40   '页面顶端到页眉的距离
    .FooterMargin = 40   '页脚到页面底端的距离
    .CenterHorizontally = True   '页面水平居中
    .CenterVertically = True '页面垂直居中
    '设置页眉
    .LeftHeader = "打印日期: &D" '左页眉,&D表示日期
    .CenterHeader = "&""隶书,常规""&20 数据分析表"   '中页眉,并将字体设置为隶书和20号字大小
    .RightHeader = "打印者: " & App.UserName '右页眉
    '设置页脚
    .LeftFooter = "文件: &F  &A" '左页脚,&F表示文件名,&A表示工作表名
    .CenterFooter = ""   '中页脚为空
    .RightFooter = "第 &P 页  共 &N 页"  '右页脚
    '打印模式
    .Orientation = MSExcel.xlPageOrientation.xlPortrait  '纵向打印
    .Orientation = MSExcel.xlPageOrientation.xlLandscape '横向打印
    .PrintHeadings = True'打印行号和列标
    .PrintGridlines = True   '打印网格线
    '缩放打印
    .Zoom = False'以下设置将缩印在一页内
    .FitToPagesWide = 1  '按照1页的宽度打印
    .FitToPagesTall = 1  '按照1页的高度打印
End With
App.Visible = True
Ws.PrintPreview
App.Quit

补充说明,Zoom是用于设置打印工作表时的缩放比例,数值在10和400之间。如果本属性设为False,则由FitToPagesWide属性和FitToPagesTall属性的设定值对工作表的缩放进行控制。 

预览和打印

换页打印

利用PageBreak属性可手工控制换页。

如 在工作表的第24行后设置一个手动分页符:
Ws.Rows(25).PageBreak = MSExcel.XlPageBreak.xlPageBreakManual

如 在工作表的第3列左侧设置一个手动分页符:
Ws.Columns(3).PageBreak = MSExcel.XlPageBreak.xlPageBreakManual

清除所有的手动分页符:
Ws.Cells.PageBreak = MSExcel.XlPageBreak.xlPageBreakNone

下面的例子就是对有内容的区域,每打印5行就换页:

Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("D:\Report.xls")
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
'对A列从65536行开始向上查找,直到找到最后一个非空单元格为止,并得到其行号.也就是有内容的结束行
Dim EndRow As Integer = Ws.Range("A65536").End(MSExcel.XlDirection.xlUp).Row
'对A列从第1行开始向下查找,直到找到最后一个非空单元格为止,并得到其行号.也就是有内容的开始行
Dim FirstRow As Integer = Ws.Range("A1").End(MSExcel.XlDirection.xlDown).Row
'对A列从第1行开始向下查找,直到找到最后一个非空单元格为止,并得到其行号.也就是有内容的开始行
Ws.Cells.PageBreak = MSExcel.XlPageBreak.xlPageBreakNone'清除所有分页符
For i As Integer = FirstRow+6 To EndRow Step 5  '每5行就分页
    Ws.Rows(i).PageBreak = MSExcel.XlPageBreak.xlPageBreakManual
Next
App.Visible = True
Ws.PrintPreview
App.Quit

附件

Excel的ColorIndex(颜色编号)对照表:

 


本页地址:http://www.foxtable.com/webhelp/topics/2121.htm