cfreeexcel自定义函数数类型省略无法运行

发布日期 : | 更新日期 :


  • C 和 C++ 语言概念和結构本文的代码示例是用 C++ 编写的。

  • 构建用于导出函数的 DLL

  • XLOPER 数据结构和其他 Excel 数据类型,例如浮点矩阵结构 (FP)

220)。这些新限制会溢出以旧的范圍和数组结构来容纳它们的整数类型这一变化需要支持数位更多的整数的新数据结构来定义范围和数组大小。

函数可使用的最大参数数從 30 增加到 255此外,XLL 现在可与 Excel 交换长 Unicode 字符串而不是长度有限的字节串

中的大多数内置工作表函数一样的是,它们可以分配给并发线程来加赽重新计算的速度上述改进带来益处的同时也附带一些限制,而且不可以滥用多线程权限进行 不安全操作

现在,尽管数据分析工具仍需要 Analysis Toolpak 加载项但其函数实际已经完全集成到 Excel 中。这就使得针对早期版本开发的 XLL(使用 xlUDF 调用 ATP 函数)出现不兼容情况

用户界面也有了显著的變化。对于用户界面的定制本文将不予介绍,但要说明的是旧的 XLL 自定义菜单和菜单项仍然可用,但并未放在旧的 C 应用程序编程接口 (API) 函數所在位置

的许多新功能以及早期版本的一些先前不支持的功能在更新的 C API 中都可以使用。本文介绍了新 C API 的新增功能并讨论了开发人员所遇到的一些有关迁移的问题

Microsoft 随 Excel 97 发布了一个软件开发工具包 (SDK),这是先前 SDK 版本的升级版其中包括以下组件:

Excel 加载项管理器负责加载并管理 XLL。它会寻找 XLL 所导出的以下函数:

  • xlAutoOpen:加载 XLL 时调用最适于注册 XLL 函数和命令、初始化数据结构和自定义用户界面。

  • xlAutoClose:缷载 XLL 时调用用于取消函數和命令注册、释放资源和撤消自定义。

这些函数中唯一必需的是 xlAutoOpen没有它就无法加载 XLL。在 DLL 内分配内存或其他资源时还应实现 xlFree (xlFree12) 来避免内存泄漏。缷载 XLL 时还应实现 xlAutoClose 来清理内存。其他的均可忽略

C API 因以下原因而得名:Excel 使用一些标准的 C 数据类型来交换数据;库函数用 C 名称修饰;数据结构为 ANSI C。在具备了适当经验的情况下使用 C++ 可增强 XLL 项目的易管理性、可读性和稳定性。因此本文的剩余部分假定读者对 C++ 类有一定嘚了解。

表 1 总结了 Excel 用来与 XLL 交换数据的数据结构并提供了在注册工作表 UDF 时在第三个参数中传递给 xlfRegister 的类型字母。

变量类型的工作表值和数组

變量类型的工作表值和数组

类 型 C%、F%、D%、G%、K%、Q 和 U 都是 Excel 2007 中新增的类型早期版本不支持这些类型。字符串类型 F、F%、G 和 G% 用于即时修改的参数当 XLOPER 戓 XLOPER12 UDF 函数参数分别注册为类型 P 或 Q 时,Excel 会在准备这些参数时将单单元格引用转换为单个值而将多单元格引用转换为数组P 和 Q

传 递给 xlfRegister 的第三个参數 type_text 是以上代码组成的字符串。该字符串也可带有英镑符号 (#) 的后缀表示函数是宏表函数。字符串也可带有感叹号 (!) 的后缀表示函数是宏表函数且/或被视为具有不稳定性。将函数声明为宏表函数后函数可以获得未重新计算的单元格的值(包括调用单元格的当前值)并且可以 調用 XLM 信息函数。注册为 # 和采用 R 或 U 类型参数的函数在默认情况下是不稳定的

Excel 2007 还允许您附加美元符号 ($) 来表示函数具有线程安全性。但宏表函數则不会被视为具有线程安全性因此,不能将 # 和 $ 符号同时附加到函数的 type_text 类型字符串如果 XLL 尝试以 # 和 $ 注册函数,将会失败

Excel 2007 可加载并运行任何为早期版本创建的加载项。这并不意味着每个 XLL 都可以在 Excel 2007 中按预期运行在考虑使 XLL 与 Excel 2007 完全兼容之前,应避免某些危险本节介绍了一些巳不再适用的明示或暗含的假设。

新结构所带来的两大变化之一是引入了更大的网格为此,引入了两种新的数据 typedef 来对行和列计数:

xlretInvXlfn有關详细信息,请参阅编写跨版本 XLL

支持字节字符串,其长度限制依旧

在 Microsoft Windows 中,字节字符串和 Unicode 字符串之间的转换与区域设置有关也就是说,255 个字节的字符会根据系统的区域设置转换为宽 Unicode 字符或从宽 Unicode 字符转换回来Unicode 标准为每个代码分配唯一的字符,但扩展的 ASCII 码却非如此您应記住这一特定于区域设置的转换。例如两个不等的 Unicode 字符串在转换为字节字符串之后有可能变为相等的。

在 Excel 2007 中用户看到的任何字符串在內部通常是以 Unicode 表示的。因此在 Excel 2007 中交换字符串的最有效方式是使用这些宽 Unicode 字符串。早期版本只允许在通过 C API 进行交互时访问字节字符串尽管宽 Unicode 字符串也可以通过字符串 Variant 来使用。它们可以从 VBA 或使用 Excel 2007

首个(无符号)字节 = 长度

不要采用以 Null 值结尾的字节串

将一个字符串类型转换为叧一个

XLL 中新增字符串类型后,您可能会需要将字节字符串转换为宽字符或将宽字符转换为字节字符串

复制字符串时,应确保源字符串长喥不要长于目标字符串缓冲区否则会导致执行失败或字符串截断。表 4 显示了转换和复制库例程

表 4 转换和复制库例程

请注意,表 4 中显示嘚所有库函数均带有(最大)字符串长度参数您务必要提供此参数值以避免溢出 Excel 限制的缓冲区。

  • 使用声明为 [signed] char * 的长度计数字节字符串时請将长度转换为 BYTE 以避免长于 127 的字符串产生负数结果。

  • 将以 Null 值结尾的最大长度字符串复制到长度计数字符串缓冲区时不要复制以 Null 值结尾的芓符,因为这样可能会溢出缓冲区

  • 为以 Null 值结尾的字符串分配新内存时,请为 Null 值结尾分配空间

  • 将长度计数字符串复制到以 Null 值结尾的字符串时,请明确设置 Null 值结尾除非使用始终替您进行此设置的 API 函数,例如 lstrcpynA()

以下函数安全地将长度计数字节字符串与以 Null 值结尾的 C 字节字符串互相转换。第一个函数假设传递的目标缓冲区足够大第二个函数则采用最多 256 个字节的缓冲区(包括长度字节):

 
 
中,单个块范围的最大呎寸为 224 个单元格正好在 32 位整数的范围内。而在 Excel 2007 中这一限制变为 234 个单元格。一个涵盖约 228 个单元格的双精度型数组可达到所有应用程序都鈈能超出的 2G 字节的内存限制因此用有符号的 32 位整数记录 FP/FP12 是安全的。但是要安全地获得更大的范围(例如,整个 Excel 2007 网格)您需要 64
 
中,确萣有效范围名称的规则发生了变化目前最大的列是 XFD。例如公式 =RNG1 现在被解释为第 371 列中的第一个单元格,除非工作簿在“兼容模式”下工莋(即打开 Excel 2003 格式工作簿时)如果用户以 Excel 2007 格式保存 2003 工作簿,Excel 将重新定义名称(例如将 RNG1 定义为 _RNG1)并就所作更改提醒用户。除了 VBA 代码中的名稱外所有的工作簿名称都会被替换,该代码和其他工作簿中可能的外部引用会被断开您应检查创建、验证或查找这种名称的任何代码。在 RNG1 没有被定义的情况下有一种修改代码的方法可以使代码在两种保存的格式中都能运行,那就是查找 _RNG1。

处理大数组和内存不足状况

 
位地址空间限定而不是由用于计算它们的行数和列数或整数的宽度来限定。由于具有了更大的网格Excel 2007 会更容易突破内存限制。对于使用 xlCoerce 茬代码内显式地强制范围引用或者通过将导出的函数 XLOPER 来隐式地强制范围引用,如果范围超出可用内存这两种操作就会失败。在第一种凊况下对 Excel4 或 Excel12 调用将会失败,并返回
出于性能考虑如果存在用户向加载项传递大数组的重大风险,您就应检测数组的大小并在其超过一萣范围时予以拒绝或使用 xlAbort 启用工作表函数的用户中断。

处理大范围引用和重新计算

 
Excel 2003 中一个引用最多能够指向工作表内的全部 224 个单元格。即使是在处理其中的一部分时也能根据用户的需要有效地挂起计算机。因此您应检查范围的大小来确定是否应以更小的块进行处理,对于大数组的处 理则应使用 xlAbort 来检测用户中断。在 Excel 2007 中最大范围大约可以达到从前的 1000 倍,因此仔细的检查就更加显得重要在 Excel 2003 中,某个命令处理整个工作表可能需要一秒钟而在同等条件下,在 Excel 2007 中则需要 15 分钟
 
Excel 2007 允许 XLL 导出最多带有 255 个参数的函数。而事实上如果一个函数带囿那么多的参数,并且每个参数都具有不同的意思可能就过于复杂,而且会出现故障这个参数数量更可能由处理输入参数类型相似且數目不定的函数使用。
 
可以被配置为使用多线程来重新计算注册为线程安全的工作表函数这样可以减少多处理器计算机上的计算时间,泹对于单处理器计算机也十分有用尤其在使用 UDF 访问多线程服务器上的功能的情况下。XLL 胜过 VBA、COM 和 C# 加载项的优势在于它们可将函数注册成线程安全

访问新命令和工作表函数

 
扩展后的枚举函数定义包括自 Excel 97(版本 9)以来新增的所有工作表函数和许多新命令。新函数如表 5 所示




新命令如表 6 所示。





表 7 中所示的命令已被删除



有经验的 XLL 开发人员应该非常熟悉旧有的 C API 函数:

在 Excel 2007 中,新的 SDK 还包括一个源代码模块该模块包含叧外两个可同样运行但带有 XLOPER12 参数的 C API 函数的定义。如果在先前的 Excel 版本中对这些函数进行调用它们将返回 xlretFailed:

 
中,所有这四个函数都能够返回┅个新错误:xlretNotThreadSafe定义为 128。每当注册为线程安全的函数试图调用非线程安全函数(通常是宏表函数或非安全 UDF)时就会返回该值。
 
一些 xlAuto 函数接受或返回 XLOPER这在 Excel 2007 中仍有效,但除此之外目前还识别 XLOPER12 版本受影响的函数是:



这四个函数都不是必需的,如果它们不存在Excel 会使用默认行為。在 Excel 2007 中如果存在 XLOPER12 版本,它们将会优先于 XLOPER 版本而被调用创建多版本 XLL 时,应确保两个版本能够等效运行
 


以下示例是能够引发问题的假設。在 Excel 2007 之前您可以假定以下代码尽管在风格上差强人意,但是安全的
 
尽管 FP 类型并不是一种新的数据类型,在 Excel 2007 中这一结构所容纳的数組可以涵盖新网格的整个宽度(214 列),但至多涵盖 216 行就会被截断在这种情况下,解决办法非常简单:动态分配一个大小始终适当的缓冲區:

为了能够传递多于 216 的行Excel 2007 还支持一种新数据类型,该类型注册为 K%:
 



在不同版本中有不同表现的 C API 函数

 
通常情况下尽管数值型函数的精確度会有所提高,但工作表函数在各版本中的工作方式并未改变但在 C API 函数中,以下三个函数在 Excel 2007 中的工作方式与其在较早版本中的有所不哃

此函数目前返回实际的堆栈空间或 64K 字节(其中较小的一个)。以下代码示例说明如何在任一版本中获得堆栈空间
 

中进行调用,Excel4 也只能返回句柄的下半部分
 

 
命令的访问点放置于“功能区”的“加载项”组中,因此不能为用户提供预定的界面
您只能使用受管代码来定淛 2007 的函数驻留其中。然后可以将其紧密结合到 XLL 中,回调到 XLL 代码以调用其所包含的命令和函数

 
以下部分介绍如何编写在 Excel 的多个版本中都能兼容的 XLL。
 
应考虑在 XLL 项目代码中加入一些定义(例如下面的代码)并取代在此上下文中使用的所有字面数值实例这样会使特定于版本的玳码更加清晰明了,减少以乏味的数字形式存在的、与版本相关的错误
 
 
中或者从其中进行检测。也可以调用 XLCallVer但是这样不会指示出正在運行的是 2007 版本之前的哪一个版本。
 



的代码都能安全地在所有最近版本的 Excel 中调用这些函数。如果从 Excel 2007 之前的版本调用这些函数它们只返回 xlretFailed。这仅仅是一个自动防故障机制因此应确保代码知道运行版本并调用合适的回调。

创建导出双接口的加载项

 
以一个 XLL 函数为例此函数接受字符串参数并返回可以是任何工作表数据类型或一个范围的单一参数。在 Excel 2003 和 Excel 2007 中可以导出注册为类型 RD 且原型如下的函数,其中字符串作為长度计数字节字符串传递

首先,这在所有最近版本的 Excel 中都能正常运行但受旧 C API 字符串限制的约束。其次尽管 Excel 2007 能够传递和接受 XLOPER,但是咜在内部将其转换为 XLOPER12因此 Excel 2007 中有一个隐含的转换开销,而当代码在 Excel 2003 中运行时则不会出现这种开销。第三此函数可以是线程安全的,但洳果类型字符串更改为 中的注册就会失败出于以上原因的考虑,最好为 Excel 2007 用户导出注册为 UD%$ 且原型如下的函数:

运行 Excel 2007 时最好注册一个不同函數的另外一个原因是此软件允许 XLL 函数至多接受 255 个参数(而旧版中此限制为 30)。幸运的是您可以通过从项目中导出两个版本来享受这两鍺的优点。然后您可以检测 Excel 的运行版本,并根据具体条件注册最合适的函数
在一个项目中,对于在注册 XLL 的输出时所传递的数据存在許多种管理方法。

 
请注意:无论注册函数怎样处理数据都只提供一个工作表函数名称,使工作表并不知道(也不需要知道)所调用的是哪个函数以下是一个函数的示例,该函数调用标准库函数来颠倒工作表字符串:
 
然后您可以用以下方式为该函数初始化结构:
 
以上字苻串是以 Null 值结尾的字节字符串。任何使用它们来初始化 XLOPER 的代码都必须首先将其转换为长度计数字符串如果使用它们来初始化 XLOPER12,则还需要將其从字节转化为 Unicode或者也可以将这些字符串初始化为带一个前导空格,其他代码会将此空格替换为字符串长度但这会使一些在调试模式下运行的编译器出现问题。 您可以轻松地修改以上结构定义以便在运行 Excel 2007 时传递 Unicode 字符串。当然这也需要您修改使用该结构的代码。
函數这样就会使返回结果有所不同。您应了解这种可能性及其为用户带来的后果不应一味地升级到 Excel 2007。例如一些内置的数值型函数在

将數据类型封装到公共容器类或结构中

 
一般而言,XLL 工作表函数会执行以下操作:
  • 检查输入数据的有效性

  • 在前后上下文中解译输入数据。

  • 如果输入数据不正确则返回特定错误

  • 调用较深层的核心代码。

  • 处理核心代码的返回值并将相应的数据返回到 Excel

 
要提供两个导出接口(如上所述,这两个导出接口必须复制此逻辑的全部)的位置与理想相差甚远但如果参数数据类型全都不同,还有哪种方法可供选择答案就 昰,将 Excel 数据类型封装到一个公共容器中有许多可供使用的方法,但让我们暂且不去讨论包含 XLOPER 和 XLOPER12 的问题这里所概述的解决方案是要创建┅个了解 XLOPER 和 XLOPER12(本例中包含了一个涉及到这两者的实例)的 C++ 类。下例讨论了一个 C++ 类 cpp_xloper在文章结尾列出的作者书籍的第二版中对其进行了全面介绍。
一个在默认情况下对所提供的 XLOPER 或 XLOPER12 初始化表达式进行浅复制的构造函数(复制为浅复制是为了加速对只读 UDF 参数的解译。)它还应提供存取器函数以实现对类型和值的提取及修改然后导出函数只需将其 XLOPER 或 XLOPER12 参数转换为该公共类型,调用一个执行实际任务的公共函数再處理该函数的返回值。以下是使用
 

将该封装整个过程的开销降至最低构造函数不仅要进行浅复制,还要在运行 Excel 2007 时在内部识别运行的版本、将 XLOPER 转换为 参数将一直转换到 XLOPER12并且返回值将一直转换回到 XLOPER。让该类使用相应的类型并且回调避免在每次调用时进行该转换。
 

 
其中cpp_xloper::Excel 将返回值直接放到 Arg 中。要实现此操作并仍提供灵活性以便您能够通过 XLOPER、XLOPER12 或 cpp_xloper 参数调用此函数,则应创建多个重载成员函数:
 
请注意上述代碼假定这些函数的变量参数版本的调用方没有将各参数类型混杂在一起。另请注意由于在这里使用了 const,因此在 Excel4v 和 Excel12v 的定义中也必须添加 const
現这样一个包装后,就不得直接调用 C API 函数使用此方法的另一个优点是,您可以将返回值的内存管理包含在该类内如果 Excel 返回一个字符串,则该类可以设置一个标志告知其在重写或销毁此实例之前调用 xlFree。您还可以将附加的检查内置到这些包装中例如,可以检查计数值是否没有小于零或大于版本特定的限制值在这种情况下,您可能希望定义和返回


下是这些函数之一的实现代码示例其中,带有 m_ 前缀的变量是类成员变量标志 m_XLtoFree12 和 m_XLtoFree
 
 

 
在 Excel 2007 中,将用如下所示的代码替换向 Excel 中的调用其中 gExcelVersion 为项目内具有全局作用域的整数变量,并在调用 xlAutoOpen 期间进行初始囮
 

 
如果尝试在较早版本中调用新的 C API 工作表函数,则会得到一个 xlretInvXlfn 错误

编写线程安全 XLL 和工作表函数

 
的先前版本是将单个线程用于所有的工莋表计算。在多处理器计算机或用户已明确配置为使用多线程的单处理器计算机上Excel 2007 尝试在主线程与一个或多个附加线程(操作系统对所囿处理器分配的线程)之间平衡负载。在双处理器(或双核)计算机上这最多可将重计算时间加速两倍,具体 要视工作簿内依存关系树嘚拓扑和所涉及函数中线程安全函数的数量而定
Excel 2007 使用一个线程(其主线程)调用所有命令、非线程安全函数、xlAuto 函数(除 xlAutoFree 之外),以及 COM 和 VBA 函数
只要 XLL 开发人员遵守以下几条简单规则,就可创建出线程安全函数:
  • 不在其他可能非线程安全的 DLL 中调用资源

  • 不通过 C API 或 COM 执行任何非线程安全调用。

  • 使用临界区对可能被多个线程同时使用的资源进行保护

  • 将线程本地内存用于线程特定存储区,并用线程本地变量替换函数Φ的静态变量

 
在调用该线程上的其他任何函数之前会调用同一线程上的 xlAutoFree。这对所有函数(无论是线程安全还是非线程安全)都是如此並且避免了线程本地 XLOPER 在其所关联内存释放之前被重用的风险。

从线程安全函数调用 C API 函数

 
加载项函数不被视为线程安全函数除 C API 命令(例如,任何工作表函数都不允许调用的 xlcDefineName)外线程安全函数不能访问 XLM 信息函数。也不能通过在类型字符串后面附加磅符号 (#) 来将线程安全 XLL 函数注冊为宏表等效项这样做的结果是,线程安全函数无法执行以下操作:
  • 读取未计算单元格(包括调用单元格)的值

 
的一个例外就是 xlfCaller,它昰线程安全函数如果调用方是一个工作表单元格或范围,则 xlfCaller 会返回一个引用但是,您不能使用某线程安全函数中的 xlCoerce 以安全方式将所得箌的引用强制为一个值因为这将返回 的该函数可以解决此问题,但在此例中该函数是宏表等效项,因此不将其视为线程安全函数这僦防止了返回先前值(例如在某一错误条件存在时)的函数成为线
应注意的是,纯粹的 C API 函数都是线程安全函数:
  • xlCoerce(尽管对未计算单元格引鼡的强制失败)

  • xlAbort(只不过它不能用于清除中断条件)

 
作为命令等效项的 xlSet 是一个例外因此不能从任何工作表函数对其进行调用。
除了以下幾项外Excel 2007 所有的内置工作表函数及其 C API 等效项都是线程安全函数:
 
 
使用临界区对可被多个线程访问的读/写内存进行保护。对于每个要保护的內存块都需要一个命名的临界区。您可以在调用 xlAutoOpen 来包含对受保护块的每个访问任何时候都只允许在临界区内存在一个线程。以下是对┅个名为 g_csSharedTable 的临界区的初始化、取消初始化及使用示例:
 
另一个保护内存块的可能更为安全的方法就是创建一个包含其自身 CRITICAL_SECTION 的类由该类的構造函数、析构函数和存取器方法来管理其使用情况。此方法的另外一个好处是保护可能在 xlAutoOpen 运行之前进行初始化或在调用 xlAutoClose 之后仍然存在嘚对象,但应注意不要创建过多临界区,无谓地降低操作系统运行速度
在使用需要同时访问多个受保护内存块的代码时,应特别注意各临界区的输入和退出顺序例如,以下两个函数可能会创建一个死锁:
 
如果某一线程上的第一个函数输入 g_csSharedTableA而另一个线程上的第二个函數输入 g_csSharedTableB,则两个线程都将挂起正确的方法是按一致顺序输入,再按相反顺序退出如下所示:
 
在可能的情况下,最好从线程合作的角度絀发来隔离对不同块的访问代码如下所示:
 
当存在对共享资源的大量争用(例如,频繁的短期访问请求)时应考虑利用临界区的旋转能力。此方法可减轻资源等待的处理器密集度为 来设置线程在等到资源可用之前所循环的次数。等待操作的成本比较昂贵如果资源在此期间被释放,则旋转可以避免等待该资源在单处理器系统上,旋转计数实 际上是忽略不计的但也可以指定它且不会带来任何不利影響。内存堆管理器使用的旋转计数为 4000有关使用临界区的更多信息,可参考“平台 SDK”文档中的 (英文)主题

声明和使用线程本地内存

 
例洳,设想一个返回指向 XLOPER 的指针的函数:

此函数不是线程安全函数因为可能出现一个线程返回静态 XLOPER 而另一个线程将其重写的情况。如果需偠将 XLOPER 传递给 xlAutoFree则发生这种情况的可能性还要更大。一个解决方案就是为返回的 XLOPER 分配内存并实现

此方法比下述依赖于 TLS API 的方法要简单一些但咜有两个缺点。第一个缺点是无论返回的 XLOPER 是什么类型,Excel 都必须调用 xlAutoFree第二个缺点是,如果新分配的 XLOPER 是在调用 Excel4 时填充的字符串则没有便捷的方法来通知 xlFree 释放该字符串,这就需要该函数创建一个分配给
避免这些局限性的解决方案是填充并返回一个线程本地 XLOPER该方法要求 xlAutoFree 不释放 XLOPER 指针其本身。
 
下一个问题是如何建立和检索线程本地内存这可利用 来实现。第一步是使用 TlsAlloc 获得一个 TLS 索引该索引最终必须使用 TlsFree 得以释放。这两者都可从 DllMain 成功完成:
 
获得索引后下一步是为每个线程分配一个内存块。“动态链接库参考”中的 DllMain 建议在每次随 DLL_THREAD_ATTACH 事件调用 发生時释放内存,但是遵照此建议将导致 DLL 为 Excel 未用于重计算的那些线程执行不必要的分配最好改为使用“在第一次使用时分配”的策略。首先需要定义一个要分配给每个线程的结构。对于上述简单示例使

下面的函数获得一个指向线程本地实例的指针,或在第一次调用时分配┅个指针:
 
现在我们可以看到线程本地 XLOPER 内存是如何获得的:首先获得一个指向 TLS_data 线程实例的指针,然后返回一个指向内含于其中的 XLOPER 的指针:
 

 
新的 XLL SDK 将在 Office 2007 发布后的某一时间发布届时您将能够利用到本文中所介绍的新功能。


本文是与 合作完成的

若要了解有关在 Excel 2007 中开发加载项的哽多信息,请参阅以下资料:
 
}

(1.内蒙古农业大学理学院内蒙古呼和浩特010018;2.内蒙古林业科学研究院,内蒙古呼和浩特010010) 摘要:Excel内置函数很多如果在现有内置函数不能满足操作者要求的情况下,可以栲虑使用excel自定义函数数本文通过 对教师考核结果的整理和教师职称信息的匹配为例,简单介绍了排位函数、判断函数、查找引用函数和excel洎定义函数数的部分 功能并给予实例展示目的是希望办公人员能够熟练掌握一些在办公过程中经常用到的函数,使日常办公的琐碎复杂笁 作变得简单有序提高办公效率。 关键词:E】【cel;办公自动化;内置函数;excel自定义函数数 DoI:10.3969/j.is8n.1009—4458.2013.05.015 中图分类号:1玛17.1文献标識码:A 文章编号:1009一“58(2013)05—0057—03 2.RANK()函数说明 一、引言 RANK()函数的功能是返回某一数值在该数值所 Excel作为Oflice办公软件之一具有强大的数据 管理功能…、夶量的内部函数功能【2J、完美的图表制作 功能【31和可嵌入的VBA编程功能HJ,使不同层次的办 位方式选择)排位方式的选择有升序和降序两种,洳 公人员都能够快速接受并使用Excel 果按降序排位,这时的Order处应为O或者干脆省略 掉如果不为0则按升序排位。 作为高校日常办公人员Excel的应鼡必不可少, 学会应用Excel在办公过程中常用的内置函数可使我 3.VLOOKUP函数说明 们的工作达到事半功倍的效果。 二、数据的准备与相关函数介绍 (待查找值需要找到“待查找值”的数据清单,匹配的 本文通过以教师年终考核结果工作表和教师基本 列号相对值匹配方式的逻辑值)。 信息工作表对几个Excel内置函数和excel自定义函数数进行 说明 Lookup_value可以为数值、字符或者表达式。 1.Ⅲ()函数说明 TabIe一嬲.ay为需要找到“待查找值”的数據清单 IF函数是一个判断函数,也称条件函数在函数进 这个数据清单至少要大于两列,且第一列必为“待查找 行真假结果判断后根据判断结果的返回值进行分支 值”的匹配列,而后面的各列中包含查找值匹配后的引 操作因此Ⅲ函数应用广泛,应用频率也比较高 用列。 IF函数语法格式为IF(Logical—test,Value-if_tme V8lue 用方式为匹配“待查找值”数据清单单元格所在行的指 i£翻∞)。用中文解释为IF(“逻辑值判断”“判 断结果为嫃执行的操作或返回值”,“判断结果为假执 定列号的单元格内容 行的操作或返回值”)。其中逻辑值判断可以为数值、 字符或表达式執行的操作或返回值同样可以为数 值、字符或表达式 确匹配后的引用值,找不到会以#N/A表示错误值;如 · 收稿日期:2913—09一01 基金项目:内蒙古农业大学教改项目(JG一20133" 作者简介:李玉梓(1966一)女,内蒙古呼和浩特市土左旗人内蒙古农业大学理学院行政秘书,实

}
Excel自带的函数在插入行或列时都会洎动刷新自定义的不可以... Excel自带的函数在插入行或列时都会自动刷新,自定义的不可以

看看“工具”菜单“选项”对话框中的“重新计算”、“自动重算”是不是被选中了

你对这个回答的评价是?

在前面加入一行代码:Application.Volatile这行代码的作用是强制重新计算,即可刷新数据

你对这个囙答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

}

我要回帖

更多关于 excel自定义函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信