Не могу загрузить xll программно - PullRequest
3 голосов
/ 07 июля 2010

Я пытаюсь автоматизировать некоторые тесты для надстройки Excel, которая имеет форму xll.У меня есть некоторые проблемы при загрузке 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.Я пытаюсь увидеть, что Excel тайно делает, когда я вручную загружаю xll, записывая макрос.Макрос выглядит так:


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.

Ответы [ 5 ]

3 голосов
/ 19 июля 2010

Спасибо за все предложения.

Я решил проблему, изменив путь к файлу по умолчанию для приложения Excel.

Application.xlApp = new ApplicationClass();
xlApp.DefaultFilePath = "C:\\SomePath";
xlApp.RegisterXLL("Whatever.xll");
2 голосов
/ 07 июля 2010

Да, команда ChDir может быть важной. Это помогает Windows найти любые библиотеки DLL, от которых зависит. Причина, по которой она не решает вашу проблему, заключается в том, что FileSystem.ChDir () меняет рабочий каталог для вашей тестовой программы, а не для Excel.

Не весь хекфалот, который вы можете сделать. Развертывание xll делает каталог, который находится в системной переменной PATH, и решит ее. Прагматичное решение - просто запустить этот макрос.

1 голос
/ 14 ноября 2015

Правильное решение будет:

1 - сохранить текущий каталог с

 string CurrentDir =   Directory.GetCurrentDirectory()

2 - тогда вы используете

  Directory.SetCurrentDirectory(dirXll);

где dirXll - это местоположение вашего xll (см. GetExecutingAssembly ()).

3- Загрузите свой xll (RegisterXLL)

4- и, наконец, используйте CurrentDir, чтобы вернуть текущему каталогу его первоначальное местоположение.

Не забудьте добавить все dll, на которые вы ссылаетесь, в той же папке, что и ваш xll.

1 голос
/ 07 июля 2010

Я знаю, что это не прямой ответ на ваш вопрос, но вы можете посмотреть на использование VSTO в Visual Studio. 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 для пользовательских функций. Что приятно, так это то, что они загружаются в одном домене приложений, чтобы они могли общаться друг с другом.

0 голосов
/ 26 августа 2013

У меня возникли проблемы с загрузкой пользовательской функции [UDF] в код VBA.Был в состоянии загрузить файл xll, но не смог вызвать.

Следующий код успешно загружает файлы XLL, и давайте вызовем пользовательскую функцию из кода VBA.В этом модуле может быть избыточная инструкция, но она работает!

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
...