3

我正在尝试对 xll 形式的 Excel 加载项自动进行一些测试。我在加载 xll 时遇到了一些问题。我正在用 C# 编写它,我的代码如下所示:


using Microsoft.Office.Interop.Excel;

Application xlApp;
Workbook xlWorkBook;
Worksheet xlWorkSheet;

// create application, open workbook, etc ...
// now try to register xll
xlApp.RegisterXLL("C:\\SomePath\\Whatever.xll");

但是,这总是返回 false。当我通过录制宏手动加载 xll 时,我尝试查看 Excel 偷偷做了什么。宏看起来像:


Sub Macro1()
ChDir "C:\SomePath"
Application.RegisterXLL Filename:= _
"C:\SomePath\Whatever.xll"
End Sub

唯一的区别似乎是 ChDir,所以我将代码更改为:


FileSystem.ChDir("C:\\SomePath");
xlApp.RegisterXLL("C:\\SomePath\\Whatever.xll");

但它仍然不起作用。另一个奇怪的事情是,当我在 RegisterXLL 行之前放置一个断点并首先手动加载 xll 时,RegisterXLL 方法将返回 true。但否则,它将返回 false。

4

5 回答 5

3

感谢所有的建议。

我通过更改 Excel 应用程序的默认文件路径解决了这个问题。

Application.xlApp = new ApplicationClass();
xlApp.DefaultFilePath = "C:\\SomePath";
xlApp.RegisterXLL("Whatever.xll");
于 2010-07-19T13:18:34.870 回答
2

是的,ChDir 命令可能很重要。它可以帮助 Windows 找到 any.xll 所依赖的任何 DLL。它不能解决您的问题的原因是 FileSystem.ChDir() 更改了您的测试程序的工作目录,而不是 Excel。

不是你能做到的。部署 xll 执行系统 ​​PATH 上的目录将解决它。一个务实的解决方案是只运行该宏。

于 2010-07-07T16:32:03.543 回答
1

我知道这不是您问题的直接答案,但您可能想看看在 Visual Studio 中使用 VSTO。VSTO 自动化了许多此类问题。VS 2010 中的版本比以前的版本要好得多,您可以构建应用程序级别的插件,而不仅仅是文档级别的插件。如果您需要用户定义的函数,您可以使用如下所述的 COM 插件:

http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx

它最初基于这篇文章:

http://blogs.msdn.com/eric_carter/archive/2004/12/01/273127.aspx

我们将 VSTO 组合用于我们的主应用程序,并将 COM 插件用于用户定义的功能。这样做的好处是它们被加载在同一个应用程序域中,因此它们可以相互交谈。

于 2010-07-07T18:55:10.200 回答
1

一个适当的解决方案是:

1-保存当前目录

 string CurrentDir =   Directory.GetCurrentDirectory()

2-然后你使用

  Directory.SetCurrentDirectory(dirXll);

其中 dirXll 是您的 xll 的位置 (cf GetExecutingAssembly()) 。

3-加载您的 xll (RegisterXLL)

4-最后使用 CurrentDir 将当前目录设置回其原始位置。

不要忘记将您 xll 所依赖的所有 dll 添加到与您的 xll 相同的文件夹中。

于 2015-11-14T02:29:32.037 回答
0

我在 VBA 代码中加载用户定义函数 [UDF] 时遇到问题。能够加载 xll 文件但无法调用。

以下代码成功加载 XLL 文件,让我们从 VBA 代码中调用用户定义的函数。这个模块中可能有reducendent指令,但它有效!

Sub InstallAddIn()

On Error GoTo ErrorHandle

Application.DefaultFilePath = "D:\\MyFolder"

Application.RegisterXLL ("MyXLLFileName.xll")

Set AI = AddIns.Add(Filename:="D:\MyFolder\MyXLLFileName.xll")

    If AddIns("MyXLLFileName").Installed Then
       LogInformation ("My XLL is installed")
    Else
       LogInformation ("My XLL is NOT installed")
    End If
Exit Sub

ErrorHandle:

LogInformation ("------------------------") 'Logging function that I have written. Not a std api

LogInformation (Err.HelpFile)

LogInformation (Err.HelpContext)

LogInformation (Err.Description)

LogInformation ("Error in InstallAddIn module")

LogInformation ("------------------------")

End

End Sub
于 2013-08-26T13:29:05.217 回答