VBA应用程序。运行宏时,参数存储在Excel单元格中

VBA应用程序。运行宏时,参数存储在Excel单元格中,excel,vba,Excel,Vba,我在Excel单元格中存储了一些宏名称 我循环遍历这些单元格,并调用其中编写的宏,如下所示 [通过正确提供参数,从另一个子例程调用下面的子例程。] 当宏没有参数时,它可以正常工作。但当它尝试运行存储在单元格中的以下宏时,会生成错误 JumpToNextCtl、ws、ctlGrpName、activeTbx 该宏应该从子例程“SelectAppsToRun”获取其参数ws、ctlGrpName和activeTbx 它应该运行的代码是: Sub JumpToNextCtl(ws As Wor

我在Excel单元格中存储了一些宏名称

我循环遍历这些单元格,并调用其中编写的宏,如下所示

[通过正确提供参数,从另一个子例程调用下面的子例程。]

当宏没有参数时,它可以正常工作。但当它尝试运行存储在单元格中的以下宏时,会生成错误

JumpToNextCtl、ws、ctlGrpName、activeTbx

该宏应该从子例程“SelectAppsToRun”获取其参数ws、ctlGrpName和activeTbx

它应该运行的代码是:

    Sub JumpToNextCtl(ws As Worksheet, ctlGrpName As String, Optional activeTbx As MSForms.TextBox, Optional activeCbx As MSForms.ComboBox, Optional chkBx As MSForms.CheckBox)

       Dim shp As Shape, i As Integer, ctlname As String
       Dim ctlColl As New Collection
    
         For Each shp In ws.Shapes.Range(ctlGrpName).GroupItems
                
           If shp.Type = msoOLEControlObject Then
        
               If TypeName(shp.OLEFormat.Object.Object) = "TextBox" Or _
                    TypeName(shp.OLEFormat.Object.Object) = "ComboBox" Or _
                        TypeName(shp.OLEFormat.Object.Object) = "CheckBox" Then
                
                      ctlColl.Add shp.OLEFormat.Object
                
               End If
        
           End If
    
         Next sh

    End Sub
我收到的错误消息是:

无法运行宏“JumpToNextCtl”、ws、ctlGrpName、activeTbx”。该宏可能在此工作簿中不可用,或者可能已禁用所有宏


我猜Application.Run将所有参数都作为字符串。是否仍要运行此方法?

请尝试使用下一种方案:

  • 调用“SelectAppsToRun”的主
  • 测试“SelectAppsToRun”
    Sub
    可能如下所示:
  • 要从“SelectAppsToRun”调用(使用对象参数)的以下
    Subs
  • 打开即时窗口(Ctrl+G,在VBE中),单击“MainCall”内的
    Sub
    并按
    F8
    逐行运行代码
  • Sub
    将调用
    SelectAppsToRun
    ,传递三个参数(一个字符串和两个对象)。然后,将使用三个参数调用两个test
    子函数(testCall1和testCall2)中的每一个


    这不是你需要实现的吗?如果是,很高兴我能帮忙。如果没有,请描述此场景与您的需求不匹配的地方。

    评论不用于扩展讨论;此对话已结束。并非所有宏都具有相同的参数。有些宏根本没有任何参数。@AvinEswar:那么,请告诉我们您是如何想象您尝试的解决方案可能会起作用的。为了不浪费我们的时间,请编辑您的问题并尝试向我们展示您尝试的解决方案。甚至是一个虚拟的。从理论上讲,子系统中可以有一些条件根据(比如)最后一个参数来选择参数。但是,即使我有一些想象力,我觉得我在浪费时间去想象你的想象…@AvinEswar:那么,请再看一下标题,也许你会用这种方式解决你的问题。我甚至无法想象,您将对象参数作为字符串放在您命名的“存储在单元格中的宏”中,并认为它可能会工作。这可能是一个解决方案,使一个数组的对象和他们的字符串等效于另一个,但热看到这是什么,我开始觉得我在浪费我的时间试图帮助你。我可能会删除我的答案。我只是在想这可能对其他人有帮助。。。
        Sub JumpToNextCtl(ws As Worksheet, ctlGrpName As String, Optional activeTbx As MSForms.TextBox, Optional activeCbx As MSForms.ComboBox, Optional chkBx As MSForms.CheckBox)
    
           Dim shp As Shape, i As Integer, ctlname As String
           Dim ctlColl As New Collection
        
             For Each shp In ws.Shapes.Range(ctlGrpName).GroupItems
                    
               If shp.Type = msoOLEControlObject Then
            
                   If TypeName(shp.OLEFormat.Object.Object) = "TextBox" Or _
                        TypeName(shp.OLEFormat.Object.Object) = "ComboBox" Or _
                            TypeName(shp.OLEFormat.Object.Object) = "CheckBox" Then
                    
                          ctlColl.Add shp.OLEFormat.Object
                    
                   End If
            
               End If
        
             Next sh
    
        End Sub
    
    Sub MainCall()
      SelectAppsToRun "This is a call. It is ", ActiveSheet, ActiveWorkbook
      SelectAppsToRun "This is a call. It should be ", ActiveSheet, , True
    End Sub
    
    Sub SelectAppsToRun(ctlGrpName As String, ws As Worksheet, Optional wb As Workbook, Optional boolOK As Boolean)
           Dim arrProc, El
           
           arrProc = Split("testCall1,testCall2", ",") 'this may be considered the equivalent of cell range values
               For Each El In arrProc
                   Application.Run El, ctlGrpName, ws, wb, boolOK
               Next
    End Sub
    
    Sub testCall1(strTest, sh As Worksheet, Optional wb As Workbook, Optional boolOK As Boolean)
       Debug.Print strTest & " It is the first", "The sheet name is " & sh.name
       If Not wb Is Nothing Then Debug.Print wb.Path
       If boolOK Then Debug.Print "The situation looks good..."
    End Sub
    
    Sub testCall2(strTest, sh As Worksheet, Optional wb As Workbook, Optional boolOK As Boolean)
       Debug.Print strTest & " It is the second", "Range ""A1"" value is " & sh.Range("A1").Value2
       If Not wb Is Nothing Then Debug.Print wb.fullName
       If boolOK Then Debug.Print "The situation is good..."
    End Sub