Возврат нескольких значений из одного файла .xlsm в другой - PullRequest
0 голосов
/ 31 января 2020

Я использую макрос в одном файле Excel для вызова макроса из другого файла Excel.

Я хочу вернуть несколько значений, но получаю ошибки.

Вот процесс flow:

macroFile1 Sub1 (вызывает macroFile2 Sub3 и передает аргументы) -> macroFile2 Sub3 (выполняет некоторый процесс и, как ожидается, вернет несколько значений в macroFile1 Sub1)

macroFile1 Sub1 вызывает macroFile2 Sub3, но macroFile2 Sub3 не возвращает значения.

Я пробовал следующие методы:

method1:

'(macroFile1)
returnCodes = Application.Run("'" & macroFileName & "'!pasteCapture", _
                  thisWorkbookName, selectedFile, cmntText, workingSheet, _
                  cmntRowNum, cmntColNum, imgRowNum, imgColNum, size, clrTyp)

Ошибка при выполнении:

Ошибка компиляции: невозможно присвоить массиву

method2:

'(macroFile1)          
Sub 1 
'(This sub is going to call macroFile2 Sub3, and macroFile2 Sub3 is 
'going to do some process, and then return values to the following Sub2.)

Application.Run "'" & macroFileName & "'!pasteCapture", _
                thisWorkbookName, selectedFile, cmntText, workingSheet, _
                cmntRowNum, cmntColNum, imgRowNum, _
                imgColNum, size, clrTyp

'thisWorkbookName is the absolute path of the file containing macroFile1. 
'I am passing this to 'macroFile2 Sub3 so that I can call 
'macroFile1 Sub2 from macroFile2 Sub3.

End Sub

Sub 2 
'(I wrote this sub so that I can receive return codes from macroFile2 Sub3. 
'This sub is right below
'macroFile1 Sub1.)

Sub getReturnCodes(extError, fileNotFound, opnError, worksheetNotFound, _
              rowNotNumeric, rowOutOfScope, colNotNumeric, colOutOfScope, _
              sizeNotNumeric, sizeOutOfScope, incorrectClrTyp, success)

If success = 0 Then
    MsgBox "Successful", vbOKOnly
Else
    MsgBox "Error", vbOKOnly
End If

End Sub

'(macroFile2)
Sub 3 
'(This sub will receive multiple arguments from macroFile1 Sub1, 
'process them, and call macroFile1 Sub2 to pass multiple return values.)

'Some process...

Application.Run "'" & calledBy & "'!getReturnCodes", _
           extError, fileNotFound, opnError, worksheetNotFound, rowNotNumeric, _
           rowOutOfScope, colNotNumeric, colOutOfScope, sizeNotNumeric, sizeOutOfScope, _
           incorrectClrTyp, success

End Sub

Ошибка при выполнении:

Макрос может быть недоступен в этой книге или все макросы могут быть отключены

I хотите передать несколько значений в качестве возвращаемых значений в macroFile1. Мне разрешено передавать их на Sub1 или Sub2 (я также пытался изменить Sub2 на функцию, но ошибка произошла в Application.Run).

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Если макрос находится в sheet1, вы можете использовать "! Sheet1.subname", ту же ссылку, которая показана в верхней части экрана разработчика.

0 голосов
/ 31 января 2020

Это работает для меня

В RunIt.xlsm:

'Calls "DoSomething" in workbook "Callee.xlsm", and passes in a callback
Sub Start()
    Dim CallBack As String

    CallBack = "'" & ThisWorkbook.Name & "'!CallbackTarget" 

    Application.Run "Callee.xlsm!DoSomething", CallBack, "hello", "there"

End Sub

'Called from "DoSomething" in "Callee.xlsm" to return some values, using the callback
Sub CallBackTarget(arg1, arg2, arg3)
    Debug.Print "In CallBackTarget", arg1, arg2, arg3
End Sub

В Callee.xlsm:

Sub DoSomething(CallBack, arg1, arg2)

    Debug.Print "In DoSomething", arg1, arg2
    'do some work...
    Application.Run CallBack, "someValue", 44, "otherValue"

End Sub
'----------------------------------------

Однако вы можете просто вернуть массив значений Start непосредственно из DoSomething (после создания функции), и это было бы намного проще:

Вызов рабочей книги:

Sub TestGetArray()
    Dim arr
    arr = Application.Run("Callee.xlsm!GetArray")
    Debug.Print arr(1)
End Sub

Вызываемая рабочая книга:

Function GetArray()
    GetArray = Array("one", "two", "Three")
End Function

Еще один подход, пока мы обсуждаем эту тему: этот позволяет полностью забыть о Run.

В модуле кода ThisWorkbook вызываемой книги (примечание эти методы Public):

Public Sub DoSomething(arg1, arg2)
    Debug.Print "Called with:", arg1, arg2
End Sub

Public Function ReturnSomething(arg1, arg2)
    ReturnSomething = "Returning: " & arg1 & ", " & arg2
End Function

Public Sub ReturnValuesByRef(v1, v2)
    v1 = "new"
    v2 = "value"
End Sub

В книге вызовов:

Sub TestDirectCalls()

    Dim wb As Object  
    Set wb = Workbooks("Callee.xlsm") 'Get a reference to the workbook
                                      '  you want to call methods in

    wb.DoSomething "value1", 25                     'call a sub

    Debug.Print wb.ReturnSomething("value1", 25)    'call a function

    Dim v1, v2
    wb.ReturnValuesByRef v1, v2           'return values via byref args
    Debug.Print "Returned - ", v1, v2

End Sub

Здесь вы вызываете методы непосредственно в другой книге, избегая некоторых ограничений Application.Run.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...