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对象的最高层次。
常用属性
- Visible
隐藏Excel,就是将Application对象的Visible属性设置为False,从而使Excel本身不显示出来。如果要显示Excel,可将其显示为True。
例如在命令窗口执行下面的代码,就将自动打开并可见Excel程序:
Dim App As New MSExcel.Application
App.Visible = True
- Caption
默认情况下,Excel窗口标题就是所打开文件的文件名。
利用Caption属性可修改标题显示格式,例如:
Dim App As New MSExcel.Application
App.Visible = True
App.Caption = "标题修改试验"
- 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集合的成员。
常用方法
- Add
创建新的工作簿。如下面的代码,就将新建一个工作簿,该工作簿的第一个工作表的名称改为hhh,同时在A1单元格写入“hhh123”,然后保存为D:\123.xls。
Dim App As New MSExcel.Application
Dim Wb As MSExcel.Workbook = App.WorkBooks.Add
Wb.WorkSheets(1).name = "hhh"
Wb.WorkSheets(1).range("A1").Value = "hhh123"
Wb.SaveAs("d:\123.xls")
App.Quit
需要说明的是,在创建新工作簿后,该工作簿就成为活动工作簿。
- Open
打开现有工作簿。如:
Dim App As New MSExcel.Application
App.Visible = True
Dim Wb As MSExcel.Workbook = App.WorkBooks.Open("D:\report.xls")
- Save
保存工作簿,如:Wb.Save
- SaveAs
另存工作簿,如:Wb.SaveAs("D:\123.xls")
- Close
关闭工作簿,如:Wb.Close
注意,这种方法只是关闭了工作簿,并没有关闭Microsoft
Excel应用程序。如果要在关闭工作簿的同时关闭Excel程序,可以使用Application对象的Quit方法。
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开始的。
主要属性
- 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.WorkSheets
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.WorkSheets(1)
Ws.Name = "hhh"
Wb.Save
App.Quit
- Visible
返回或设置工作表的显示状态。如:Ws.Visible = False
主要方法
- 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
选定并激活指定的工作表,如:Ws.Select
Range
WorkSheet的下一级对象是Range,它可以是某个单元格、某一行、某一列或者多个相邻或不相邻的单元格区域对象。Range是Excel应用程序中使用最多的对象。在操作Excel的任何单元格区域之前,都要将其表示为一个Range对象,然后再使用该Range对象的属性和方法。
引用单元格
- 通过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列处的单元格,i、j都是整数。
如果没有指定具体的行号和列号,那么就代表引用整个工作表。如,Rg = Ws.Cells。
如果需要
按位置循环引用单元格区域的各个单元格,那么使用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联合引用单元格。
这种方法特别适合于单元格区域变化的场合。
例如下面的代码同样可以将第5-10行、6-20列的所有单元格内容替换为"abc":
Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("c:\abc.xls")
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(2)
Dim Rg As MSExcel.Range
Rg = Ws.Range(Ws.Cells(5,6), Ws.Cells(10,20))
Rg.Value = "abc"
App.Visible = True
- 引用已经使用的单元格区域。
利用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
- 引用整行或整行区域。
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属性,可以获取某个单元格所在的整个列。
主要属性
- 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
获取单元格区域内的行数,如:MessageBox.Show(Rg.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
获取单元格区域内的列数。如:MessageBox.Show(Rg.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
用于设置单元格的字体格式,例如:
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
需要说明的是,部分字符串同样可以设置上标、下标和下划线。
- 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
- Borders
用于置单元格区域的内部边框。
如下面的代码就是为已经使用的单元格全部加上边框:
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
- Interior
利用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
单元格格式是通过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
这两个属性用于设置单元格的对齐方式。
通常情况下,当单元格内的数据是文本时,数据自动左对齐;当单元格内的数据是数字时,数据自动右对齐。
通过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
这两个属性用于设置单元格大小,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
是否缩小单元格内容以全部显示。
当单元格内的数据长度超过单元格宽度时,就会只显示一部分数据。
使用ShrinkToFit属性,可将单元格内的数据缩小,以适应单元格,使内容全部显示出来。
如:Rg.ShrinkToFit = True
如果反过来,希望自动调整单元格大小,使单元格能够显示全部数据。这需要用到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
利用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
常用方法
- 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的方法,不是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 = 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("该单元格区域并不是合并后的单元格! ")
Else
App.DisplayAlerts = False '加上此行可禁止弹出合并前的提示
Rg.UnMerge '取消合并
'Rg.MergeCells = False '用这种方式也可以取消
End If
App.Visible = True
- 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提供的对数据进行形象化和直观化处理的图表分析工具。
提示:CaseStudy目录下有一个演示文件:Excel图表.Table,此文件演示了如何利用本节的内容直接生成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是以磅为单位指定新对象的初始大小
,如:
Dim App As New
MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("c:\abc.xls")
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(2)'指定工作表
Dim Co As MSExcel.ChartObject = Ws.ChartObjects.Add(100,30,400,250)'新增
app.Visible = True
通过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的。
主要属性
- 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
散点图: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"
主要方法:
- 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)
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)
Index用于指定数据点位置,系列中的数据点按从左至右的顺序编号,Points(1)为最左边的数据点,而Points(S.Points.Count)为最右边的数据点。
如对图表上第一个数据系列的最后一个数据点应用数据标志:
Dim i As Integer = S.Points.Count
S.Points(i).ApplyDataLabels
- ApplyCustomType
将一个图表或系列设置为标准图表类型或自定义图表类型。本方法适用于Chart和Series对象。
语法:
ApplyCustomType(ChartType,TypeName)
ChartType:标准的图表类型(详见ChartType属性)。对于Chart对象,该参数也可为下列
XlChartGallery常量之一:xlBuiltIn、xlUserDefined或xlAnyGallery。
TypeName: 可选值,仅对Chart对象使用。如果ChartType参数指定的是一个自定义图表库,则为自定义图表类型的名称。
例如将“数据标记折线图”图表类型应用于图表:
Cht.ApplyCustomType(MSExcel.XlChartType.xlLineMarkers)
- ApplyDataLabels
将数据标志应用于图表中的某一数据点、某一数据系列或所有数据系列。本方法适用于Chart、Point或Series对象。
语法:
ApplyDataLabels(Type,LegendKey,AutoText,HasLeaderLines)
Type:可选,表示数据标志类型。可为下列XlDataLabelsType常量之一:
- xlDataLabelsShowNone:无数据标志。
- xlDataLabelsShowValue:数据点的值(若未指定本参数,即使用此设置)。
- xlDataLabelsShowPercent:总数的百分比,仅用于饼图或圆环图。
- xlDataLabelsShowLabel:数据点所属的分类,这是默认值。
- xlDataLabelsShowLabelAndPercent:占总数的百分比及数据点所属的分类,仅用于饼图或圆环图。
LegendKey:若指定为 True,则在数据点旁边显示图例标示。默认值为False。
Autotext:可选。若指定为True,则对象基于上下文自动产生合适的文本。
HasleadersLines:可选,适用于Chart和Series对象。若指定为True,则序列有前导字符线。
例如对图表上的第一个数据系列应用分类标志:
Cht.SeriesCollection(1).ApplyDataLabels(MSExcel.TXlDataLabelsType.xlDataLabelsShowLabel)
- Delete
删除图表。注意,这里的图表对象必须是ChartObject。
如:Co.Delete
- Export
将图表以某种图形格式导出。注意,这里的图表对象必须是Chart。
如:Cht.Export("D:\123.JPG")
三维图表中的特有属性:
- 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。
打印输出
利用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属性的设定值对工作表的缩放进行控制。
预览和打印
- 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")
换页打印
利用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