VBA应用程序。运行宏时,参数存储在Excel单元格中
我在Excel单元格中存储了一些宏名称 我循环遍历这些单元格,并调用其中编写的宏,如下所示 [通过正确提供参数,从另一个子例程调用下面的子例程。] 当宏没有参数时,它可以正常工作。但当它尝试运行存储在单元格中的以下宏时,会生成错误 JumpToNextCtl、ws、ctlGrpName、activeTbx 该宏应该从子例程“SelectAppsToRun”获取其参数ws、ctlGrpName和activeTbx 它应该运行的代码是:VBA应用程序。运行宏时,参数存储在Excel单元格中,excel,vba,Excel,Vba,我在Excel单元格中存储了一些宏名称 我循环遍历这些单元格,并调用其中编写的宏,如下所示 [通过正确提供参数,从另一个子例程调用下面的子例程。] 当宏没有参数时,它可以正常工作。但当它尝试运行存储在单元格中的以下宏时,会生成错误 JumpToNextCtl、ws、ctlGrpName、activeTbx 该宏应该从子例程“SelectAppsToRun”获取其参数ws、ctlGrpName和activeTbx 它应该运行的代码是: Sub JumpToNextCtl(ws As Wor
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将所有参数都作为字符串。是否仍要运行此方法?请尝试使用下一种方案:
子:
Sub
可能如下所示:Subs
: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