【前言】
Foxtable本身已经封装了一个很强大的Excel报表。通过它可以利用报表模板来批量生成报表,也可以嵌入各种分析图形。但经过一段时间的应用以后,发现它还存在一些不足,尤其是图表问题。由于它在Excel中内嵌的图表全部是图片格式,后期根本无法对它进行手工修改或设置。由于这是老六购买的控件问题,解决起来基本无望。
为此,只有采用其它办法来弥补这个缺陷。在老六及lxl等人的热心指点下,我把Excel的dll动态库引用到Foxtable中,并把原有Excel文件中的vba代码改进一下放到Foxtable中试运行,ok,效果非常好,原来的所有问题全部可以解决。由于网上没有系统介绍这个dll的资料,逛了很多书店也没找到关于这个动态库的详细说明,我只有根据手头的几本VBA书籍,一点点的手工整理出这份《FoxTable操控Excel全攻略》。当然,说是“全攻略”可能有点言过了,这里介绍的只是Dll中很少很少的一部分功能。但如果把它作为Foxtable的报表工具来用的话,这份攻略应该足够了,呵呵。
即将发布的Foxtable更新,将封装MSExcel的这个dll,这样的话,本帖中的所有代码均可直接运行。
一、Application
Application对象代表整个Microsoft Excel应用程序,它处于Excel对象的最高层次。
常用属性:
1、Visible
隐藏Excel,就是将Application对象的Visible属性设置为False,从而使Excel本身不显示出来。如果要显示Excel,可将其显示为True。
如,在命令窗口执行下面的代码,就将自动打开并可见Excel程序:
Dim App As New MSExcel.Application
App.Visible = True
2、Caption
默认情况下,Excel的标题文字是Microsoft Excel加文件名。利用Caption可修改其标题显示格式。测试代码:
Dim App As New MSExcel.Application
App.Visible = True
App.Caption = "标题修改试验"
3、DisplayAlerts
是否显示警告信息对话框。比如,在合并单元格时,将默认弹出一个确认窗口。将DisplayAlerts设为False后,将直接合并而不再弹出对话框。
常用方法:
Quit。关闭Excel应用程序,如:App.Quit
重要说明:只要定义了Application,Excel程序就会被打开。如果没有将其Visible属性设为True,这个Excel程序就会一直停留在进程中。为避免这种现象,一定要在代码的最后一行加上App.Quit(如果已经将Visible设为True,就不用加App.Quit。因为Excel程序在可见状态下,可直接手工关闭退出)。
二、WorkBook
WorkBook对象代表Microsoft Excel工作簿,它在Application对象的下一层。WorkBook是WorkBooks集合的成员。
WorkBook的常用方法:
1、Add
利用Add方法可以创建新的工作簿。如下面的代码,就将新建一个工作簿,该工作簿的第一个工作表的名称改为hhh,同时在A1单元格写入“hhh123”,然后保存为D:\123.xls。
Dim App As New MSExcel.Application
Dim Wb As MSExcel.Workbook = App.WorkBooks.Add
Wb.Sheets(1).name = "hhh"
Wb.Sheets(1).range("A1").Value = "hhh123"
Wb.SaveAs("d:\123.xls")
App.Quit
需要说明的是,在创建新工作簿后,该工作簿就成为活动工作簿。
2、Open
打开工作簿。如:
Dim App As New MSExcel.Application
App.Visible = True
Dim Wb As MSExcel.Workbook = App.WorkBooks.Open("D:\report.xls")
3、Save
保存工作簿,如:Wb.Save
4、SaveAs
另存工作簿,如:Wb.SaveAs("D:\123.xls")
5、Close
关闭工作簿,如:Wb.Close
注意,这种方法只是关闭了工作簿,并没有关闭Microsoft Excel应用程序。如果要在关闭工作簿的同时关闭Excel程序,可以使用Application对象的Quit方法。
工作簿窗口的重要属性:如,下面的代码将不显示excel中的网格线:
Dim App As New MSExcel.Application
Dim Wb As MSExcel.Workbook = App.WorkBooks.Open("D:\Report.xls")
Dim Wd As MSExcel.Window = Wb.Windows(1) '表示当前工作簿窗口
Wd.DisplayGridlines = False '不显示网格
App.Visible = True
除了DisplayGridlines以外,其它常用的属性还有:
DisplayFormulas:是否显示公式
DisplayHeadings:是否显示列标行号
DisplayOutLine:是否显示分级显示符号
DisplayZeros:是否显示零值
DisplayHorizontalScrollbar:是否显示水平滚动条
DisplayVerticalScrollbar:是否显示垂直滚动条
DisplayWorkbookTabs:是否显示工作表标签
Visible:工作簿窗口是否可见
Zoom:设置显示比例,如:Wd.Zoom = 200 表示以200%的比例放大显示
GridlineColor:设置网格线颜色,如:Wd.GridlineColor = Rgb(255,0,0)
三、WorkSheet
WorkSheet代表一张工作表,它是WorkBook的下一级对象。WorkSheet是WorkSheets集合的成员。
1、引用工作表。引用工作表的方法有三种:
方法一:通过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("同期对比")
方法三:通过Sheets集合引用。每个WorkBook都有一个Sheets集合,包含工作簿内的所有工作表。
如以索引引用:Dim Ws As MSExcel.WorkSheet = Wb.Sheets(1)
如以名称引用:Dim Ws As MSExcel.WorkSheet = Wb.Sheets("同期对比")
2、重要属性
● Name:返回或设置工作表名称。
如,显示所有工作表名称:
Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("D:\Report.xls")
For Each Ws As MSExcel.WorkSheet In Wb.Sheets
MessageBox.Show(Ws.Name)
Next
App.Quit
再如,将第二个工作表的名称修改为“hhh”:
Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("D:\Report.xls")
Dim Ws As MSExcel.WorkSheet = Wb.Sheets(1)
Ws.Name = "hhh"
Wb.Save
App.Quit
● Visible:返回或设置工作表的显示状态。
如:Ws.Visible = False
● EnableAutoFilter:返回或设置工作表被保护时是否允许自动筛选。
● EnableOutlining:返回或设置工作表被保护时是否启用分级显示符号。
● EnablePivotTable:返回或设置工作表被保护时是否启用数据透视表控件和操作。
● EnableSelection:返回或设置工作表被保护时是否可以选定单元格。此为XlEnableSelection类型,共有三种值:
Ws.EnableSelection = MSExcel.XlEnableSelection.xlNoSelection '不能进行任何选定
Ws.EnableSelection = MSExcel.XlEnableSelection.xlNoRestrictions '允许选定任意单元格
Ws.EnableSelection = MSExcel.XlEnableSelection.xlUnlockedCells '仅允许选定未被锁定的单元格
● 获取工作表的保护状态:
ProtectionMode:是否保护用户界面,如:MessageBox.Show(ws.ProtectionMode)
ProtectContents:是否保护单元格内容
ProtectDrawingObjects:是否保护图表
ProtectScenarios:是否保护方案
Protection:返回其它保护属性,包括:
AllowFormattingCells:是否允许用户为受保护的工作表上的任意单元格设置格式。如:MessageBox.Show(ws.Protection.AllowFormattingCells)
AllowFormattingColumns:是否允许用户为受保护的工作表上的任意列设置格式。
AllowFormattingRows:是否允许用户为受保护的工作表上的任意行设置格式。
AllowInsertingColumns:是否允许用户在受保护的工作表上插入列。
AllowInsertingRows:是否允许用户在受保护的工作表上插入行。
AllowInsertingHyperlinks:是否允许用户在受保护的工作表中插入超链接。
AllowDeletingColumns:是否允许用户在受保护的工作表上删除列,要删除的列中的每个单元格都是解除锁定的。
AllowDeletingRows:是否允许用户在受保护的工作表上删除行,要删除的行中的每个单元格都是解除锁定的。
AllowSorting:是否允许用户在受保护的工作表上进行排序。排序区域中的每个单元格必须是解除锁定的或取消保护的。
AllowFiltering:是否允许用户在受保护的工作表上设置筛选。用户可以更改筛选条件,但是不能启用或禁用自动筛选功能。用户也可以在已有的自动筛选功能上设置筛选。
AllowUsingPivotTables:是否允许用户在受保护的工作表上使用数据透视表。
● FilterMode:判断工作表是否处于筛选模式
3、重要方法
● Add:新建工作表。
新建工作表有两个可选参数:Before和After,分别指定要增加的位置。如,下面的代码就是在“同期对比”表的后面,增加一个工作表,然后将表名称命名为“kkk”:
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets.Add(After:=Wb.WorkSheets("同期对比"))
Ws.Name = "kkk"
如果要在“同期对比”表的前面增加,只需将After改为Before。
● Copy:复制工作表。
复制工作表也可用Before和After指定复制位置。如不指定,将新建一个只包含指定工作表的工作簿。如:
Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("D:\Report.xls")
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets("同期对比") '指定要复制的工作表
With Wb.WorkSheets
Ws.Copy(After:=.Item(.Count)) '复制到最后面
Ws.Copy(Before:=.Item(1)) '复制到最前面
Ws.Copy '复制到一个新工作簿
End With
Wb.Save
App.Quit
● Move:移动工作表。
移动工作表可用Before和After指定移动位置。如不指定,将新建一个只包含指定工作表的工作簿。需要注意的是,当工作簿中只有一张工作表时是不能移动的。
● Delete:删除工作表。
在删除工作表时会弹出提示信息,因此可以将Application的DisplayAlerts属性设置为False来阻止信息框的显示。需要注意的是,当工作簿中只有一张工作表时是不能删除的。
● Protect:保护工作表。
Protect方法可以指定保护密码参数,该密码为一个区分大小写的字符串。如果省略本参数,不用密码就可以取消对该工作表的保护。如:
Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("D:\Report.xls")
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets("同期对比")
Ws.Protect(Password:="hhh") '以密码保护
Wb.Save
App.Quit
如果直接写为:Ws.Protect,则无需密码就能取消保护。除此以外,Protect中还可以使用以下参数:
DrawingObjects:是否保护图表。如:Ws.Protect(DrawingObjects:=True)
Contents:是否保护单元格内容。
Scenarios:是否保护方案。
UserInterfaceonly:是否保护用户界面,但不保护宏。如果省略本参数,则保护既应用于宏也应用于用户界面。
AllowFormattingCells:是否允许用户为受保护的工作表上的任意单元格设置格式。
AllowFormattingColumns:是否允许用户为受保护的工作表上的任意列设置格式。
AllowFormattingRows:是否允许用户为受保护的工作表上的任意行设置格式。
AllowInsertingColumns:是否允许用户在受保护的工作表上插入列。
AllowInsertingRows:是否允许用户在受保护的工作表上插入行。
AllowInsertingHyperlinks:是否允许用户在受保护的工作表中插入超链接。
AllowDeletingColumns:是否允许用户在受保护的工作表上删除列,要删除的列中的每个单元格都是解除锁定的。
AllowDeletingRows:是否允许用户在受保护的工作表上删除行,要删除的行中的每个单元格都是解除锁定的。
AllowSorting:是否允许用户在受保护的工作表上进行排序。排序区域中的每个单元格必须是解除锁定的或取消保护的。
AllowFiltering:是否允许用户在受保护的工作表上设置筛选。用户可以更改筛选条件,但是不能启用或禁用自动筛选功能。用户也可以在已有的自动筛选功能上设置筛选。
AllowUsingPivotTables:是否允许用户在受保护的工作表上使用数据透视表。
● UnProtect:撤销保护工作表。
如果在保护工作表时没有设置密码,则直接使用UnProtect即可;如果设置了密码,则需要在撤销保护工作表时指定保护密码,如:
Ws.UnProtect(Password:="hhh")
● Select:选定并激活指定的工作表。
● Activate:激活指定的工作表。需要注意的是,Activate是用来激活对象的方法,而Select是用来选取对象的方法。通过这两种方法得到的工作表都是活动工作表,另外,通过Add或Copy方法得到的工作表也一定是活动工作表。
四、Range
WorkSheet的下一级对象是Range,它可以是某个单元格、某一行、某一列或者多个相邻或不相邻的单元格区域对象。Range是Excel应用程序中使用最多的对象。在操作Excel的任何单元格区域之前,都要将其表示为一个Range对象,然后再使用该Range对象的属性和方法。
1、引用单元格
● 通过Range属性引用,这也是引用单元格最常用的方式,如:
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 Rg As MSExcel.Range
Rg = Ws.Range("A5") '引用单个单元格
Rg = Ws.Range("A3:B5") '引用连续的单元格区域
Rg = Ws.Range("A1:D8,A20:C25,F6:G10") '引用不连续的单元格区域
Rg = Ws.Range("B:B") '引用单列,也可以Columns引用。如:Rg=Ws.Columns("B"),或者 Rg=Ws.Columns(2)
Rg = Ws.Range("B:D") '引用连续的多列
Rg = Ws.Range("A:A,C:C,H:H") '引用不连续的多列
Rg = Ws.Range("5:5") '引用单行
Rg = Ws.Range("5:20") '引用连续的多行
Rg = Ws.Range("1:1,3:3,5:5") '引用不连续的多行
App.Quit
● 通过Cells属性引用某个单元格。
Cells(i,j)就表示第i行、第j列处的单元格。如果需要循环引用单元格区域的各个单元格,那么使用Cells属性是最方便的。如果没有指定具体的行号和列号,那么就代表引用整个工作表。如,Rg = Ws.Cells。
代码示例:下面的代码就是将第5-10行、6-20列的所有单元格内容替换为"abc":
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 Rg As MSExcel.Range
For i As Integer = 5 To 10
For j As Integer = 6 To 20
Rg = Ws.Cells(i,j)
Rg.Value = "abc"
Next
Next
App.Visible = True
● 通过Range和Cells联合引用单元格。
这种方法特别适合于单元格区域变化的场合。如:Rg = Ws.Range(Cells(1,1),Cells(5,3))
● 引用已经使用的单元格区域。
利用UsedRange属性,可以取得在指定工作表中已经使用的单元格区域。如下面的代码就将得到已经使用的行数、列数和单元格个数:
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 Rg As MSExcel.Range = Ws.UsedRange
MessageBox.Show(Rg.Rows.Count)
MessageBox.Show(Rg.Columns.Count)
MessageBox.Show(Rg.Count)
App.Quit
● 动态引用单元格。
方法一:利用Offset属性,以初始值所设定的单元格为起点,来相对移动任意的行或列,从而定位到新的单元格。下面的例子就是从目前的单元格A2开始,向下移动5行、向右移动3列,也就是定位到单元格D7,并显示新的单元格地址:
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 Rg As MSExcel.Range = Ws.Range("A2")
Rg = Rg.Offset(5,3)
MessageBox.Show(Rg.Address)
App.Quit
方法二:利用Resize属性,可以将单元格范围改变为指定的大小,并引用变更后的单元格区域。需要注意的是,在使用Resize属性更改区域范围时,行参数和列参数是区域的总行数和总列数。下面的例子就是以单元格区域A2:D4的左上角单元格A2为基准,将单元格区域变更为有6行、6列的单元格区域,即新引用的单元格区域为A2:F7。
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 Rg As MSExcel.Range = Ws.Range("A2:D4")
Rg = Rg.Resize(6,6)
MessageBox.Show(Rg.Address)
App.Quit
综合实例一:引用不包括标题行的单元格区域(假如标题在第1行):
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 Rg As MSExcel.Range = Ws.UsedRange '先指定所有已用区域
Rg = Rg.Resize(Rg.Rows.Count-1).Offset(1,0) '再将现有区域的行数减1然后下移1行
MessageBox.Show(Rg.Address)
App.Quit
综合实例二:引用不包括标题列的单元格区域(假如标题在第1列):
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 Rg As MSExcel.Range = Ws.UsedRange '先指定所有已用区域
Rg = Rg.Offset(0,1).Resize(,Rg.Columns.Count-1) '再将现有区域右移一列然后将列数减1
MessageBox.Show(Rg.Address)
App.Quit
● 引用整行或整行区域。
如:Rg = Ws.Rows("5") '引用第5行
Rg = Ws.Rows("5:6") '引用第5-6行
● 引用整列或整列区域。
如:Rg = Ws.Columns("B") '引用B列
Rg = Ws.Columns("B:F") '引用B-F列
● 引用某个单元格所在的整个行。
利用EntireRow属性,可以获取某个单元格所在的整个行。如:
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 Rg As MSExcel.Range = Ws.Range("C5").EntireRow
App.Quit
● 引用某个单元格所在的整个列。
利用EntireColumn属性,可以获取某个单元格所在的整个列。
2、重要属性
● Address:获取单元格或单元格区域的地址。
● Count:获取指定单元格区域内的单元格个数。
● Row:获取指定单元格的行号。以下代码可获取单元格区域的行号范围:
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 Rg As MSExcel.Range = Ws.UsedRange
Dim RowBegin As Integer = Rg.Cells(1).Row
Dim RowEnd As Integer = Rg.Cells(Rg.Count).Row
MessageBox.Show(RowBegin)
MessageBox.Show(RowEnd)
App.Quit
● Rows.Count:获取指定单元格区域内的行数。
● Column:获取指定单元格的列号。以下代码可获取单元格区域的列号范围:
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 Rg As MSExcel.Range = Ws.UsedRange
Dim ColumnBegin As Integer = Rg.Cells(1).Column
Dim ColumnEnd As Integer = Rg.Cells(Rg.Count).Column
MessageBox.Show(ColumnBegin)
MessageBox.Show(ColumnEnd)
App.Quit
● Columns.Count:获取指定单元格区域内的列数。
● Value:返回或设置指定单元格的值。如:
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 Rg As MSExcel.Range = Ws.Cells(1,1)
Rg.Value = 12345.88 '输入数字
Rg.Value = "abcde" '输入字符
Rg.Value = "'012345" '如要输入数字字符串,要在前面加上前缀字符"'"
Rg.Value = "2006/5/20" '输入日期
Rg.Value = "2006-5-20" '输入日期
Rg.Value = Cdate("2006年5月20日") '输入日期
Rg.Value = "10:30:20" '输入时间
Rg.Value = Cdate("10:30PM") '输入时间
App.Visible = True
● 通过Value和数组向单元格区域一次性输入多个数据。如:
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 Array As String() = {"a","b","c","d"} '定义数组
Dim Rg As MSExcel.Range = Ws.Range("A1:D1")
Rg.Value = Array '写入指定的单元格(如果具体值,则全部的单元格都写入一个相同值)
App.Visible = True
● 通过Value向单元格区域输入连续值(自增值)。如:
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 Rg As MSExcel.Range = Ws.Range("G1:G20") '指定单元格区域
Rg.Cells(1).Value = 10 '设定初始值
Rg.Cells(1).AutoFill(Rg,MSExcel.XlAutoFillType.xlFillSeries) '对指定区域生成自增值
App.Visible = True
同样的方式,可以实现其它内容的自增,如:
Rg.Cells(1).Value = "2009-10-10" '也可以设为"星期一"、"1月"等,则自动按星期和月份自增
Rg.Cells(1).AutoFill(Rg,MSExcel.XlAutoFillType.xlFillDefault)
如果在两个初始的单元格输入间隔某个数字的数据,还可以实现输入具有相同间隔的字符或数值,如:
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 Rg As MSExcel.Range = Ws.Range("G1:G20")
Dim Jg As MSExcel.Range = Ws.Range("G1:G2")
Jg.Cells(1).Value = 1
Jg.Cells(2).Value = 3
Jg.AutoFill(Rg,MSExcel.XlAutoFillType.xlFillDefault)
App.Visible = True
● 设置单元格的字体格式。
利用Font对象的Name等属性对单元格的格式进行设置。如:
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 Rg As MSExcel.Range = Ws.Range("A1")
Rg.Value = "FoxTable操控Excel全攻略"
With Rg.Font
.Name = "黑体" '字体
.Size = 20 '字号
.Bold = True '加粗
.Italic = True '斜体
.ColorIndex = 3 '颜色
End With
App.Visible = True
【其它设置】
上标。如,Rg.Font.Superscript = True
下标。如:Rg.Font.Subscript = True
下划线。如:
单下划线:Rg.Font.Underline = MSExcel.XlUnderlineStyle.xlUnderlineStyleSingle
双下划线:Rg.Font.Underline = MSExcel.XlUnderlineStyle.xlUnderlineStyleDouble
会计用单下划线:Rg.Font.Underline = MSExcel.XlUnderlineStyle.xlUnderlineStyleSingleAccounting
会计用双下划线:Rg.Font.Underline = MSExcel.XlUnderlineStyle.xlUnderlineStyleDoubleAccounting
取消下划线:Rg.Font.Underline = MSExcel.XlUnderlineStyle.xlUnderlineStyleNone
● 设置单元格字符串中一部分字符的字体格式。
利用Range对象的Characters属性,定位到要设置格式的字符,然后利用Font对其进行设置。Characters中的第一个参数为起始位置,第二个参数为字符长度。如,下面的代码就是对“FoxTable操控Excel全攻略”中的“操控”两字进行格式设置:
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 Rg As MSExcel.Range = Ws.Range("A1")
Rg.Value = "FoxTable操控Excel全攻略"
Dim Chr As MSExcel.Characters = Rg.Characters(9,2)
With Chr.Font
.Name = "黑体" '字体
.Size = 20 '字号
.Bold = True '加粗
.Italic = True '斜体
.ColorIndex = 3 '颜色
End With
App.Visible = True
需要说明的是,部分字符串同样可以设置上标、下标和下划线。
● 设置单元格区域的外部边框。
利用Range对象的BorderAround方法即可实现。这里有3个参数:
【LineStyle】边框的线型。可以为以下 XlLineStyle 值之一:
xlContinuous
xlDash
xlDashDot
xlDashDotDot
xlDot
xlDouble
xlSlantDashDot
xlLineStyleNone
xlNone
【Weight】边框粗细。可以为以下 XlBorderWeight 常数之一:
xlHairline
xlMedium
xlThick
xlThin
【ColorIndex】边框颜色。
测试代码:
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 Rg As MSExcel.Range = Ws.UsedRange
Rg.BorderAround(MSExcel.XlLineStyle.xlContinuous,MSExcel.XlBorderWeight.xlThick,4)
App.Visible = True
● 设置单元格区域的全部边框。
如果要设置单元格区域的全部边框,必须使用Border对象的有关属性。如下面的代码就是为已经使用的单元格全部加上边框:
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 Rg As MSExcel.Range = Ws.UsedRange
Rg.Borders.Linestyle = MSExcel.XlLineStyle.xlContinuous '边框线型
Rg.Borders.Weight = MSExcel.XlBorderWeight.xlThin '边框粗细
Rg.Borders.ColorIndex = 3 '边框颜色
App.Visible = True
除此之外,我们还可以为单元格有针对性的设置边框,它必须指定为XlBordersIndex枚举中的其中之一:
xlDiagonalDown:从区域中每个单元格的左上角至右下角的边框(斜下)。
xlDiagonalUp:从区域中每个单元格的左下角至右上角的边框(斜上)。
xlEdgeBottom:区域底部的边框(底边框)。
xlEdgeLeft:区域左边的边框(左边框)。
xlEdgeRight:区域右边的边框(右边框)。
xlEdgeTop:区域顶部的边框(上边框)。
xlInsideHorizontal:区域中所有单元格的水平边框,区域以外的边框除外(内部水平边框线)。
xlInsideVertical:区域中所有单元格的垂直边框,区域以外的边框除外(内部垂直边框线)。
如,下面的代码就仅为已经使用的单元格区域设置了内部水平边框线:
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 Rg As MSExcel.Range = Ws.UsedRange
With Rg.Borders(MSExcel.XlBordersIndex.xlInsideHorizontal)
.LineStyle = MSExcel.XlLineStyle.xlContinuous
.Weight = MSExcel.XlBorderWeight.xlThin
.ColorIndex = 3
End With
App.Visible = True
如要取消全部边框,则只需:Rg.Borders.Linestyle = 0
● 设置单元格的颜色和背景。
利用Range对象的Interior属性,可以设置单元格的填充颜色、背景图案和背景颜色等。如:
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 Rg As MSExcel.Range = Ws.UsedRange
With Rg.Interior
.ColorIndex = 3 '单元格填充颜色为红色
.Pattern = MSExcel.XlPattern.xlPatternCrissCross '单元格背景图案为十字图案
.PatternColorIndex = 6 '单元格背景颜色为黄色
End With
App.Visible = True
● 设置单元格的格式。
单元格格式是通过NumberFormat或NumberFormatLocal属性来完成的。如:
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)
Ws.Range("A1").NumberFormat = "G/通用格式" '通用格式
Ws.Range("B1").NumberFormat = "0_ " '数值
Ws.Range("C1").NumberFormat = "#,##0.00_);[红色](#,##0.00)" '货币
Ws.Range("D1").NumberFormat = "_ * #,##0.00_;_ * -#,##0.00_ ;_ * ""-""??_ ;_ @_ " '会计专用
Ws.Range("E1").NumberFormat = "yyyy-m-d" '日期
Ws.Range("F1").NumberFormat = "h:mm:ss" '时间
Ws.Range("G1").NumberFormat = "0.00%" '百分比
Ws.Range("H1").NumberFormat = "# ?/?" '分数
Ws.Range("I1").NumberFormat = "0.00E+00" '科学记数
Ws.Range("J1").NumberFormat = "@" '文本
App.Visible = True
可在上述代码执行完毕后,在相应的单元格中输入数据以查看格式效果。
● 设置单元格的对齐方式。
通常情况下,当单元格内的数据是文本时,数据自动左对齐;当单元格内的数据是数字时,数据自动右对齐。通过HorizontalAlignment属性可进行水平对齐设置,使用VerticalAlignment属性可进行垂直对齐设置。如:
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 Rg As MSExcel.Range = Ws.Range("A1")
Rg.Value = "FoxTable操控Excel全攻略"
Rg.HorizontalAlignment = MSExcel.Constants.xlRight '水平右对齐
Rg.HorizontalAlignment = MSExcel.Constants.xlLeft '水平左对齐'
Rg.HorizontalAlignment = MSExcel.Constants.xlCenter '水平居中
Rg.HorizontalAlignment = MSExcel.Constants.xlDistributed '水平分散对齐
Rg.HorizontalAlignment = MSExcel.Constants.xlGeneral '水平对齐恢复默认
Rg.VerticalAlignment = MSExcel.Constants.xlTop '垂直靠上
Rg.VerticalAlignment = MSExcel.Constants.xlBottom '垂直靠下
Rg.VerticalAlignment = MSExcel.Constants.xlCenter '垂直居中
Rg.VerticalAlignment = MSExcel.Constants.xlGeneral '垂直对齐恢复默认
App.Visible = True
● 设置单元格大小。
利用RowHeight属性和ColumnWidth属性可以设置单元格的大小。如:
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 Rg As MSExcel.Range = Ws.Range("A1:C1") '可指定任意单元格或单元格区域
Rg.RowHeight = 40 '行高40磅
Rg.ColumnWidth = 20 '列宽20磅
App.Visible = True
如果要恢复标准行高和标准列宽,可以这样:
Rg.RowHeight = Ws.StandardHeight
Rg.ColumnWidth = Ws.StandardWidth
● 缩小单元格内容以全部显示。
当单元格内的数据长度超过单元格宽度时,就会只显示一部分数据。使用ShrinkToFit属性,可将单元格内的数据缩小,以适应单元格,使内容全部显示出来。
如:Rg.ShrinkToFit = True
● 自动调整单元格大小以显示全部内容。
这个刚好与ShrinkToFit相反,它是自动调整单元格大小,使单元格能够显示全部数据。这需要用到AutoFit方法。如:
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 Rg As MSExcel.Range = Ws.Range("A1")
Rg.Value = "FoxTable操控Excel全攻略"
Rg.Font.Size = 50 '把字体放大
Rg.EntireColumn.AutoFit '自动调整列宽
Rg.EntireRow.AutoFit '自动调整行高
App.Visible = True
如果要调整工作表全部单元格的大小,可以使用Cells属性。如:
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 Rg As MSExcel.Range = Ws.Cells
Rg.EntireColumn.AutoFit '自动调整列宽
Rg.EntireRow.AutoFit '自动调整行高
App.Visible = True
● 锁定单元格(解除单元格锁定)。
利用Locked属性可锁定指定的单元格,也可解除锁定。需要注意的是,如果工作表没有被保护,即使将单元格设置为锁定状态,该单元格仍可以操作。只有在工作表被保护的情况下,锁定单元格才能起作用。如:
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 Rg As MSExcel.Range = Ws.Range("A1:A10") '指定任意单元格
Ws.Unprotect '撤销对工作表的保护
Ws.Cells.Locked = False '解除整个工作表所有单元格的锁定
Rg.Locked = True '锁定指定的单元格
Ws.Protect '保护工作表
App.Visible = True
3、重要方法
● Select:选定单元格或单元格区域。如:
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)
Ws.Select '在选定单元格之前,必须先选定工作表!!
Ws.Range("A1:A10").Select '选定单元格
App.Visible = True
● Goto:选定单元格,并滚动窗口直至目标区域的左上角单元格出现在窗口的左上角处。
注意,这是利用Application中的方法,测试代码:
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 Rg As MSExcel.Range = Ws.Range("P100:P105")
Ws.Select
App.Goto(Rg,True) '第2个参数用于决定是否滚动
App.Visible = True
● Activate:激活单元格。
需要注意的是,Activate是用来激活对象的方法,而Select是用来选取对象的方法。使用Select方法可以一次选取多个单元格区域,而Activate一次只能激活一个单元格。
如下面的代码中,即使将激活单元格区域修改为"B5:B8",但激活的单元格还是只有一个"B5":
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)
Ws.Select
Ws.Range("A1:D10").Select '选定单元格区域
Ws.Range("B5").Activate '激活单元格
App.Visible = True
● Merge:合并单元格。
利用Merge方法,或将MergeCells属性设置为True,都可以合并单元格。如:
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 Rg As MSExcel.Range = Ws.Range("A1:D10")
App.DisplayAlerts = False '加上此行可禁止弹出合并前的提示
Rg.Merge '合并指定区域的单元格
'Rg.MergeCells = True '用这种方式也可以合并
App.Visible = True
● UnMerge:取消合并单元格。
利用UnMerge方法,或将MergeCells属性设置为False,可将已经合并的单元格重新分解为独立的单元格。
如下面的代码就是先利用MergeArea属性判断某个单元格是否为合并单元格的一部分,然后再进行取消:
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 Rg As MSExcel.Range = Ws.Range("A1")
If Rg.MergeArea.Address = Rg.Address Then
MessageBox.Show("该单元格区域并不是合并后的单元格! ")
App.Quit
Else
App.DisplayAlerts = False '加上此行可禁止弹出合并前的提示
Rg.UnMerge '取消合并
'Rg.MergeCells = False '用这种方式也可以取消
App.Visible = True
End If
● Clear:清除单元格的全部信息。
本方法将清除单元格的全部信息(包括数据、格式、批注等等)。
● ClearContents:清除单元格的值。
本方法仅清除单元格的值,但保留其格式设置和批注等信息。
● ClearComments:清除单元格的批注。
● ClearFormats:清除单元格的格式。
● ClearNotes:清除单元格的批注和语音批注。
● Insert:插入单元格。在插入单元格时,可以设置单元格的移动方向。如:
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 Rg As MSExcel.Range = Ws.Range("A10") '以这个指定的单元格为基准
Rg.Insert(MSExcel.XlDirection.xlToRight) '将相应的单元格右移
App.Visible = True
其中,插入单元格的移动方向为XlDirection枚举,可为以下值之一:
xlUp:向上
xlToRight:向右
xlToLeft:向左
xlDown:向下
● 插入整行或整列。
利用Insert方法,同时结合EntireRow和EntireColumn属性,可插入整行和整列。如:
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 Rg As MSExcel.Range = Ws.Range("A10") '以这个指定的单元格为基准
Rg.EntireRow.Insert(MSExcel.XlInsertShiftDirection.xlShiftDown) '在基准单元格上面插入一行
Rg.EntireColumn.Insert(MSExcel.XlInsertShiftDirection.xlShiftToRight) '在基准单元格左边插入一列
App.Visible = True
其中,插入整行或整列的移动方向为XlInsertShiftDirection枚举,且只能为以下值之一:
xlShiftToRight
xlShiftDown
● Delete:删除单元格。在删除单元格时,可以设置单元格的移动方向(在删除某个单元格后,旁边的单元格会根据设置的单元格移动方向填补空缺)。如:
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 Rg As MSExcel.Range = Ws.Range("A10") '以这个指定的单元格为基准
Rg.Delete(MSExcel.XlDirection.xlUp) '下面的单元格上移
App.Visible = True
● 删除整行或整列。
利用Delete方法,同时结合EntireRow和EntireColumn属性,可删除整行和整列。如:
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 Rg As MSExcel.Range = Ws.Range("A10") '以这个指定的单元格为基准
Rg.EntireColumn.Delete(MSExcel.XlDirection.xlToLeft) '右面的单元格左移
App.Visible = True
● 删除多行或多列。
在删除多行或多列时,一样可以设置单元格的移动方向。如:
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 Rg As MSExcel.Range = Ws.Rows("1:3") '选定多行
Rg.Delete(MSExcel.XlDirection.xlUp) '下面的单元格上移
Rg = Ws.Columns("D:F") '选定多列
Rg.Delete(MSExcel.XlDirection.xlToLeft) '右面的单元格左移
App.Visible = True
● 删除工作表的全部单元格。如:
Rg = Ws.Cells
Rg.Delete
● Cut:移动单元格或单元格区域。
该方法有一个参数,用于指定要剪切到的目标区域。如果省略该参数,将把该区域复制到剪贴板。如下面的例子就是将单元格区域B1:C4
的数据移动到以单元格B3为左上角的单元格区域:
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 Rg As MSExcel.Range = Ws.Range("B1:C4")
Rg.Cut(Ws.Range("B3"))
App.Visible = True
● Copy:复制单元格或单元格区域。
该方法有一个参数,用于指定要复制到的目标区域。如果省略该参数,将把该区域复制到剪贴板。
五、Chart
Chart是Excel提供的对数据进行形象化和直观化处理的图表分析工具。
必须掌握的两个基本概念:
● ChartObject
ChartObject对象代表一个嵌入式图表,它的作用就是作为Chart对象的容器。每个ChartObject对象的属性和方法控制工作表上嵌入式图表的外观和尺寸,而ChartObjects则是指工作表中所有的嵌入式图表集合。如:
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) '指定工作表
MessageBox.Show(Ws.ChartObjects.Count) '返回所有嵌入式图表的数量
MessageBox.Show(Ws.ChartObjects(1).Name) '返回指定图表的名称
通过Add方法可新增一个空白的嵌入式图表。其句法为:
Add(Left, Top, Width, Height)
Left和Top是以磅为单位所指定的初始坐标,该坐标是相对于工作表上单元格“A1”左上角的坐标。
Width和Height是以磅为单位指定新对象的初始大小。如:
通过Delete方法可删除指定工作表中的所有嵌入式图表。如:
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 Co As MSExcel.ChartObject = Ws.ChartObjects.Add(100,30,400,250) '新增
Ws.ChartObjects.Delete '删除
App.Quit
● Chart
Chart为包含于ChartObject对象中的图表。如,引用Chart对象:
Dim Cht As MSExcel.Chart = Co.Chart
需要特别说明的是,以下介绍到的所有属性和方法中,除单独指出的以外,都是针对Chart的。
1、重要属性
● Visible:是否允许图表可见。
● ChartType:返回或设置图表类型,适用于Chart和Series对象。以下为XlChartType常量:
【柱形图】簇状:xlColumnClustered
三维簇状柱形图:xl3DColumnClustered
堆积柱形图:xlColumnStacked
三维堆积柱形图:xl3DColumnStacked
百分比堆积柱形图:xlColumnStacked100
三维百分比堆积柱形图:xl3DColumnStacked100
三维柱形图:xl3DColumn
【条形图】簇状条形图:xlBarClustered
三维簇状条形图:xl3DBarClustered
堆积条形图:xlBarStacked
三维堆积条形图:xl3DBarStacked
百分比堆积条形图:xlBarStacked100
三维百分比堆积条形图:xl3DBarStacked100
【折线图】折线图:xlLine
数据点折线图:xlLineMarkers
堆积折线图:xlLineStacked
堆积数据点折线图:xlLineMarkersStacked
百分比堆积折线图:xlLineStacked100
百分比堆积数据点折线图:xlLIneMarkersStacked100
折线图三维折线图:xl3DLine
【饼图】饼图:xlPie
分离型饼图:xlPieExploded
三维饼图:xl3Dpie
三维分离型饼图:xl3DPieExploded
复合饼图:xlPieOfPie
饼图复合柱饼图:xlBarOfPie
【XY(散点图)】散点图:xlXYScatter
平滑线散点图:xlXYScatterSmooth
无数据点折线散点图:xlXYScatterLinesNoMarkers
折线散点图:xlXYScatterLines
无数据点折线散点图:xlXYScatterLinesNoMarkers
【气泡图】气泡图:xlBubble
三维气泡图 xlBubble3DEffect
【面积图】面积图:xlArea
三维面积图:xl3DArea
堆积面积图:xlAreaStacked
三维堆积面积图:xl3DAreaStacked
百分比堆积面积图:xlAreaStacked100
三维百分比堆积面积图:xl3DAreaStacked100
【圆环图】圆环图:xlDoughnut
分离型圆环图:xlDoughnutExploded
【雷达图】雷达图:xlRadar
数据点雷达图:xlRadarMarkers
填充雷达图:xlRadarFilled
【曲面图】三维曲面图:xlSurface
曲面图(俯视图):xlSurfaceTopView
三维曲面图(框架图):xlSurfaceWireframe
曲面图(俯视框架图):xlSurfaceTopViewWireframe
【股价图】盘高-盘低-收盘图:xlStockHLC
成交量-盘高-盘低-收盘图:xlStockVHLC
开盘-盘高-盘低-收盘图:xlStockOHLC
成交量-开盘-盘高-盘低-收盘图:xlStockVOHLC
【圆柱图】簇状柱形圆柱图:xlCylinderColClustered
簇状条形圆柱图:xlCylinderBarClustered
堆积柱形圆柱图:xlCylinderColStacked
堆积条形圆柱图:xlCylinderBarStacked
百分比堆积柱形圆柱图:xlCylinderColStacked100
百分比堆积条形圆柱图:xlCylinderBarStacked100
三维柱形圆柱图:xlCylinderCol
【圆锥图】簇状柱形圆锥图:xlConeColClustered
簇状条形圆锥图:xlConeBarClustered
堆积柱形圆锥图:xlConeColStacked
堆积条形圆锥图:xlConeBarStacked
百分比堆积柱形圆锥图:xlConeColStacked100
百分比堆积条形圆锥图:xlConeBarStacked100
三维柱形圆锥图:xlConeCol
【棱锥图】簇状柱形棱锥图:xlPyramidColClustered
簇状条形棱锥图:xlPyramidBarClustered
堆积柱形棱锥图:xlPyramidColStacked
堆积条形棱锥图:xlPyramidBarStacked
百分比堆积柱形棱锥图:xlPyramidColStacked100
百分比堆积条形棱锥图:xlPyramidBarStacked100
三维柱形棱锥图:xlPyramidCol
● HasTitle:如果设置坐标轴或图表的标题可见,则为True。
本属性适用于Chart和Axis对象。其中,ChartTitle代表图表标题,AxisTitle代表坐标轴标题。
● ChartTitle:代表图表标题。
注意,只有将HasTitle属性设置为True后,才存在 ChartTitle对象,从而才能使用该对象。如:
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 Rg As MSExcel.Range = Ws.Range("A2:B18") '图表数据源
ws.ChartObjects.Delete '删除工作表上已经存在的图表
Dim Co As MSExcel.ChartObject = Ws.ChartObjects.Add(100,30,400,250) '创建图表对象
Dim Cht As MSExcel.Chart = Co.Chart
Cht.ChartType = MSExcel.XlChartType.xlLineMarkers '图表类型
Cht.SetSourceData(Rg,MSExcel.XlRowCol.xlColumns) '指定数据源和绘图方式
Cht.HasTitle = True
Cht.ChartTitle.Text = "测试图表标题"
With Cht.ChartTitle.Font '设置标题字体
.Size = 16
.ColorIndex = 3
.Name = "隶书"
End With
App.Visible = True
● HasAxis:返回或者设置指定图表中出现的坐标轴。
句法:HasAxis(Index1, Index2)。其中:
Index1,可选,表示坐标轴类型。可为下列XlAxisType常量之一:xlCategory、xlValue或xlSeriesAxis(xlSeriesAxis系列坐标轴仅应用于三维图表)。
Index2,可选,表示坐标轴组。可为下列两个XlAxisGroup常量之一:xlPrimary或xlSecondary(三维图表仅包含有关坐标轴集合)。
如果对图表类型或AxisGroup属性进行更改,可能会对坐标轴进行创建或删除。
如,显示图表中的主要值坐标轴:
Cht.HasAxis(MSExcel.XlAxisType.xlValue,MSExcel.XlAxisGroup.xlPrimary) = True
● HasLengend:是否显示图例。
● Legend:返回一个Legend对象,该对象代表指定图表中的图例。
如,下例将显示图例,并将图例的字体颜色设为蓝色:
With Cht
.HasLegend = True
.Legend.Font.ColorIndex = 5
End With
● HasDataTable:如果图表有数据表,本属性为True。
● DataTable:返回一个DataTable对象,该对象代表图表数据表。
例如,向内嵌图表添加带有分级显示边框的数据表,但无内部网格线:
With Cht
.HasDataTable = True
With .DataTable
.HasBorderOutline = True
.HasBorderHorizontal = False
.HasBorderVertical = False
End With
End With
● ChartArea:返回图表区域。
如:将图表区域的内部颜色设为红色,并将其边框颜色设为蓝色:
With Cht.ChartArea
.Interior.ColorIndex = 3
.Border.ColorIndex = 5
End With
● PlotArea:返回一个PlotArea对象,该对象代表图表的绘图区域。
如,将绘图区域的内部颜色设为淡青色:
Cht.PlotArea.Interior.ColorIndex = 8
● PlotBy:返回或设置行和列在图表中作为数据系列使用的方式。
可为下列XlRowCol常量之一:xlColumns或xlRows。如,使图表按列分布数据:
Cht.PlotBy = xlColumns
● PlotVisibleOnly:是否仅绘制可见单元格。当本属性为False时,所有可见单元格和隐藏单元格都绘制。
如,仅绘制可见单元格:
Cht.PlotVisibleOnly = True
● DisplayBlanksAs:返回或者设置图表中空白单元格的处理方式。
可为下列XlDisplayBlanksAs常量之一:xlNotPlotted、xlInterpolated或xlZero。
如,设置图表不绘制空白单元格:Cht.DisplayBlanksAs = MSExcel.XlDisplayBlanksAs.xlNotPlotted
● ProtectContents:本属性为True时,将保护整个图表。
● ProtectData:本属性为True时,将保护内嵌图表中的数据。如:
Cht.ProtectData = True
● ProtectFormatting:是否允许对图表元素进行添加、移动、调整大小或删除等操作。
● ProtectGoalSeek:是否允许用鼠标操作修改图表数据点。
● ProtectSelection:是否允许向图表添加形状。
● PageSetup:返回一个PageSetup对象,该对象包含指定对象的所有页面设置。
如,设置图表中央标题的文字:
Cht.PageSetup.CenterHeader = "December Sales"
2、重要方法
● SetSourceData:设置图表的源数据列。
句法:SetSourceData(Source,PlotBy)
其中:Source为Range类型,必需。该列包含源数据。
PoltBy,可选,指定划分数据的方法。可以是下列XlRowCol常量之一:xlColumns或xlRows。
如:Cht.SetSourceDataSource(Rg,MSExcel.XlRowCol.xlColumns)
● SetBackgroundPicture:为图表设置背景图形。
如:Cht.SetBackgroundPicture("d:\123.jpg")
● Axes:获取一个对象,该对象表示图表上的单个坐标轴。该对象是Axes集合的成员,可用Axes(Type, Group)返回单个Axis对象。
其中,Type指定要返回的轴,可为下列 XlAxisType 常量之一:xlValue、xlCategory或xlSeriesAxis(xlSeriesAxis仅对三维图表有效);
group为坐标轴组,可为下列XlAxisGroup常量之一: xlPrimary或xlSecondary。如果省略该参数,将使用主轴组(注意,三维图表只有一个坐标轴组)。
如:
With Cht.Axes(MSExcel.XlAxisType.xlCategory) '定义X轴
.HasTitle = True
.AxisTitle.Text = "时间序列" '添加标题
.HasMajorGridlines = True '显示主要网格线
.HasMinorGridlines = True '显示次要网格线
End With
With Cht.Axes(MSExcel.XlAxisType.xlValue) '定义Y轴
.HasTitle = True
.AxisTitle.Text = "销售量" '添加标题
.HasMajorGridlines = True '显示只要网格线
.HasMinorGridlines = True '显示次要网格线
End With
● SeriesCollection:返回一个对象,该对象既可代表单个系列(Series对象),也可代表图表中所有系列的集合(SeriesCollection对象)。
句法:SeriesCollection(Index)
其中,Index为可选项。Index设置为具体的数值时,表示单个系列;Index省略时,代表图表中所有系列的集合。
如,显示图表中第1个系列的数据标志:Cht.SeriesCollection(1).HasDataLabels = True
创建新系列并将其添加到图表中:Cht.SeriesCollection.Add(Ws.Range("B1:B19"))
得到数据系列数量:MessageBox.Show(Cht.SeriesCollection.Count)
测试代码:
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) '指定工作表
ws.ChartObjects.Delete '删除工作表上已经存在的图表
Dim Co As MSExcel.ChartObject = Ws.ChartObjects.Add(100,30,400,250) '创建图表对象
Dim Cht As MSExcel.Chart = Co.Chart
Dim Rg As MSExcel.Range = Ws.Range("A2:B18") '图表数据源
Cht.ChartType = MSExcel.XlChartType.xlLineMarkers '图表类型
Cht.SetSourceData(Rg,MSExcel.XlRowCol.xlColumns) '指定数据源和绘图方式
Cht.SeriesCollection.Add(Ws.Range("C2:C18")) '新增一个数据系列
Dim S As MSExcel.Series = Cht.SeriesCollection(Cht.SeriesCollection.Count) '引用新增的数据系列
S.ApplyCustomType(MSExcel.XlChartType.xlColumnClustered) '指定新增数据系列的图表类型
S.Interior.Color = RGB(255,0,0) '指定新增数据系列的颜色
App.Visible = True
● Paste:将剪贴板中的数据粘贴到指定的图表中。
如,Ws.Range("D2:D18").Copy
Cht.Paste '粘贴完成后,图表中将自动增加一个数据系列
● Points该方法适用于Series对象,返回该数据系列中的单个数据点或所有数据点的集合。
句法:Points(index),用于返回单个Point对象。系列中的数据点按从左至右的顺序编号,Points(1)为最左边的数据点,而Points(S.Points.Count)为最右边的数据点。
如:对图表上第一个数据系列的最后一个数据点应用数据标志:
Dim i As Integer = S.Points.Count
S.Points(i).ApplyDataLabels
● ApplyCustomType:将一个图表或系列设置为标准图表类型或自定义图表类型。本方法适用于Chart和Series对象。
句法:expression.ApplyCustomType(ChartType,TypeName)
其中:expression为Chart对象或Series对象;
ChartType是一种标准的图表类型(详见ChartType属性)。对于Chart对象,该参数也可为下列 XlChartGallery常量之一:xlBuiltIn、xlUserDefined或xlAnyGallery。
TypeName,可选值,仅对Chart对象使用。如果ChartType参数指定的是一个自定义图表库,则为自定义图表类型的名称。
示例:将“数据标记折线图”图表类型应用于图表:
Cht.ApplyCustomType(MSExcel.XlChartType.xlLineMarkers)
● ApplyDataLabels:将数据标志应用于图表中的某一数据点、某一数据系列或所有数据系列。本方法适用于Chart、Point或Series对象。
句法:expression.ApplyDataLabels(Type,LegendKey,AutoText,HasLeaderLines)
其中:expression为Chart、Point或Series对象。
Type:可选,表示数据标志类型。可为下列XlDataLabelsType常量之一:
xlDataLabelsShowNone:无数据标志。
xlDataLabelsShowValue:数据点的值(若未指定本参数,即使用此设置)。
xlDataLabelsShowPercent:总数的百分比,仅用于饼图或圆环图。
xlDataLabelsShowLabel:数据点所属的分类,这是默认值。
xlDataLabelsShowLabelAndPercent:占总数的百分比及数据点所属的分类,仅用于饼图或圆环图。
LegendKey:若指定为 True,则在数据点旁边显示图例标示。默认值为False。
Autotext:可选。若指定为True,则对象基于上下文自动产生合适的文本。
HasleadersLines:可选,适用于Chart和Series对象。若指定为True,则序列有前导字符线。
示例:对图表上的第一个数据系列应用分类标志:Cht.SeriesCollection(1).ApplyDataLabels(MSExcel.TXlDataLabelsType.xlDataLabelsShowLabel)
● ChartWizard:本方法可迅速设定图表格式,而不必逐个设置所有属性。
句法:ChartWizard(Source,Gallery,Format,PlotBy,CategoryLabels,SeriesLabels,HasLegend,Title,CategoryTitle,ValueTitle,ExtraTitle)
其中:Source,包含新图表的源数据区域。如果省略本参数,将修改处于选定状态的嵌入式图表。注意,如果当前选定对象不是活动工作表中的嵌入式图表,且省略了Source参数,执行本方法将失败并引起错误。
Gallery,指图表类型。可为下列 XlChartType 常量之一:xlArea、xlBar、xlColumn、xlLine、xlPie、xlRadar、xlXYScatter、xlCombination、xl3DArea、xl3DBar、
xl3DColumn、xl3DLine、xl3DPie、xl3DSurface、xlDoughnut或xlDefaultAutoFormat。
Format,内置自动套用格式的编号,可为从1到10的数字,其取值依赖于图库类型。如果省略本参数,将依据图库类型和数据源选择默认值。
PlotBy,指定系列中的数据是来自行还是来自列。可为下列XlRowCol 常量之一:xlRows 或 xlColumns。
CategoryLabels,表示包含分类标志的源区域内行数或列数的整数。有效取值为从0至小于相应的分类或系列中最大值的某一数字。
SeriesLabels,表示包含系列标志的源区域内行数或列数的整数。有效取值为从0至小于相应的分类或系列中最大值的某一数字。
HasLegend,若指定True,则图表将具有图例。
Title,图表标题文字。
CategoryTitle,分类轴标题文字。
ValueTitle,数值轴标题文字。
ExtraTitle,三维图表的系列轴标题,或二维图表的第二数值轴标题。
例如,重新设置图表的格式,将其改为折线图、添加图例,并添加分类轴标题和数值轴标题:
Cht.ChartWizard(Gallery:=MSExcel.XlChartType.xlLine,HasLegend:=True,CategoryTitle:="年", ValueTitle:="销量")
● Copy:将指定的图表对象复制到剪贴板。注意,这里的图表对象必须是ChartObject。如:
Co.Copy 'Co是ChartObject对象
Cht.Parent.Copy '先返回Chart的父级对象
● CopyPicture:将指定图表作为图片复制到剪贴板。注意,这里的图表对象必须是ChartObject。
句法:CopyPicture(Appearance)
其中:Appearance参数可选,用以指定图片的复制方式。可为下列XlPictureAppearance常数之一:xlScreen或xlPrinter。如果使用的是 xlScreen,图片将尽可能按照其屏幕显示进行复制;如果使用的是xlPrinter,图片将按其打印效果进行复制。默认值为xlScreen。
● Delete:删除图表。注意,这里的图表对象必须是ChartObject。
如:Co.Delete
● Export:将图表以某种图形格式导出。注意,这里的图表对象必须是Chart。
如:Cht.Export("D:\123.JPG")
3、三维图表中的特有属性(以下属性在二维图表上全部无效)
● Line3DGroup:返回一个ChartGroup对象,该对象代表三维图表中的折线图组。
如,设置图表的三维折线组,使其中的每一数据标记使用不同的颜色:
Cht.Line3DGroup.VaryByCategories = True
● Bar3Dgroup:返回一个ChartGroup对象,该对象代表三维图表中的条形图组。
如:设置三维条形图组的条形簇之间的距离等于条形宽度的一半:
Cht.Bar3DGroup.GapWidth = 50
● Column3Dgroup:返回一个ChartGroup对象,该对象代表三维图表中的柱形图表组。
如:设置三维柱形图组的柱形簇之间的距离等于柱形宽度的一半:
Cht.Column3DGroup.GapWidth = 50
● Area3Dgroup:返回一个ChartGroup对象,该对象代表三维图表上的面积图组。
如:为三维面积图表组添加垂直线:
Cht.Area3DGroup.HasDropLines = True
● Pie3Dgroup:返回一个ChartGroup对象,该对象代表三维图表中的饼图组。
如,设置图表中的三维饼图组,使其中的每一数据标记使用不同的颜色:
Cht.Pie3DGroup.VaryByCategories = True
● SurfaceGroup:返回一个ChartGroup对象,该对象代表三维图表中的曲面图组。
如,设置图表中的三维曲面图组,使其中的每一数据标志都使用不同的颜色:
Cht.SurfaceGroup.VaryByCategories = True
● RightAngleAxes:如果指定图表的坐标轴为直角,并与图表的转角或仰角无关,则为True。
本属性仅应用于三维折线图、柱形图和条形图。如果本属性设为 True,则自动忽略Perspective属性。如:
Cht.RightAngleAxes = True
● Perspective:返回或者设置三维图表视图的透视系数。必须为0-100之间的整数。
如果RightAngleAxes属性为True,可省略此属性。如,将Chart的透视系数设为70:
Cht.RightAngleAxes = False
Cht.Perspective = 70
● AutoScaling:如果要对三维图表进行缩放使其大小接近于等价的二维图表则设为True。
注意,RightAngleAxes属性必须设为True,此属性设置才有效。如:
With Cht
.RightAngleAxes = True
.AutoScaling = True
End With
● BarShape:返回或设置用于三维条形图或柱形图的形状。
可为下列 XlBarShape 常量之一:xlBox,xlConeToMax,xlConeToPoint,xlCylinder,xlPyramidToMax或xlPyramidToPoint。
如:设置用于第一个数据系列的形状:
Cht.SeriesCollection(1).BarShape = MSExcel.XlBarShape.xlConeToPoint
● Corners:返回一个Corners对象,该对象代表三维图表的角。
如,选定图表的角:Cht.Corners.Select
● DepthPercent:以图表宽度百分数的形式返回或者设置三维图表的深度(在20和2000之间)。
如,将图表的深度设置为其宽度的50%:Cht.DepthPercent = 50
● HeightPercent:以图表宽度比例(5到500之间)的形式返回或者设置三维图表的高度。
如,将图表的高度设为其宽度的80%:Cht.HeightPercent = 80
● GapDepth:以数据标记宽度的百分比形式返回或者设置三维图表中数据系列之间的距离,本属性的值必须在 0 和 500 之间。
如,将图表数据系列之间的距离设为数据标记宽度的200%:Cht.GapDepth = 200
● Elevation:以角度为单位返回或者设置三维图表视图的仰角。
图表仰角是指查看图表时视点所处的高度。对于大多数图表类型的默认值为15,该属性的值必须在-90和90 之间,但三维条形图的仰角值必须在0和44之间。
如,将图表的仰角设为34度:Cht.Elevation = 34
● Floor:返回一个Floor对象,代表三维图表的基底。
如,将图表的基底颜色设置为蓝色:Cht.Floor.Interior.ColorIndex = 5
● Rotation:以度为单位返回或设置三维图表视图的转角(图形区绕Z轴的转角),默认值为20。
本属性的取值必须从0至360(三维条形图从0至44)。如:Cht.Rotation = 30
● Walls:代表三维图表的背景墙。
如:Cht.Walls.Interior.Pattern = MSExcel.Constants.xlGray75
● WallsAndGridlines2D:如果在三维图表中绘制二维网格线,本属性为True。
六、打印输出
1、打印属性设置
利用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属性的设定值对工作表的缩放进行控制。
2、预览和打印
● PrintPreview:打印预览。执行该方法时,如果将参数设为False,则不允许在预览时进行打印设置。
如:Ws.PrintPreview(False)
注意,在执行打印预览时,必须先将Application的Visible设置为True!
● PrintOut:直接打印。如,Ws.PrintOut
该方法还可通过设置有关参数来控制打印,如下面的代码就是打印第1-10页,打印份数为3,打印前先预览,指定的打印机为"pdfFactory Pro":
Ws.PrintOut(From:=1,To:=10,Copies:=3,Preview:=True,ActivePrinter:="pdfFactory Pro")
3、换页打印
利用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
【End】
[此贴子已经被作者于2010-7-20 10:13:00编辑过]