使用c开发excel插件(第2章深入excel)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用c开发excel插件(第2章深入excel)
关于excel的功能相信大家都比较了解,而且介绍如何使用excel 的书籍在市场也是随处可见,这里就不再多说了。
这里要着重深入了解一下Excel的内部组织结构,常用数据结构等等。
2.1、Excel组织结构
Excel 中文档就是工作簿,每个工作簿中又包含多个工作表,图表以及宏模块。
工作表是保存数据的第一级结构,每个工作表是一个二维表格,其中中包含许216行28列共65536个单元格,工作表中还包含公式,图表等等。
而单元格中又含有格式,字体,颜色等信息。
任何一个工作簿都可以作为一个模板(*.xlt)保存起来,以作为以后新建的工作簿的样板。
模板中可以包含以下一些信息:u 单元格格式
u 自定义菜单,宏,和工具条
u 自定义的每个工作簿中的工作表的数量和类型
u 页码格式
u 行和列的风格
u 自定义文本,日期,公式,图表等等
通常默认的工作簿模板为Book.xlt,默认的工作表模板是Sheet.xlt。
你也可以把一个含有宏的工作簿保存为Excel加载宏(*.xla),以便为你的Excel增加功能。
下面是Excel各部分的结构图:
但是这个表对我们实现Excel插件并没有多大用处,我们需要知道更详细的关于Excel内部对象之间的关系。
Excel 5中有128个不同的对象,每个对象都代表着excel的一个独特的特性,每个对象都有唯一
的属性和方法,通过vba或c++可以调用这些属性和方法。
属性代表着对象的某个特性,可以获得某个属性,也可以改变部分属性。
方法则是这个对象的功能,通过调用对象的方法,可以执行一些特定的操作。
比如删除工作表等等。
在excel中对象有两种不同的形式,一种是单个对象,它代表唯一的一个实例,比如Application对象只代表一个excel实例。
另一种是对象集,excel中的许多对象都是代表一个集合,比如Wroksheets
对象就代表工作表集合。
你可以直接操作对象集来操作集合中的所有成员,也可以通过索引编号或名字操作集合中的某个对象。
Excel 中的对象并不都存在于同一级中,在引用时需要逐级引用。
所以对于开发人员来说牢记它们之间的引用关系是非常有必要的。
在最顶层是Application对象,即Excel本身,其次是第二层,这一层中包含Workbook、Addin、Debug、Dialog、Menubar、T oolbar、Window共7个对象,这几个对象都比较直观,而且都体现在Excel 界面上了,其余对象分别位于它们之下。
在下面的图例中可以看到所有对象之间的层次关系。
看到这个图你是否觉得不够128个对象呢,其实这个图只是列出了所有典型的对象,对于有些像Font,Bonder等对象在大多对象中都存在,就没有全列出来。
通过这个引用关系图我们就可以知道如何引用其中的某个对象了。
例如我们要通过Range对象引用第一个单元格,并为它赋值,可以写成这样:
Application.Workbooks(1).Worksheets(1).Range(“A1”).Val ue = 1;
意思是为第1个工作簿的第1个工作表的“A1”单元格赋值为1。
我了更直观的说明对象,我们在这一章中的例子使用VBA代码格式。
2.1.1顶层对象(Application Object)
在Excel中最顶层只有包含一个对象,那就是Application Object,这个对象就是指Excel应用程序本身,所以也可以认为Application对象的属性代表着整个excel程序的环境,改变了它的属性就改变了其他对象所处的环境。
通过这个对象就可以改变或获得Excel应用程序本身的属性,它自身有100多个属性,约60个方法。
我们只简单的介绍几个以说明如何使用Application对象。
常用属性:
Capiton属性:用于设置Excel标题栏的内容,通常标题栏里显示当前编辑的文件的文件名等,通过这个属性就可以自定义标题栏的内容。
Application.Capiton = “My Custom Application”
DisplayAlerts属性:如果DisplayAlerts的属性设置为True,则显示警告信息,否则不显示。
Application.DisplayAlerts =False
Path属性:Path属性中保存着Excel的安装路径,如果你要查找Excel安装目录下的某个文件时,就可以先调用它来获得正确的安装路径。
ExcelPath = Applicaton.Path
ScreenUpdating属性:用于设置在宏执行时是否刷新Excel窗口的内容,如果设置为True则刷新,否则不刷新。
默认值为True。
Application.ScreenUpdating = False
WindowState属性:用来设置Excel窗口的显示状态,它可以接
收以下三种状态值:
xlNormal 普通状态,通常为默认值
xlMaximized 窗口最大化。
xlMinimized 窗口最小化。
Application.WindowState = xlNormal
常用方法:
Calculate:这个方法强制所有打开的工作簿中的所有工作表中的公式都重新计算。
不用提供任何参数。
Application.Calculate
Help:打开指定的Help文件,并显示指定的帮助内容,需要传递两个参数:
第一个为帮助文件路径,第二个为要显示的帮助的ID值。
Application.Help
helpFile:=”Mainxl.hlp”,helpContextId:=100
Quit:调用这个函数将关闭Excel应用程序,但是如果DisplayAlerts属性被设置为False则在退出时不提示用户保存文件。
此函数无参数。
Application.Quit
Run:通过这个函数可以执行自定义的宏,它的参数数量随所执行的宏的参数变化,第一个参数是宏名,其余为这个宏所需要的参数。
Application.Run
macro:=”OldMacro”,arg1:=100,arg2:=”Revenue”
Application.WindowState = xlNormal
常用方法:
Calculate:这个方法强制所有打开的工作簿中的所有工作表中的公式都重新计算。
不用提供任何参数。
Application.Calculate
Help:打开指定的Help文件,并显示指定的帮助内容,需要传递两个参数:
第一个为帮助文件路径,第二个为要显示的帮助的ID值。
Application.Help
helpFile:=”Mainxl.hlp”,helpContextId:=100
Quit:调用这个函数将关闭Excel应用程序,但是如果DisplayAlerts属性被设置为False则在退出时不提示用户保存文件。
此函数无参数。
Application.Quit
Run:通过这个函数可以执行自定义的宏,它的参数数量随所执行的宏的参数变化,第一个参数是宏名,其余为这个宏所需要的参数。
Application.Run
macro:=”OldMacro”,arg1:=100,arg2:=”Revenue”
2.1.2、Wrokbooks对象
Workbooks对象处在Application对象之下,Workbook是Excel的文档,也可以看作是格容器,它里面包含了多个用于编辑的工作表。
Workbook保存在磁盘上有两种文件格式,一个是.xls文件,就是通常的excel保存的文件。
一个是xla文件格式,这种文件是excel 加载宏文件,它里面可以包含VBA程序。
.xla文件容许你的程序代码和用户是分离的,这样可以避免用户无意的修改。
常用属性:
Name属性:Name属性是指workbook的名字,通常这个属性
保存着这个工作簿的文件名,而且这个属性不容许直接修改,如果你要改变它,必须用SaveAs把工作簿保存成你想要的名字。
WrokbookNmae =
Path属性:这个属性保存着工作簿的文件路径。
WorkbookPath = ActiveWorkbook.Path
Saved属性:Saved属性表示对工作簿所做的修改是否都被保存了,如果为True则所有修改都被保存了。
If Not(ActiveWorkbook.Saved) Then
ActiveWorkbook.Save
End If
常用方法:
Activate:激活Workbook窗口。
Workbooks(“book1.xls”).Activate
Close:关闭工作簿,参数如下:
saveChanges 如果为True则在关闭时保存,否则关闭时不保存。
fileName 要保存的的工作簿的目的文件名。
routeWorkbook 如果为True则在关闭前发送邮件。
ActiveWorkbook.Close saveChanges:=False
Protect:设置工作簿为保护状态,以使用户不能修改。
参数含义如下:
Password 工作簿的密码。
Structure 如果为True则工作簿的结构受到保护。
Windows 如果为True则工作簿窗口受到保护。
Workbooks(1).Protect “password”,True,True
Save:保存工作簿,参数是文件名。
ActiveWrokbook.Save
2.1.3、Worksheet对象
Worksheet是个功能强大的2维表格,每个表格都可以接收任意类型的数据,而且Worksheet提供了大约400个函数,通过这些数据可以非常快速的计算各种数据,包括存储,计算,查找,分析等等,所以许多人把excel当作小型的数据库使用。
常用属性:
Index:表示工作表在所有工作表中的位置索引。
= “WkSheet” & ActiveSheet.Index
Name:表示工作表的名字。
Worksheets(1).Name = “My Worksheet”
UsedRange:表示工作表中的已使用的单元格的范围。
Dim Range1 As Range
Set Range1 = Worksheets(1).UsedRange
Visible:表示工作表是否显示。
如果为True则显示,否则False。
Worksheets(“Main”).Visible = xlVeryHidden
常用方法:
Activate:激活工作表
Worksheets(“My Worksheet”).Activate
Calculate:强迫工作表中所有单元格数据都从新计算。
Worksheets(1).Calculate
Delete:删除工作表。
Worksheets(“My Worksheet”).Delete
Protect:设置工作表为保护状态。
参数如下:
Password 密码字符串。
drawingObjects 如果为True,所有图形对象受保护。
Contents 如果为True则单元格受保护。
Scenarios
2.1.4、Range对象
Range对象用来表示工作表中的一个或多个单元格,它是单元格的集合。
通过Range对象可以访问超过400多个excel函数,也可以调用vba函数,甚至可以建立与其他单元格之间的关系。
所以有了Range对象,我们就可以建立功能强大的分析程序。
常用属性:
Count:返回Range对象中所包含的单元格数量。
NumOfCells =Worksheets(1).UsedRange.Count
Name:表示一个Range对象的名字。
Worksheet(1).Range(“A1”).Name = “FirstCell”
Value:表示Range对象的值,如果Range对象包含多个单元格,则此属性表示的是个数组。
Worksheets(1).Range(“FirstCell”).Value= 1
常用方法:
Calculate:强制Range对象中包含的所有单元格重新计算。
Worksheet(1).Range(“A21:F20”).Calculate
ClearContents:清除Range对象中所有单元格中的值。
Worksheets(1).Range(“A1:F20”).ClearContents
Copy:复制Range对象的值到剪切板或到其他Range对象中。
参数:
Destination目的对象,如果不设置目的参数,则复制到剪切板。
Worksheets(1).Range(“A1”).Copy
2.2、引用单元格或区域
引用的作用在于标识工作表上的单元格或单元格区域,并指明公司中所使用的数据的位置。
通过引用,可以在公式中使用不同部分的数据。
通过引用,可以在公式中使用工作表不同部分的数据,或者在多个公式中使用同一单元格的数据。
还可以引用同一工作簿不同工作表的单元格、不同工作簿的单元格、甚至其它引用程序中的数据。
引用不同工作簿中的单元格称为外部引用。
引用其它程序中的数据称为远程引用。
在excel中有两种引用样式:A1和R1C1引用样式。
A1引用样式:在默认情况下,Excel使用A1引用类型。
这种类型引用字母标志列(从A到IV,共256列)和数字标志行(从1到65536)。
这些字母和数字被称为行和列的标题。
如果要引用单元格,须顺序输入列字母和数字。
例如,D50引用了列D和行50交叉处的单元格。
如果要引用单元格区域,须输入区域左上角单元格的引用、冒号(:)和区域右下角单元格的引用。
下面是引用的示例。
图2.2 A
下面我们列出了常见的几种使用A1引用的例子
R1C1引用样式:即用行数和列数来表示单元格,R代表行(Row),C代表列(Column)。
R1C1引用样式对于计算位于宏内的行和列非常有用。
而且当录制宏时,Excel也使用R1C1应用样式录制宏命令,而不是使用A1引用样式。
但是这并不代表A1样式不能完全代表R1C1样式,R1C1能表示的A1样式同样也能表示。
只是,在宏里使用R1C1更容易些。
对单元格的应用分为绝对引用和相对引用,在创建公式时,单元格或单元格区域的引用通常是相对包含公式的单元格的相对位置,并且在复制包含相对引用的公式时,Excel会自动调整公式中的引用,以便引用相对于当前公式位置的其它单元格。
例如在图2.2A中,单元格F2中包含公式=SUM(B2:E2),当把F2单元格复制到F3单元格时,F3单元格中的公式被Excel修改成=SUM(B3:E3)。
但是如果我们不希望Excel调整引用,就可以使用绝对引用。
绝对引用是在引用前加上$符号,比如$B$3表示对B3单元格的绝对引用。
这个写法看起来挺麻烦,幸好Excel可以通过F4键使公式在相对引用和绝对引用之间切换。
如果你要切换引用就选中包含公式的单元格,并在公式编辑栏里选中你要更改的引用,然后按F4键即可。
Excel会以一定顺序进行切换:绝对列与绝对行(例如,$C$1);相对列与绝对行(C$1);绝对列与相对行($C1);相对列与相对行(C1).
使用上面所说的引用方式固然可以表示任意单元格和区域。
但在实际中有时我们需要更直观的引用方式,比如在上面图2.2A的表格中如果我们能够用=SUM(类型1)来计算所有“类型1”的产品的数量,岂不是比=SUM(B2:E2)更容易理解。
这就是标志和名称,工作表每列的首行和每行的最左列通常含有标志以描述数据。
在公式中可以使
用这些标志来引用相应的数据。
当然你也可以不用工作表中的标志,而用描述性的名称来代表单元格、单元格区域、公式和常量。
在默认情况下,excel不会识别公式中的标志。
如果要在公式中使用标志,点击菜单“工具/选项”,在“重新计算”选项卡中选中“接受公式标志”复选框。
注意:标志默认使用的是相对引用,而名称使用的绝对引用。
2.3、单元格中的数据类型
从用户角度来看,excel单元格可以接受的数据类型不外乎以下几种:
u 数字类型,包括整数,小数等等
u 布尔类型,包括TRUE和FALSE
u 字符串
u Excel错误代码,包括##### 错误,#VALUE! 错误,#DIV/O! 错误,#NAME? 错误,#N/A 错误,#REF! 错误,#NUM! 错误,#NULL! 错误等。
u 由上面类型组成的一个数组。
有时excel的函数在计算时会返回一些其它数据类型,比如单元格的引用之类,但在显示时单元格仍会把它转换成上面的几种类型。
当然你也可以通过设置单元格的数据格式来改变转换方式。
例如,单元格中原数据为6.8,通过设置,把这个单元格格式改为整型数值,则单元格中显示为7。
下面表格中显示了excel单元格中能表示的数据类型和其范围。
当你使用公式可能会出现错误,此时Excel会显示一个错误代码,
了解这些代码的含义有助于查找错误的原因,下面我们列出了这些代码的含义:
2.4、公式中对单元格的引用
Excel会根据实际需要把对单元格的引用转换成对应单元格中的数据。
比如如果你在一个单元格中输入公式=SUM(A1,B2),A1中有数值123,而B2中有字符串456,Excel将会把对A1单元格的引用转换成数值123,而把对B1中字符串的引用也转换成数值456,然后的得到公式的值579。
但有时不是这样,对于公式=ROW(B9),则返回的是B9单元格的行号。
公式中也可以直接使用单元格区域作为参数,比如=SUM(A1:C3),对单元格的引用也有多种方式,在单元格引用概念中有一个很重要的概念就是三维引用,这种引用在分析同一工作簿中多张工作表中的数据时就显得非常有用,三维引用工作表名称,单元格或区域引用。
下面的表格将列出常见的几种饮用方式:
1、在excel中引用含有非数值的单元格时,值不被转换,且当作0处理。
例如A1中是123,B2中是“456”则公式=SUM(A1,B2)
的值为123,但是如果写成=SUM(A1,“456”),值就成了579了。
2、当引用的其它工作簿是关闭的,则在引用时必须使用工作簿的完整路径,且如果名字中含有空格则应用单引号括起来。
例如:='C:/Documents and Settings/wxy/My Documents/[testBook1.xls]Sheet1'!A1
2.5、在公式中使用运算符
Excel中定义了常用的运算符,通过这些运算符可以直接处理一些简单的计算,也可以把它们和其他公式结合起来处理更复杂的业务。
和我们在数学中用到的运算符号一样,在excel中运算符同样有优先级别,也可以通过圆括号改变运算符的优先级,但在excel中只能使用圆括号。
Excel支持的运算符和优先级定义如下:
假设A1中是15,B2中是21,在C3中输入示例。