ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 10765|回复: 27

XLL文档翻译

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-6-5 13:32 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:插件开发
EXCEL 的二次开发技术除了VBA,还有XLL、NET、COM 等,其中XLL是最底层的开发技术,它可以让用户创建属于自己的公式,性能方面也是最优秀,但开发难度相比VBA 而言大了一点。而且网上这方面的资料也比较少,其实 XLL SDK 本身提供了一个 CHM 文档和示例项目。但由于是英文的,很多同学看起来还是有一定的难度,为此,本人将利用业余时间,把它翻译出来。由于翻译一个高质量的东西,除了具备英语读写能力外,对中文的表述能力要求也比较高,本人语言成绩一直不大好,翻译过程中表述上面可能会有一点问题,但基本意思,我想大家还是看得懂的。翻译过程中,如果有什么好的想法和建议,欢迎留言,谢谢。

每个EXCEL版本都有自己对应的XLL SDK,这里我将使用 2007 版的,因为这个版本,平常用得比较多,它最大的优势在于,只需要 注册码,就可以使用,而不需要破解程序。  对需要破解程序,我还是比较讨厌的,破解程序是系统安全的潜在威胁。

下面进入正题吧,今天先翻译了介绍部分,CHM 的原始文档,大家可以在 微软公司的下载中心下载。下载地址:

http://www.microsoft.com/en-us/download/details.aspx?id=20168

QQ图片20160605132857.png

==================================
Excel 2007 XLL SDK 文档
==================================
Excel 2007 XLL SDK 帮助你掌握使用 C-API 创建 DLL 外接程序的相关技术。C-API 可以使 DLL 与 Excel 2007 紧密集成并调用 Excel 的内部功能。这种DLL 程序称之为 XLL。
Excel 2007 XLL SDK 包含一个框架库,帮助用户快速编写出XLL程序,此外它还拥有一个示例项目。
----------------------------------------
入门指南
----------------------------------------
欢迎使用 Excel 2007 XLL SDK 文档,此文档包含 概念描述、编程任务和实例文件。
SDK中包含以下内容:
C-API:它包含了可以使用 DLL 访问 Excel 2007 功能的头文件和源文件。以及允许 DLL 与 外接程序管理器 共同工作的接口描述。
Visual Studio 项目:包含C-API示范源码,示范并展示了你所能执行的操作,你也可以将示范文件作为 外接程序 开发的起点。
SDK 文档包含以下部分:
1.Excel 2007 XLL SDK 指南
2.开发 Excel 2007 XLL
3.SDK API 函数参考
==================================
使用 Excel 2007 中的 C-API 开发程序
==================================
你可以使用 Excel 2007 XLL SDK 和 C-API 创建高性能的 Excel 2007 工作表功能。升级到Excel 2007 C-API 对持续性支持第三方或内部功能是很重要的。
----------------------------------------
Excel 程序编写接口
----------------------------------------
Excel 提供了几个开发应用程序的选择。在Excel早期版本中,我们使用以下几个程序编写接口:
【XLM 宏语言】 它是第一个 Excel 功能扩展语言,是C-API的基础。尽管在 Excel 2007 中仍然提供支持。XLM 长期以来都被 VBA 取代。人们更喜欢使用VBA。
【C-CPI 和 XLL】 集成到 Excel 中的DLL,为添加高性能的工作表功能,提供更直接和快速的编程接口。尽管与后面的技术相比,它更为复杂。
【VBA】 VB 代码对象与 Excel 工作表对像之间紧密联系,允许进行事件俘获、自定义 和 添加用户定义功能和命令。VBA 是在扩展 Excel 功能时最常使用的和最易于获得的选择。
【COM】 互操性标准是Windows的基础应用。通过Excel暴露出来的事件和对象,VBA 使用 COM 访问 Excel。Excel 输出 COM 类型库,使用户可以使用C++ 创建 COM 应用程序,从外部控制Excel。
【.NET Framework】 多语言托管代码环境被设计用于快速分布式的应用程序开发,其主要开发语言是 C#,然后,很多语言都可以编译为 .NET 中间语言(Internediate Language 简称:IL)。Excel 2002 和 这之后的版本都可以使用包含在 .NET 组件中的代码资源。
==================================
什么时候使用 C-API
==================================
使用 C-API 编写 XLL 的主要原因,是因为它可以创建高性能的工作表函数。尽管 XLL 函数常被称为 用户定义函数,但掌握使用编写XLL的方法和技巧需要花费很多的时间,这对大多数用户来说是不切实际的。尽管如此,在Excel 2007中创建高性能的应用 ,使用多线程接口,到使用强大的服务器资源,这些特性足以让它成为我们扩展Excel 功能时的重要选择。
伴随 Excel 2007 的 C API 版本主要涉及与高性能计算相关的内容,而不是用户界面特性。
------------------------------------
编写高性能用户定义工作表函数
------------------------------------
当你通创建XLL外接程序,获取高性能工作表功能时,Excel C-API 是一个理想的选择。C-API 可以让你直接访问工作表数据。它还支持直接访问 DLL 资源。通过添加新的数据类型,让 Excel 2007 进一步提高 XLL 性能,最重要的一点在于支持多线程特性。
使用XLL是有代价的:C-API 没有 VBA、COM或 .NET Framework 高级快速软件开发特性。内存管理是底级别的的,因此开发人者必需足够细心。很多Excel 特性经由COM提供,它们可以通过 VBA 和 .NET 获取,而不使用 C-API 来处理。
------------------------------------
使用 XLL 工作表函数访问多线程服务
------------------------------------
在Excel 2007中,多线程的重新计算(MTR),可以让你创建线程安全的工作表功能,你可以使用这些功能访问多线程服务,后面的部分会更详细的描述如何显著的增加用户观察到的性能。Excel 用户 有些时候需要更强大的处理能力,通过整合XLL ,使用 MTR 和 强大的计算服务 可以为我们提供了高性能的解决方案。
------------------------------------
定制 Excel 用户界面
------------------------------------
在很多版本的Excel中 C-API 不是定制用户界面的最好选择,VBA 在访问 Excel 对象和事件时更为优秀。Excel 2007 中的用户界面与早期版本相比,外观和采用的技术有明显的不同。使用托管代码资源定制Excel 2007界面是最好的选择。
------------------------------------
创建可以在网络上访问的应用
------------------------------------
Excel 服务,Office 2007 发行版本为用户提供了一种十分方便的手段,让可以通过标准Web浏览器工具,访问工作薄的Excel功能。连同 .Net 开发语言和资源,这些技术将是用户部置Excel时十分重要的组成部分。
------------------------------------
从外部应用程序控制Excel
------------------------------------
Excel 通过 COM 接口暴露了它的对象、方法和事件。因此你可以使用 COM 创建 独立的应用,这些应用可以启动和控制 Excel 会话,以及控制已有的Excel 会话。你可以几种开发语言中访问 COM 暴露出来的 Excel 接口。这些语言包括 C++、VBA、C# 。 .NET Framework 同样支持的Excel的接口,它可以远程访问和控制 Excel。

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-6-5 15:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
支持,赞一个!

TA的精华主题

TA的得分主题

发表于 2016-6-5 19:54 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-6 10:08 | 显示全部楼层
本帖最后由 c001q 于 2016-6-6 10:09 编辑

======================
Excel程序编写概念
======================

此部分提供了关于 Excel 命令和函数的相关信息,Excel 状态,工作表和表达式求值,激活 VS 自身工作表和工具表参数。

本部分包含:

-- Excel 命令、函数 和 状态
-- Excel 工作表和表达式求值
-- 工作表参考
-- Excel 使用的数据类型
-- Excel 重新计算
-- 怎样在Excel中访问DLL


------------------------------------------
Excel 命令、函数 和 状态
------------------------------------------
Excel 有两种完全不同的 添加功能命令类型:命令 和 函数


命令
-----
在Excel中,命令拥有以下特点:

* 命令使用相同的方式执行用户需要的操作
* 命令可以执行用户可以做的任何事情,例如,变更Excel设置,打开,关闭,编辑文档、启动重新计算,等等。
* 当某事件发生时,可以调用命令。
* 命令可以为用户显示对话框
* 命令可以链接到控件对象,当在控件上发生某些行为时,可以调用命令,例如,左击控件
* 命令不会在Excel重计算期间被调用。
* 命令不会在函数重新计算期间被调用。

函数
-----
函数会做以下操作:

* 函数通常带有参数,和一个返回值
* 函数可以输入一个或多个单元格做为公式的一部分。
* 函数可以用已经定义的函数名进行定义。
* 函数可以用于条件格式和入口表达式
* 函数可以被命令调用。
* 函数不可以调用命令。



------------------------------------------
Excel 状态
------------------------------------------

Excel 在任何时刻都将处于某一特定状态,这取决于用户的行为。外部过程、捕获的事件或Excel在某一时刻执行的操作(如:自动保存)它们都可以用于运行宏。

Excel 的状态包括:

【准备状态】 没有命令或宏开始运行,没有显示任何一个对话框。没有单元格正在被编辑,用户没有在进行 复制/剪切/粘贴 操作。没有嵌入对象被聚焦。
【编辑模式】 用户开始输入有效字符到未锁定的和未保护的单元格,或 在锁定的和保护的单元格 上按下了 F2 按钮。
【复制/剪切/粘贴】 用户剪切或复制一个单元格或单元格区域,但还没有粘贴它们,或已经使用剪贴板粘贴它们。
【点模式】 用户编辑一个公式,并正在选择一个单元格的地址,添加地址到编辑公式的地方。

用户可以使用 ESC 键清除,编辑、点、复制\剪切 模式,并返回 准备状态 。一些事件可以清除这些状态,例如:

* 用户打开一个内置对话框
* 用户启动一个重新计算
* 用户运行一个命令
* Excel 执行自动保存操作
* 捕获了一个定时间事件

最后将是一个对开发人来说十分重要注意事项,在Excel频繁的捕获事件时,你需要考虑是否会影响到Excel正常使用。当这成为你的 外接程序 需要经常频繁捕获事件时,你需要为用户提供一种暂停手段。当用户需要的时候,可以正常的 剪切、复制、和粘贴

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-6 16:24 | 显示全部楼层
本帖最后由 c001q 于 2016-6-6 16:29 编辑

=========================
Excel 工作表和表达式求值
=========================

Excel 工作表单元格内容,在我们输入基本的数据类型时已经进行了计算:

* 数字类型(Numbers)
* 布尔类型(Boolean)
* 字符类型(Strings)
* 错误类型(Errors)

这些类型的混合类型数组,可以做为公式的参数,或做为数组公式的不至一个单元的值。

当用户(或命令宏)往单元格输入,Excel 尝试解释输入内容,如果解释失败就显示出错误信息。如果从一个字符串前缀开始输入(单引号)Excel 会将用户输入的所有字符都显示在单元格中。而不会进行新的解释。(字符串中不会显示 字符串前缀)。如果输入以 =,+,或 - 开始,Excel尝试做为公式来进行解释。如果语法是错误的,或求值过程被停止,会显示出错误信息,单元格会进入编辑模式。其它时候,Excel 尝试 辨认、转换并评估操作、函数名称和函数中的参数。

操作符是从左住右进行计算。函数从最高优先级运算符和多层嵌套的最内层运算符(大多数情况下)开始计算。如果函数参数和操作数不能转换到预期的类型,至计算失败,然后输出 #VALUE 错误。当一个标记(不是文字值)没有识别出 函数、定义的名称或标签时,计算失败并返回 #NAME 错误结果。

如果不是按以上的情形输入内容,Excel 检查核对输入模式,例如 日期、时间、金额、百分比、数字 并进行相应的解释。此操作会遵循地区设定。如果这些都无法进行解释,Excel会新将其解释为 字符串,原样显示所有的输入内容。

Excel 支持其它的数据类型,如最为明显的范围引用。当进行计算时,Excel转换参数中引用到引用的单元格值,而不是使用参数的值。

------------
数字类型
------------
Excel 工作表中的所有数字类型都表现为 8字节的 双精度 浮点类型,包括所有的整数型。然而Excel中实现数字类型时并不完全遵循 IEEE,见下表:

TypeMaximum                    Minimum                     
IEEE 8-byte double     1.7976931348623157E + 308  2.22507385850721014E - 308   
Worksheet(returned by function or paste value) 1.7976931348623157E + 3082.22507385850721014E - 308
Worksheet (manual input) 9.99999999999999E + 307    2.22507385850721E – 308  

IEEE 非规格化数字(2.2250738585072009E–308 to 4.9406564584124654E–324) 不被 Excel 工作表支持,但是VBA 双浮点数据类型可以支持。

如果 DLL 函数 返回 IEEE +/- 无效的双精度浮点。Excel 就会输出 #NUM!错误。所有的非规格化数字和小于正常数字的数字都将被转换为 0. IEEE支持 负零(没错就是-0),它可以由 DLL 函数返回,并显示为 -0。( 小于号 操作  不会检查 负零,如果 A1单元格 包含负零, A1 < 0 结果为 TRUE)。

注意一些数字格式,显示的数字范围比较有限。例如,日期和时间,整数除法。实际上,浮点数除法可能在极端情况下返回非整形数值,但按根据要求,应该返回一个整数。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-9 10:11 | 显示全部楼层
------------------------
Long Unicode 字符串
------------------------

EXCEL 中的字符串会拥有多个版本,它们都存储为 Unicode 字符串。Unicode 工作表字符串,可以表示 32,767 (215 - 1) 长度字符,可以包含任何有效的 Unicode 字符。

当 C-API 第一次被引进时,字符串的字节长度被限制为 255 个字符。C-API 体现了这种限制。在 Excel 2007,C-API 升级后,可以处理 长型 Unicode 字符串。它说明,使用正确的方法注册  DLL 函数后,就可以接收 Unicode 参数 和返回 Unicode 值。

★注意★ 为了向后兼容,字节字符串仍然是被支持的。然后,被限制在 255 个字符长度。

------------------------
返回错误
------------------------

Excel在计算单元格时产生了错误或无法识别出函数和函数名。,将无法转换 函数 和 操作 参数为正确的数据。当内部工作表函数和操作失败,将产生错误消息并通知用户。你可以让你的外接程序返回与Excel一样的错误。

#NULL!

#NULL 错误由 XLM 信息函数返回。例如 调用 GET.DOCUMENT(78),或等价的 C-API 函数 xlfGetDocument 时没有相应的错误消息返回。它还可以被一些函数返回,例如,计算一个空字符串。

当没有其他的合适的错误可以返回时,你可能需要让你的外接程序返回此错误。

#DIV/0!

除法操作时 分母为零,或分母使用了一个太小的数字,Excel 将返回 #DIV/0 错误。一些函数包含了除尘操作的函数,也能返回此错误。例如,AVERAGE 函数当其输入内容无法转换为数字,就将返回 #DIV/0 错误。

你应该只考虑 当你的外接程序函数检测到 0 除法,才返回此错误

#VALUE!

当函数以及操作中使用的参数无法转换为相应的类型时,Excel 就会返回 #VALUE! 错误。在 函数参数不能被转换的情况下(例如:=LN("X")),Excel不会调用函数代码,编写或调试外接程序时大家一定要记住这点。

在函数代码中,如果一个参数没有被转换,一些函数就会返回此错误。例如 DATEVALUE(“30-Feb-2007”)产生此错误,尽管参数中使用了正确的数据类型。在这种情况下,会从函数的内部代码返回错误。一此函数即使使用了正确的类型和范围。仍然会返回此错误,例如 FIND("a","xyz")。

你需要考虑从你的 外接程序 返回此错误,用于指出使用了错误的参数类型,并且此参数无法转换为正确的类型。或超出了单元格范围。尽管在数值参数超出范围时你可以考虑返回 #NUM!。当范围或数组参数错误时考你仍需要考虑返回此错误、

#REF!

当表达式单元格在复制时,公式中的相对引用位置超出范围,Excel 生成 #REF!错误。例如,单元格 B2 调用了 A1,将 B2 复制到 B1 ,就会产生 #REF! 错误。在 剪切/复制 操作或删除行,列或工作表删除时,也会产生此错误。一些函数也会返回此错误,例如(OFFSET(A1,-1,-1)。公式中的引用失效时也会生此错误。

#NAME?

当表达式中包含的标记无法别为函数或定义的名称时,就会产生此错误。如果你的外接程序尝试访问一个未义的名称,你应考虑回返这个错误。

#NUM!

Excel 中的很多数值数据类型和数学函数,当数值超出允许的范围时,都会返回 #NUM! 错误。例如:LN(0)。在你的 外接程序 中,如果输入的数值无效或超出范围,你要考虑返回此错误。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-10 09:08 | 显示全部楼层
====================
工作表引用
====================

Excel 中的工作表引用,是一种数据类型,它引用了一个长方形的单元格区域(也可以只有一个单元格)或多个不相连的单元格区域。Excel内部自身表的单元格引用使用了一个引用类型,被称为 内部引用。引用任何不在当前表格上的单元格,被称为外部引用。查看下一部分的激活和当前定义。

----------------------------
激活 和 当前
----------------------------
在Excel,术语 激活(active) 指的是用户正在查看的视图。激活工作薄和工作表是那些当前正在查看的 或者是 当Excel 已经在另外一个应用程序中失去焦点,就会指向 最近一次丢失的焦点视图。激活表总是存在激活工作簿中。在激活表格中选择的一个或多个单元格同样被称为 激活单元格。如果嵌入对象获取焦点,最近一个选择的单元格还是活动状态。

术语 当前(current)指的是,Excel 正在重新计算。当前工作簿和工作表是那正在重新计算的。当前表总是位于当前工作簿中,单元格或任何数组公式正在计算称为当前单元格。

大家需要牢记以下几点:

* 激活 工作薄/工作表/单元格 不一定只指当前的一个。
* 插件函数,无论是在 VBA 模块 或 DLL 或 XLL,总是从当前工作表中的单元,或多线程重新计算中的一个。

许多Excel函数提供关于 单元格、单元格区域或工作簿中工作表的信息,区分 激活和当前的 工作簿,表格或单元格。它们之间的不同体现在引用的单元格块数据类型。描述在下面的小节中。

----------------------------
内部 和 外部 工作表引用
----------------------------

内部和外部引用之间的关键区别为,外部的引用数据类型包含 工作表 ID,以及一个关于单元格的引用。内部引用未引用到表格--它默认引用当前表格。

很多的C-API 返回引用,或提供引用参数。任何带有引用参数的 C-API 函数,都接受 内部引用或外部引用。除了 xlSheetNm 函数,它需要内部引用。一些函数只会返回 外部 或 内部引用中的一个。例如,C-API 函数 xlfCaller 按照定义会返回一个当前表格中的单元格。它返回的永远都是内部引用。然而,不是从单元格调用的函数可以返回一个无引用类型。C-API 函数 细SheetId 总是返回 工作表ID,它包含在外部引用数据类型中。

其它的一些关于外部引用和内部引用之间关键不同点,在同样的表格中,外部引用数据类型,可以描述多个不相连的区域块。内部引用只能在当前表格中描述一个区域块。不相连的区域块,可以传递给任意一种带有 range 参数的函数。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-11 09:48 | 显示全部楼层
====================
用于Excel的数据类型
====================

Excel 替换了几个 ANSI C/C++ 类型,以及一些特定的Excel数据结构。这儿提到这些是为了其它部分提供一个上下文,它们在 xlfRegister (Form 1) 主题中有详细的描述。

----------------------------
ANSI C/C++ 类型
----------------------------

== Numbers ==

所有版本的Excel:

* 8-byte double
* [signed] short [int] – used for Boolean values and also integers
* unsigned short [int]
* [signed long] int

== Strings ==

所有版本的Excel:

* [signed] char * – 由Null字节终止的255位的字符串。null-terminated byte strings of up to 255 characters
* unsigned char *

Excel 2007 版本特有:

* unsigned short * – Unicode 字符串支持 32,767 个字符,这些字符以 NULL或特定长度 结束

Excel工作表中的所有数字,都被包装为 doubles 类型,因此在外接程序 函数中声明为 integer 类型。

当你使用 integer 类型,Excel 会核实输入属于正确范围的类型,否则会返回 #NUM! 错误。但有一种例外情况,当你注册的函数接受 参数为 Boolean,就会应用 short int 类型。在这种情况下,任何 非零的输入都会被转换成 1,0 会直接采用。

----------------------------
Excel 特有的类型结构
----------------------------

所有版本的Excel:

* FP 二维浮点数组结构,在给的版本中支持 65,356 行 最大数量的列。
* XLOPER 多类型数据结构,它表示所有的工作表数据类型(包括错误类型),integers、范围引用,XLM 宏表带有控制类型,内部二进制存储类型。

注意  strings 被描绘成 拥有多达255个字符的字符串。

仅在 Excel 2007 支持:

* FP12 二维浮点数组结构支持Excel中的所有行和列
* XLOPER12 多类型数据结构,可以表示所有的工作表类型类型(包括错误类型),integers,范围引用,XLM 宏表带有控制类型内部二进制存储类型。

注意  strings 被描绘成 拥有多达 32,767 个字符的字符串。

----------------------------
注册类型类型代码
----------------------------

XLL 函数使用 C-API 函数 xlfRegister 注册。作它的第三个参数字符串会被编码为 返回 和 参数类型,这个 string 包含的信息会通知 Excel 函数是否是不稳定的,是否线程安全的,是否为 宏表等价内容,是否返回编辑了参数后的结果。

下表提供了一个大概的信息,更多详细的内容请查看 xlfRegister 主题。

Data typePass by valuePass by ref (pointer)
              Comments
            
BooleanALshort (0=false or 1=true)
double            B            E            
            char *        C, F            Null-terminated ASCII byte string.
            unsigned char *
         
            
         
            D, G            Length -counted ASCII byte string.
            unsigned short * (Excel 2007 only)
         
            
         
            C%, F%
         
            Null-terminated Unicode wide character string.
            unsigned short * (Excel 2007 only)
         
            
         
            D%, G%
         
            Length-counted Unicode wide character string.
            unsigned short [int]
         
            H
         
            
         
            WORD
            [signed] short [int]
         
            I
         
            M
         
            16-bit
            [signed long] int
         
            J
         
            N
         
            32-bit
            Array
         
            
         
            O
         
            Passed as three arguments by reference:
            [ol][li]
                short int *rows
              [/li][li]
                short int *columns
              [/li][li]
                double *array
              [/li][/ol]
         
            Array
            (Excel 2007 only)
         
            
         
            O%
         
            Passed as three arguments by reference:
            [ol][li]
                int *rows
              [/li][li]
                int *columns
              [/li][li]
                double *array
              [/li][/ol]
         
            FP
         
            
         
            K
         
            Floating-point array structure.
         
            FP12
            (Excel 2007 only)
         
            
         
            K%
         
            Large grid floating-point array structure.
         
            XLOPER
         
            
         
            P
         
            Variable-type worksheet values and arrays.
         
            
         
            
         
            R
         
            Values, arrays, and range references.
         
            XLOPER12
            (Excel 2007 only)
         
            
         
            Q
         
            Variable-type worksheet values and arrays.
         
            
         
            
         
            U
         
            Values, arrays, and range references.
         


C%, F%, D%, G%, K%, O%, Q, 和 U 都是 Excel 2007新增内容,它们不被Excel 早期版本支持。字符串类型 F, F%, G, 和 G% 用于编辑的参数。 当 XLOPER 或 XLOPER12 参数分别注册为 P 或 Q,Excel会 转换独立单元格引用为一个简单值,多单元格引用转换为数据。

类型 O,实际上这有3个参数在堆栈上,这个类型主要是为了兼容 Fortran语言编写的 DLL,参数以引用方式传递。它不能用于返回值,除了 声明参数为 modify-in-place 返回值,放置一个引用值结果。O% 类型扩展 0。它可以存取数组,它的覆盖的范围大于 Excel 2003 网格。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-12 18:18 | 显示全部楼层
====================
Excel 重新计算
====================

用户可以通过几种方法,引发 Excel 重新进行计算。

* 如果 Excel 处于自动计算模式,当我们输入新的数据,Excle 就会重新进行计算。(关于自动计算模式,稍后我们会进行介绍)
* 明确通知 Excel 重新计算所有内容或部分内容
* 删除或新增 行和列
* 当设置了“保存前重新计算”选项,Excel会用户保存文档时,重新进行计算。
* 执行一个“自动筛选”操作。
* 双击一个行或列分配器(在自动计算模式下)
* 添加、编辑、删除一个定义的名称。
* 重命名工作表。
* 将一个工作表从一个工作簿移动到另一个工作簿。
* 隐藏或取消隐藏行(不包括列)。

注意
-----------
    以上操作内容没有分辨是否为用户按下的键盘按钮或是点击的鼠标,所有操作都由命令和宏来实现。由于用户可以直接运行命令或通过一些操作执行命令,因此在这种情况下也会被认为是用户执行的操作。 “用户”这个词的意思,即表示了“用户”本身,也表示了“用户所执行的命令和操作”。

---------------------------------------------------
依赖性, Dirty 单元格, 重计算单元格
---------------------------------------------------

Excel 中的计算可以视为3个段的处理过程:

1. 构造关系树
2. 构造计算链
3. 重新计算单元格

关系树通知Excel 哪些单元格依赖于或等其它的单元格,哪些单元格引用了别的单元格,通过这个树,Excel 构造一个计算链。计算链列出了所有的需要计算的包含公式的单元格。在重新计算的同时,如果公式依赖的单元格还没有计算,Excel就会修正这个计算链。在这种情况下,此单元格会开始计算,并移动到计算链中。以这种方式标记的单元格称为 dirty。所有直接或间接关联的单元格都被标记为 dirty。例如 B1 依赖于 A1,C1 依赖于 B1 ,当 A1 改变时, B1 和 C1 都会被标记为 dirty。

如果一个单元格直接或间接依赖自身,Excel 会向用户发循环引用警告。通常这种错误,用户必需进行修复,Excel 2007 提供非常有用的图形导航工具帮助用户追踪循环引用错误的来源。然而在某些情况下,你可能会故意想在这种错误存在。例如,你可能想运行迭代运算,将上一次迭代的结果做为下一次循环的起点。Excel 通计算选项对话支持迭代计算。

把单元格设置为 dirty 后,当下一次的重新计算完成后,Excel会依据计算链的顺序再次评估每个标记为 dirty 的单元格内容。在前面给出的例子中,B1 是第一个,然后是 C1. 如果重新计算是自动的,Excel 会在标记完 dirty 后,立即进行重新计算。否则,会在之后执行重新计算。

从 Office XP 这个版本开始(Excel 版本 10),VBA 中的 Range 对象提供一个方法  Range.Dirty(),表示此单元格需要计算。当它与 Range.Calculate 方法一起使用(参考后面部分),它会在给定的 区域内强制计算单元格。当你在宏中执行有限的计算时,它是一种有用的功能。当计算模式设置为手动的,避免不需要的宏 函数计算开销。 Range 的计算方法无法通过 C-API 使用。

Excel 2002 以前版本,Excel 为每个打开的工作簿以及工作表构建计算链。这增加工作表处理的复杂度,我们需要小心进行重新计算,需要时刻关注其计算效率。尤其是 Excel 2000,你需要最小化跨工作表的依赖性,并按字母顺序命名工作表。然后那些工作表将取决于那些按字母顺序排列的表。

在 Excel 2007,逻辑是加强的,使用多线程进行重计算。因此计算链的各部分不是相互依赖的,可以同时进行计算。你可以配置 Excel 在单处理器计算机中使用多线程处理,或在多核或多CPU计算机中使用单线程处理。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-16 17:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
-----------------------------
易失性函数和和非易失性函数
-----------------------------

Excel 支持易失性函数,也就是说,之后即使没有参数被改变,我们也认为假它的值是相同的。每次重新计算时 Excel 都会重新评估包含 volatile 函数的单元格以及所有的从属单元格。由于这个原因,如果很多易失性函数,会使用重计算时间延长,所以你要尽量少用它们。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\ 翻译者注释:
\\     用于将用户自定义函数标记为易失性函数,无论何时
\\ 在工作表的任意单元格中进行计算时,易失性函数都必须
\\ 重新进行计算。非易失性函数只在输入变量改变时才重新
\\ 计算,若不用于计算工作表单元格的用户自定义函数中,
\\ 则此方法无效。
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

以下是一些易失性函数

* NOW
* TODAY
* RAND
* OFFSET
* INDIRECT
* INFO (根据它的参数)
* CELL (根据它的参数)

VBA 和 C-API 都支持,将用户定义函数定义为易失性函数。在VBA中,UDF 使用以下方式声明为 易失性。

Function MyUDF(MakeMeVolatile As Boolean) As Double
   ' Good practice to call this on the first line.
   Application.Volatile (MakeMeVolatile)
   MyUDF = Now
End Function

默认情况下,Excel 假设 VBA UDF 不是易失性函数。Excel 只知道,当第一次调用时,UDF 是 一个易失性函数。在这个例子中,非易失性函数可以变回易失性 UDF。

使用 C-API,你可以注册 XLL函数为易失性函数,此函数第一次调用之前。他还能使你 开启或关闭 worksheet 函数的 volatile 状态。

---------------------------------------
重计算模式,命令,选择性重计算,数据表
---------------------------------------

Excel 拥有三种计算模式:

* 自动重算
* 除数表外,自动重算
* 手动重算

当计算设置为自动,每当输入任何数据后或某些事件发生后,Excel 都会自动进行计算。比如,之前部分所提供的一些实例。在非常大的工作簿中,重计算时间可能会非常长,在这种情况下,用户可能需要对重计算功能进行一些限制,规定只有在需要时才进行重计算。为了实现这个目的,Excel提供了“手动计算”模式。用户可以通过Excel菜单系统选择这个模式,或者在 VBA、COM、或 C-API 中以编程方式来实现。

数据表是工作表中的一种特殊结构。首先用户建立工作表中结果区域的计算。这个取决于一个或二个可以改变的关键输入或其它参数。然后用户可以为设置的一两个关键输入值,创建一个结果表。此表使用 数据表向导 创建。当表建立完成后,Excel插头一个一个的输入到计算和结果值复制到表中。一个或二个输入可以使用,数据表可以是一维或二维的。

数据表重计算,处理上有些许的不同

* 数据表重计算 在处理常规工作簿时会使用异步方式,在处理大表时会花费更长的时间。
* 循环引用是可接受的。如果计算依赖一个或多个数据表的值,Excel 不能抱怨循环依赖。

考虑 Excel 使用几个不同的方法处理 数据表计算,实际上,大表需要复杂的计算,这会导致计算花费很长的时间,Excel 中你可以关闭数据表自动计算,你可以在设置中的计算模式选项选择 “除数据表外,自动计算”。当Excel 处于这种计算模式时,用户可以通过按下 F9 进行重新计算,或一个等效的程序操作。

通过Excel 露的方式,你可以改变 重计算模式 和 控制重计算。这些方法,随着版本的改进,不断增强功能。C-API这方面的能力在 Excel 版本5中就可以实现。所以在较新的 VBA 版本中没有给你提供相同的能力。

最常用在Excel手工计算模式,这些方法允许选择性计算手册、工作表,和范围,完全重新计算所有打开的工作簿,完全依赖树的重建和计算链。

---------------------
单元格计算
---------------------

击键:无

VBA: Range.Calculate(Excel 2000 引进, Excel 2007进行了一些更新) 和 Range.CalculateRowMajorOrder (Excel 2007 引进)

C-API:不支持

* 手动模式

  重算只发生在特定范围的单元格中,无论单元格是滞为 dirty 。 Range.Clculate 方法行为在 Excel 2007 中有所改变;无论怎样, Range。CalculateRowMajorOrder 方法都是支持的。

* 自动计算,或 除表格外自动计算
  
  重计算,工作簿,不会强制范围或范围中的任意单元格重计算

---------------------
激活表计算
---------------------

按键:SHIFT + F9

VBA: ActiveSheet。Calculate

C API: xlcCalculateDocument

* 所有模式
  只会在的工作表中重算单元格,


---------------------
指定工作表计算
---------------------

快捷键:无

VBA Worksheets(reference).Calculate

C-API: 不支持

* 所有模式
  
  重计算指定工作表中 dirty 单元格,以及它们的从属单元格。在相关工作簿中使用字符串或索引号引用工作表名称,
  
  Excel 2000 和 之后版本,暴露 一个 布尔工作表属性,EnableCaculation 属性。它设置 True 可以将指定工作表中的所有 dirties 单元格设置为  Non dirties单元格。 在自动模式下,这会引起所有工作簿的重计算。
  
  在手动模式下,以下代码只会引发激活工作表的重计算。

        With ActiveSheet
                  .EnableCalculation = False
                  .EnableCalculation = True
                  .Calculate
        End With

------------------------------------------
工作簿树重建,以及强制重算
------------------------------------------

快捷键: CTRL+ALT+SHIFT+F9 (Excel 2002 引入)

VBA:Workbooks(reference).ForceFullCalculation(Excel 2007 引入)

C-API:不支持

* 所有模式
  
  对于一个给定的工作簿和包含公式的所有单元格重记录,会引起Excel 重构关系树和计算链,

------------------------------------------
所有打开工作簿
------------------------------------------

快捷键:F9

VBA:Application.Calculate

C-API:xlcCalcuateNow

重算所有Excel标记为dirty 的单元格,也就是说, volatile  从属性单元格,或改变数据,单元格以编辑方式标记为  dirty。如果计算模式是除表格外自动计算,
  
------------------------------------------
所有开打工作簿树重购和强制计算
------------------------------------------

快捷键:CTRL + ALT + F9

VBA: Application.CalculateFull

C-API: 不支持

* 所有模式

  在打开的工作簿中重算所有单元格。如果计算模式是 自动计算除表格外,强制表格进行重计算。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 02:47 , Processed in 0.039497 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表