Почему макрос VBA, открывающий другую книгу, не работает при вызове из dot.net - PullRequest
0 голосов
/ 13 февраля 2019

При работе в BluePrism у меня проблема с запуском макроса Excel, который открывает другую книгу.

Процедура Excel-VBA

У меня есть Sub в книге Excel с поддержкой макросов\\myCompany\myFolder\myMasterbook.xlsm, который открывает другую рабочую книгу

Public Sub OpenMyFile(Optional book2open As String = "")
    Dim openedBook As Workbook
    Debug.Print "About to open", book2open

    Set openedBook = Application.Workbooks.Open(book2open)
    If openedBook Is Nothing Then
        Debug.Print "Could not open it"
    Else
        Debug.Print "I found", openedBook.Worksheets(1).Cells(1, 1).Value
        ' Actually, I do a lot more with that workbook, of course
        openedBook.Close
    End If
End Sub

Когда в окне Immidiate (которое вы открываете с помощью Ctrl-G), я ввожу

call OpenMyFile ("\\myCompany\myFolder\myWorkbook.xlsx")

Я вижу книгу открытой и закрытойи получить ответ в окне «Немедленно»Sub и запустите его.В окне Immidiate я теперь получаю

About to open   \\myCompany\myFolder\myWorkbook.xlsx
Could not open it

Я пробовал две вещи, чтобы решить его

Вызов без аргументов

Если я определяю свой Sub в VBA как

Public Sub OpenMyFile(Optional book2open As String = "\\myCompany\myFolder\myWorkbook.xlsx")

и вызовите его с OpenMyFile, но это не решает мою проблему, так как мне нужно , чтобы передать book2open в VBA.

Сделать параметробязательный

Если я определяю Sub в VBA как Public Sub OpenMyFile(book2open As String'), я получаю эту ошибку: `Internal: Не удалось выполнить этап кода, поскольку исключение выдается этапом кода: Невозможно запустить макрос

'OpenMyFile ("C: \ Users \ P01549 \ Documents \ TestHorsten.xlsx", -1) ".Макрос может быть недоступен в этой книге или все макросы могут быть отключены.

Объект MS Excel VBO - Extended использует взаимодействие

Часть кода dot.net можно найти в BluePrisms Объектная студия .Я запускаю следующие «Действия» этого объекта

Создать экземпляр

Dim excel as Object = CreateObject("Excel.Application")

' Create a GUID with which we can kill the instance later
' if we have to play hardball to get rid of it.
excel.Caption = System.Guid.NewGuid().ToString().ToUpper()

handle = GetHandle(excel)

Открыть книгу

Dim wb as Object = GetInstance(handle).Workbooks.Open(filename)
name = wb.Name
wb.Activate()

С

  • handle: дескриптор, возвращаемый экземпляром создания
  • filename: \\myCompany\myFolder\myMasterbook.xlsm

Запуск макроса

GetInstance(Handle).Run(Macro_Name)

с

  • handle: дескриптор, возвращенный экземпляром создания
  • Macro_Name: OpenMyFile("\\myCompany\myFolder\myWorkbook.xlsx")

У кого-нибудь есть объяснение или обходной путь?

1 Ответ

0 голосов
/ 20 февраля 2019

Обычно Application.Run принимает параметры для функций в качестве отдельных аргументов:

Этот аргумент не подходит для Application.Run: OpenMyFile("\\myCompany\myFolder\myWorkbook.xlsx")

Вы можете попытаться изменитьVBO, чтобы иметь параметр запуска с аргументами: напишите еще один этап кода под названием «Запуск макроса с параметром» (или как вы хотите его называть)

GetInstance(Handle).Run(Macro_Name, param1)

, где Macro_Name равно «OpenMyFile»", а param1 это" \\ myCompany \ myFolder \ myWorkbook.xlsx "

...