在 Excel VBA 中使用 NAG DLLs

Microsoft Excel 的用户,可以利用 NAG 的动态链接库增加其 Excel 的分析能力。 其中的秘密就是在 Excel 工作表中加入合适的宣告语句 (Declare statements)。

以 Fortran 语言为基础的动态链接库尤其适合应用于 Excel 中。Fortran 语言中的基本数据型态,如 INTEGER、LOGICAL 与 DOUBLE PRECISION 都可以直接与 Excel 的 Long、Long 与 Double 相对应。除此之外,Fortran 的矩阵储存方式也与 Excel 中所使用的规范一致。所以,一般来说,NAG Fortran 函数能够很容易的与 Excel 进行沟通。

C 语言的动态链接库就稍微有点复杂,因为需要考虑较为复杂的参数。但是,NAG C 算法库的函数也可以与 Excel 进行沟通。 为了要简化由 C 语言的结构与数据型别,能够方便对应到 Visual Basic 语言中,我们提供了 相关资讯,可以直接下载。

利用 Excel 调用 NAG 函数

如果你在 Excel 中开启一个全新的活页簿,默认会显示三个工作表,你可以在每一个字段中输入数值或公式。若要在 Excel 加入程序代码, 您必须要打开 Visual Basic 的工作簿。在新版的 Excel 中,您可以透过 开发工具 / Visual Basic 开启 (或按 ALT+F11)。 接着您必须透过 插入 新建模块。(有经验的用户可以在 类模块 中使用 NAG 函数。但我们先不再本文中讨论。)


我们在此文中为简化说明起见,我们使用 NAG Fortran 函数 S14AAF,产品代码为 FLDLL224ML

  • 复制 S14AAF 函数的 Declare statement 内容。
    位于 C:\Program Files\NAG\FL22\fldll224ml\vb_headers 目录中的 vb6.txt 文件。
    位于第 28178 行。
  • 打开 Excel 工作簿,开启 模块
  • 贴上 S14AAF 的 Declare statement 于模块中
  • 若有需要,修改 Declare statement 内容

要特别注意的是,DLL 的路径必须要在环境变量 PATH 中;若没有您必须自行设定。

接着,因为是使用 Fortran DLL,您必须要在模块最上方加上 'Option Base 1',表明任何 VBA 中的矩阵都是以索引 1 为开始,让 VBA 可以兼容于 Fortran 函数。 我们也强烈建议加上 'Option Explicit' 语句。它能确保任何的 VBA 变量必须先进行宣告。

与 C 语言不同,VBA 矩阵储存是以 column 为主,完全兼容于 Fortran 语言。有经验的 VBA 设计人员,可以很简单的在符合宣告语句中所载明的方式, 使用 Fortran 函数。

最简单调用 S14AAF 函数的方式,就是直接在 Excel 中使用。您可以将 Module1 模块代码关闭,回到原来的 Sheet1 中, 接着选择其中一个单元格,点选 插入函数,在 选取类别 中选择 用户定义 即可看到 S14AAF 函数。

接着在弹出的窗口中,于 X 处填入 1.25,于 IFAIL 填入 0,至此您可以看见输出的结果为 0.906402477。

因为 Fortran 中的 CHARACTER 与 VB 中的字符串型态并不完全兼容,所以必须要在宣告语句中使用 ByVal,紧随着字符串使用, 用另一个参数指定字符串的长度且以 long 为其数据型别,也以 ByVal 参数指定。幸运的是,NAG 函数通常只会在输入参数中使用字符串, 而不会在输出参数中使用,所以其他复杂问题都可避免。复数数据型态可以利用用户定义方式设定:

Type COMPLEX
      REAL_PART As Double
      IMAG_PART As Double
End Type

您可以另外参考在 Visual Basic 中调用 NAG DLL 函数的说明。