Почему макрос VBA, который открывает другую книгу, не работает при вызове с dot.net

При работе в 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")

Я вижу, как книга открывается и закрывается, и получаю ответ в окне "Немедленное"

About to open   \\myCompany\myFolder\myWorkbook.xlsx
I found   Cell A1 content

Вызов VBA из BluePrism

В процессе роботизированной автоматизации (RPA) с использованием BluePrism мне нужно открыть книгу, содержащую этот VBA 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 Object Studio. Я запускаю следующие «Действия» этого объекта

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

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: дескриптор, возвращаемый функцией Create Instance
  • filename : \\myCompany\myFolder\myMasterbook.xlsm

Запустить макрос

GetInstance(Handle).Run(Macro_Name)

С участием

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

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


person Dirk Horsten    schedule 13.02.2019    source источник
comment
Установите openBook = Application.Workbooks.Open (book2open) Когда вы запускаете это из C #, что является объектом приложения? Как вы думаете, он может открыть книгу?   -  person Harassed Dad    schedule 13.02.2019
comment
Это приложение Excel, и оно, очевидно, может, потому что оно делает это при вызове из окна imediate.   -  person Dirk Horsten    schedule 13.02.2019
comment
Значит, BluePrism не имеет отношения к вопросу? Например. вопрос может заключаться в как вызвать макрос из C #? Это действительно кажется интересным, поэтому вы можете немного отредактировать его и предоставить некоторый минимальный воспроизводимый пример того, как / что вы пробовали в консольном приложении C #? Кроме того, вы можете сделать свой макрос только одной надежной строкой MsgBox "Something", чтобы обеспечить доступ к нему из C #.   -  person Vityata    schedule 13.02.2019
comment
Скорее всего, поэтому его нет в названии.   -  person Dirk Horsten    schedule 13.02.2019
comment
Непосредственное окно в визуальном основном окне в Excel? Когда у вас запущено приложение Excel? Но вы вызываете свой макрос из BluePrism через MS Excel VBO - Extended - Так есть ли в этот момент запущенный экземпляр Excel? или запущенное приложение является своего рода приложением для хостинга vb? Запускает ли BluePrism Excel?   -  person Harassed Dad    schedule 13.02.2019
comment
Ineed, я сначала создаю экземпляр Excel из BluePrism, а затем открываю книгу с поддержкой макросов. (На самом деле я открываю шаблон с поддержкой макросов.) Все это запускает некоторые фрагменты кода C #, включая GetInstance(Handle).Run(Macro_Name)   -  person Dirk Horsten    schedule 13.02.2019
comment
Вы не можете открыть книгу прямо из Blue Prism? зачем вам открывать книгу, которая открывает другую книгу ?. Кроме того, каково значение book2open при попытке открытия из Голубой призмы?   -  person Zac    schedule 13.02.2019
comment
Я должен назвать этот VBA Sub, потому что он не только копирует данные из источника, но также проверяет и предварительно обрабатывает их.   -  person Dirk Horsten    schedule 14.02.2019
comment
Проблема может быть в вашем формате ввода Macro_Name. Если вы хотите передать путь как строковый параметр в строковом параметре имени макроса, он должен выглядеть так: OpenMyFile (\\ myCompany \ myFolder \ myWorkbook.xlsx).   -  person Damian B    schedule 18.02.2019
comment
В самом деле, вы должны написать "OpenMyFile(""\\myCompany\myFolder\myWorkbook.xlsx"")", чтобы пройти OpenMyFile("\\myCompany\myFolder\myWorkbook.xlsx"). Вот что я делаю.   -  person Dirk Horsten    schedule 19.02.2019
comment
Я понятия не имею, почему это не работает, однако вы можете попробовать обходной путь, чтобы указать путь. Вместо того, чтобы передавать путь через подпараметр, передайте его в файл Excel с макросом (например, в 1-ю ячейку 1-го листа) с помощью действия «Установить значение ячейки», затем получите путь из ячейки в макросе (book2open = ThisWorkbook.Sheets (1). Cells (1, 1) .Value) и используйте его, чтобы открыть целевую книгу.   -  person Damian B    schedule 19.02.2019


Ответы (1)


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

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

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

GetInstance(Handle).Run(Macro_Name, param1)

где Macro_Name - "OpenMyFile", а param1 - "\\ myCompany \ myFolder \ myWorkbook.xlsx"

person MacroMarc    schedule 20.02.2019