Excel > 函数参考
使用 CALL 和 REGISTER 函数

本主题中的部分内容可能不适用于某些语言。

要点  注意   错误编辑注册表可能严重损坏操作系统,使得需要重新安装操作系统。Microsoft 不保证能解决由错误编辑注册表引起的问题。编辑注册表前,请首先备份所有有用的数据。有关使用和保护计算机注册表的最新信息,请参阅 Microsoft Windows 帮助。

本文介绍 Microsoft Excel 中 CALLREGISTERREGISTER.ID 函数 (函数:函数是预先编写的公式,可以对一个或多个值执行运算,并返回一个或多个值。函数可以简化和缩短工作表中的公式,尤其在用公式执行很长或复杂的计算时。)的公式语法和用法。

说明

以下说明了 CALLREGISTERREGISTER.ID 函数所使用的参数和返回值的数据类型。在不同的操作环境中,参数和返回值略有不同,这些不同均标注在数据类型表中。

数据类型

CALLREGISTERREGISTER.ID 函数中,type_text 参数指定返回值的数据类型以及 DLL 函数或代码源的所有参数的数据类型。type_text 的第一个字符指定返回值的数据类型,其余字符表示所有参数的数据类型。例如,如果返回浮点数的 DLL 函数以整数和浮点数作为参数,则 type_text 参数应为“BIB”。

下表给出一个完整列表,内容包括:Microsoft Excel 能识别的数据类型代码、每个数据类型的说明、参数或返回值的传送方式以及 C 语言中数据类型的典型声明。

代码 说明 传递方式 C 语言中的变量声明
A 逻辑值
(FALSE = 0), TRUE = 1)
short int
B IEEE,8 字节浮点数 数值
(Windows)

引用 (Macintosh)

double
(Windows)

double * (Macintosh)

C NULL 结尾字符串(字符串最大长度 = 255 个字符) 引用 char *
D 字节计数字符串(第一个字节包含字符串的长度,字符串最大长度 = 255 个字符) 引用 Unsigned char *
E IEEE,8 字节浮点数 引用 double *
F NULL 结尾字符串(字符串最大长度 = 255 个字符) 引用(在原地修改) char *
G 字节计数字符串(第一个字节包含字符串的长度,字符串最大长度 = 255 个字符) 引用(在原地修改) unsigned char *
H 无符号 2 字节整数 unsigned short int
I 带符号 2 字节整数 short int
J 带符号 4 字节整数 long int
K 数组 引用 FP *
L 逻辑值
(FALSE = 0, TRUE = 1)
引用 short int *
M 带符号 2 字节整数 引用 short int *
N 带符号 4 字节整数 引用 long int *
O 数组 引用 传递 3 个参数:
unsigned short int *
unsigned short int *
double [ ]
P Microsoft Excel OPER 数据结构 引用 OPER *
R Microsoft Excel XLOPER 数据结构 引用 XLOPER *

说明

其他数据类型的信息

本部分包含有关 F、G、K、O、P 和 R 数据类型的详细信息,以及有关 type_text 参数的其他内容。

F 和 G 数据类型

使用 F 和 G 数据类型,函数可以修改由 Microsoft Excel 分配的字符串缓冲区。如果返回值类型代码为 F 或 G,则 Microsoft Excel 将忽略由该函数返回的值。但是,Microsoft Excel 将搜索函数参数表以查找第一个对应的数据类型(F 或 G),然后将分配的字符串缓冲区的当前内容作为返回值。Microsoft Excel 为该参数分配 256 个字节,这样该函数返回的字符串可能比它接收的字符串大。

K 数据类型

K 数据类型使用一个指针指向一个大小可变的 FP 结构。必须在 DLL 或代码源中定义该结构,如下所示:

typedef struct _FP
{
    unsigned short int rows;
    unsigned short int columns;
    double array[1];        /* Actually, array[rows][columns] */
} FP;
		

double array[1] 声明只为单元素数组分配存储空间。实际数组中的元素个数等于行数乘以列数。

O 数据类型

O 数据类型只能用作参数,而不能作为返回值,它传递三项:指向数组中行数的指针、指向数组中列数的指针以及指向浮点数的二维数组的指针。

函数可修改由 O 数据类型传递的数组来取代返回一个数值。若要实现这一点,请将“>O”作为 type_text 参数。有关详细信息,请参阅下面的“在原地修改,函数声明为 Void”。

创建 O 数据类型是为了直接与通过引用传递参数的 Fortran DLL 兼容。

P 数据类型

P 数据类型是一个指向 OPER 结构的指针。OPER 结构包含 8 字节数据,后面跟着一个指定数据类型的 2 字节标识符。使用 P 数据类型,DLL 函数或代码源可以读取并返回任意 Microsoft Excel 数据类型。

OPER 结构的定义如下:

typedef struct _oper

{
    union
    {
        double num;
        unsigned char *str;
        unsigned short int bool;
        unsigned short int err;
        struct
        {
            struct _oper *lparray;
            unsigned short int rows;
            unsigned short int columns;
        } array;
    } val;
    unsigned short int type;
} OPER;
		

类型字段包含下列值之一:

类型 说明 要使用的 Val 字段
1 数值 num
2 字符串(第一个字节包含字符串长度) str
4 布尔型(逻辑值) bool
16 错误,错误值为:

0#NULL!

7#DIV/0!

15#VALUE!

23#REF!

29#NAME?

36#NUM!

42#N/A

err
64 数组 array
128 丢失参数
256 空白单元格

最后的两个数值只能用作参数,不能作为返回值。当调用程序省略参数时,则传递丢失参数值 (128)。当调用程序将引用传递给一个空白单元格时,则传递空白单元格值 (256)。

R 数据类型—从 DLL 中调用 Microsoft Excel 函数

R 数据类型是一个指向 XLOPER 结构的指针,XLOPER 结构是 OPER 结构的增强版本。在 Microsoft Excel 4.0 及更高版本中,可以使用 R 数据类型来编写调用 Microsoft Excel 函数的 DLL 和代码资源。使用 XLOPER 结构,DLL 函数除了传递数据外,还可以传递工作表引用并实现流控制。对 R 数据类型和 Microsoft Excel 应用程序编程接口 (API) 的完整说明不在本主题讨论的范围之内。《Microsoft Office XP 开发人员指南》给出了有关 R 数据类型、Microsoft Excel API 以及 Microsoft Excel 的其他技术的详细信息。

可变函数和重新计算

Microsoft Excel 通常只在 DLL 函数输入到单元格时、在函数的引用单元格之一更改时或者在使用宏的过程中计算单元格时,才计算 DLL 函数(或代码源)。在工作表中,可以将 DLL 函数或代码源设置成可变的,这意味着每次工作表重新计算时,都会对该函数进行重新计算。若要使函数成为可变的,请在 type_text 参数中添加一个感叹号 (!) 作为最后一个字符。

例如,在 Microsoft Excel for Windows 中,每次工作表重新计算时,都要对下列工作表公式进行重新计算:

CALL("Kernel32","GetTickCount","J!")

在原地修改,函数声明为 Void

可以使用一位数字 n 作为 type_text 中的返回类型代码,此处 n 为 1 到 9 之间的数字。这将使 Microsoft Excel 对 type_text 中第 n 个参数指向的位置中的变量进行修改,而不返回值。这也被称为在原地修改。第 n 个参数必须是由引用传递的数据类型(C、D、E、F、G、K、L、M、N、O、P 或 R)。DLL 函数或代码源也必须在 C 语言中用关键字 Void 声明(或者在 Pascal 语言中用关键字 procedure)。

例如,以 null 为终止的字符串和两个指向整数的指针作为参数的 DLL 函数可以在原地修改字符串。用“1FMM”作为 type_text 参数,并将函数声明为 void。

在 Microsoft Excel 4.0 以前的版本中,用 > 字符在原地修改第一个参数,而无法修改第一个参数以外的其他参数。在 Microsoft Excel 4.0 及更高版本中,> 字符等价于 n = 1。

xl

请参阅