Option Explicit
' Run an external macro, passing up to 30 parameters to it.
' Code adapted from: http://www.vbaexpress.com/kb/getarticle.php?kb_id=279
'
Public Function runExternalMacro(strWorkbookName As String, strMacroName As String, Optional arg1 As Variant, Optional arg2 As Variant, Optional arg3 As Variant, Optional arg4 As Variant, _
Optional arg5 As Variant, Optional arg6 As Variant, Optional arg7 As Variant, Optional arg8 As Variant, Optional arg9 As Variant, Optional arg10 As Variant, Optional arg11 As Variant, _
Optional arg12 As Variant, Optional arg13 As Variant, Optional arg14 As Variant, Optional arg15 As Variant, Optional arg16 As Variant, Optional arg17 As Variant, Optional arg18 As Variant, Optional arg19 As Variant, _
Optional arg20 As Variant, Optional arg21 As Variant, Optional arg22 As Variant, Optional arg23 As Variant, Optional arg24 As Variant, Optional arg25 As Variant, Optional arg26 As Variant, _
Optional arg27 As Variant, Optional arg28 As Variant, Optional arg29 As Variant, Optional arg30 As Variant) As Variant
Dim wbTarget As Workbook
Dim boolAlreadyOpen As Boolean
Set wbTarget = OpenExternalWorkbook(strWorkbookName, boolAlreadyOpen, True)
'Check and make sure workbook was opened
If wbTarget Is Nothing Or Err.Number = 1004 Then
MsgBox "Cannot open Macro File " & strWorkbookName & "!"
Exit Function
End If
On Error GoTo 0
ThisWorkbook.Activate
'Run the function or subroutine
runExternalMacro = Application.Run(wbTarget.name & "!" & strMacroName, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, arg26, arg27, arg28, arg29, arg30)
If Not boolAlreadyOpen Then
Application.DisplayAlerts = False
wbTarget.Close savechanges:=False
Application.DisplayAlerts = True
End If
End Function
' Return pointer to workbook opened. Indicate if it was already open
Public Function OpenExternalWorkbook(strWorkbookName As String, ByRef boolAlreadyOpen As Boolean, Optional ReadOnly As Boolean = False) As Workbook
boolAlreadyOpen = True
'Attempt to set the target workbook to a variable. If an error is
'generated, then the workbook is not open, so open it
On Error Resume Next
Set OpenExternalWorkbook = Workbooks(getFilename(strWorkbookName))
If Err.Number <> 0 Then
'Open the workbook
Err.Clear
On Error Resume Next
Set OpenExternalWorkbook = Workbooks.Open(Filename:=strWorkbookName, ReadOnly:=ReadOnly)
boolAlreadyOpen = False
End If
On Error GoTo 0
End Function
What solutions have you found to help manage this sort of issue?
Bookmarks