Difference between Calling a Sub and Application.Run

后端 未结 3 1269
广开言路
广开言路 2021-01-21 05:34

In my business, we have a few teams that work on very simple macros. I\'m trying to make them all readable to each other and in somewhat of a similar format, so new joiners can

相关标签:
3条回答
  • 2021-01-21 05:53

    I am posting some of this as an answer, because I cannot comment.

    @ Badja : You said ….” I understand that if your sub has no arguments, then Application.Run has a use – …” I am not sure if you are possibly implying that Application Run can have no arguments? - That is not the case. In principal , you can use arguments with Application.Run just as you can with Call. The syntax and general working of it can be a bit more difficult to understand than with Call. I agree with you , that documentation on Application.Run is very sparse.

    @Hasib_Ibradzic : I was not aware that you can use the Call function with strings. ?? As far as I know, it is one of the advantages of Application.Run over using Call, that the macro name part of the argument is taken as a sting, so that you can build that string up with variables. So you are not limited to hard coding, as I think is the case with using Call

    @Dude_Scott : In your example, I think it is advisable to suggest/ note that including the module code name could be advisable. Without this, you could experience problems if you had Sub routines with the same name in different modules. In your example, this could be advisable to do

    Sub callPriv()
      Application.Run "Module1.priv"
    End Sub 
    

    _._____________

    Some other things that might be useful to Note:

    If you have a macro in another module which is Public, then you can Call it from another module

    For example. In my ( German ) Excel I have in my first normal module , code name Modul1 , ( In English Excel, I think that would typically be by default Module1 ), this

    Public Sub PbicModule1() '
     MsgBox "Pubic Modul1"
    End Sub
    

    And in my first worksheet class code module, code name Tabelle1 ( In English Excel I think that would typically be by default Sheet1 ) , I have this

    Public Sub PbicTabelle1() '
     MsgBox "Pubic Tabelle1"
    End Sub
    

    And in my ThisWorkbook class code , code name DieseArbeitsmappe ( In English Excel , I think that would typically be by default ThisWorkbook ), I have this

    Public Sub PbicThisWorkbook() '
     MsgBox "Pubic ThisWorkbook"
    End Sub
    

    The following macro will work when it is in any module

    Private Sub CallMePubics()   '    https://stackoverflow.com/questions/55266228/difference-between-calling-a-sub-and-application-run
     Call Modul1.PbicModule1
     Call Tabelle1.PbicTabelle1
     Call DieseArbeitsmappe.PbicThisWorkbook
    End Sub
    

    That last macro would fail if the called macros were Private.

    This following macro equivalent using Application.Run , would work regardless of whether the called macros were Public or Private

    Private Sub AppRunMePubics()
     Application.Run Macro:="Modul1.PbicModule1"
     Application.Run Macro:="Tabelle1.PbicTabelle1"
     Application.Run Macro:="DieseArbeitsmappe.PbicThisWorkbook"
    End Sub
    

    So , the conclusion from that is adding slightly to what Dude_Scott said: Application.Run allows you to run, from anywhere, both Private subs and Public subs that are anywhere. Call only allows you to run from anywhere, Public subs that are anywhere

    Ref:
    https://stackoverflow.com/questions/31439866/multiple-variable-arguments-to-application-ontime
    http://excelmatters.com/2017/04/07/passing-arguments-byref-using-run/
    Example Workbook with my coding: MainFile.xls :  https://app.box.com/s/prqhroiqcb0qccewz5si0h5kslsw5i5h 
    http://www.tushar-mehta.com/publish_train/xl_vba_cases/1022_ByRef_Argument_with_the_Application_Run_method.shtml
    
    0 讨论(0)
  • 2021-01-21 06:01

    I use Application.Run if I’m trying to run a sub that is private in another module. If I have a some kind of template where I want to hide the macros from the users I will declare it as private so they can’t run/see the macro from there macros dialog box.

    In module1 I have

    Private Sub priv()
      MsgBox “Private”
    End Suv
    

    In module2 the below will give you a Sub or Function not defined error.

    Sub callPriv()
      Call priv()
    End Sub
    

    But in module2 this will run and display the message box

    Sub callPriv()
      Application.Run “priv”
    End Sub
    

    It’s also useful to use Application.Run if you are calling a sub in your sheet or thisWorkbook modules.

    0 讨论(0)
  • 2021-01-21 06:08

    You can pass parameters through application.run as well. I use it when I am looping through macros. in your above example instead of having to write this:

    Sub button()
      Call sub1()
      Call sub2()
      Call sub3()
      Call sub4()
    End Sub
    

    you could write this:

    for i = 1 to 4
      application.run("sub" & i)
    next i
    

    if the subs took in a str parameter you could do this:

    for i = 1 to 4
      application.run("sub" & i, strVariable)
    next i
    
    0 讨论(0)
提交回复
热议问题