Excel 可变循环范围

Excel 可变循环范围,excel,vba,Excel,Vba,我有一些vba代码,我想根据布尔值在不同的范围内循环。我希望它看起来像这样: Sub Loop() ActiveSheet.Select Dim LoopScope as Collection If Boolean = True then LoopScope = ActiveSheet.ChartObjects Else LoopScope = Selection End if For Each ChartObject In LoopScope *Some

我有一些vba代码,我想根据布尔值在不同的范围内循环。我希望它看起来像这样:

Sub Loop()

ActiveSheet.Select

Dim LoopScope as Collection

If Boolean = True then
     LoopScope = ActiveSheet.ChartObjects
Else
     LoopScope = Selection
End if

For Each ChartObject In LoopScope
     *Some code*
Next ChartObject

End Sub
错误消息告诉我只能迭代集合对象,这是有意义的,但是我不知道如何将LoopScope设置为集合对象(?)。在键入以下内容时,循环都起作用:

For Each ChartObject in Selection
以及:


我只是不知道如何使作用域依赖于我的布尔值。提前感谢您的时间。

使用后期绑定和错误处理

您缺少的主要内容是
Set
关键字;没有它,您就可以强制对象,[如果幸运的话]最终得到一个内在值类型(例如,
String
Long
,等等)。。。或运行时错误

Dim loopScope As Object

If SomeBoolean Then
    Set loopScope = Selection
Else
    Set loopScope = ActiveSheet.ChartObjects
End If

Dim e As Object, c As ChartObject
On Error GoTo ErrHandler
If TypeOf loopScope Is ChartObject Then '<~ selection was just one chartobject
    Set c = loopScope
    '...<~ work with the selected chart here
Else
    ' let's try iterating the loopscope
    For Each e In loopScope '<~ will blow up if loopScope isn't iteratable
        '... <~ member calls against e are late-bound (resolved at run-time)
        If TypeOf e Is ChartObject Then
            Set c = e '<~ cast e to a known interface
            '... <~ member calls against c are early-bound now
        End If
    Next
End If
Exit Sub '<~ "happy path" ends here

ErrHandler: '<~ "error path" starts here
'... <~ couldn't iterate loopScope.. now what?
Dim loopScope作为对象
如果有的话
设置loopScope=Selection
其他的
设置loopScope=ActiveSheet.ChartObjects
如果结束
将e设置为对象,将c设置为图表对象
关于错误转到错误处理程序

如果TypeOf loopScope是ChartObject,则使用后期绑定和错误处理

您缺少的主要内容是
Set
关键字;没有它,您就可以强制对象,[如果幸运的话]最终得到一个内在值类型(例如,
String
Long
,等等)。。。或运行时错误

Dim loopScope As Object

If SomeBoolean Then
    Set loopScope = Selection
Else
    Set loopScope = ActiveSheet.ChartObjects
End If

Dim e As Object, c As ChartObject
On Error GoTo ErrHandler
If TypeOf loopScope Is ChartObject Then '<~ selection was just one chartobject
    Set c = loopScope
    '...<~ work with the selected chart here
Else
    ' let's try iterating the loopscope
    For Each e In loopScope '<~ will blow up if loopScope isn't iteratable
        '... <~ member calls against e are late-bound (resolved at run-time)
        If TypeOf e Is ChartObject Then
            Set c = e '<~ cast e to a known interface
            '... <~ member calls against c are early-bound now
        End If
    Next
End If
Exit Sub '<~ "happy path" ends here

ErrHandler: '<~ "error path" starts here
'... <~ couldn't iterate loopScope.. now what?
Dim loopScope作为对象
如果有的话
设置loopScope=Selection
其他的
设置loopScope=ActiveSheet.ChartObjects
如果结束
将e设置为对象,将c设置为图表对象
关于错误转到错误处理程序

如果loopScope的类型是ChartObject,那么“您可以在If部分中有一个For/Each,在Else部分中有一个For/Each,您希望在此处选择哪种类型的
?您的
LoopScope
作业是否缺少
Set
?如果那只是伪代码,你能发布你尝试过的实际代码吗?@TimWilliams-选择是一对图形的选择。不幸的是,我不能在这里发布实际的代码,希望你能理解。当我尝试设置LoopScope=ActiveSheet.ChartObjects时,会收到一条“类型不匹配”错误消息。LoopScope被声明为集合。我是否错误地认为问题似乎在于我的LoopScope变量无法与ActiveSheet.ChartObjects交换,因为它的数据类型错误?@Douglancy-是的,如果我尝试运行的代码更短,这将是一个很好的解决方案。然而,有几百行。。。哈哈。您的解决方案需要将所有代码复制到if部分和else部分,如果您明白我的意思的话?我只是尝试运行同样的一百行代码,根据布尔值是真是假,在一个范围内迭代。我考虑过这一点,但认为也许可以将调用的大部分代码放在一个单独的子例程中,它是从if/Else的每个分支调用的。我调用的子例程必须有一个参数来区分调用它的那一半,类似这样的。如果没有看到您的代码,很难确定,但如果不可能,我会感到惊讶。您可以在if部分中有for/Each,在Else部分中有一个for/Each。您希望在这里选择什么类型的
?您的
LoopScope
作业是否缺少
Set
?如果那只是伪代码,你能发布你尝试过的实际代码吗?@TimWilliams-选择是一对图形的选择。不幸的是,我不能在这里发布实际的代码,希望你能理解。当我尝试设置LoopScope=ActiveSheet.ChartObjects时,会收到一条“类型不匹配”错误消息。LoopScope被声明为集合。我是否错误地认为问题似乎在于我的LoopScope变量无法与ActiveSheet.ChartObjects交换,因为它的数据类型错误?@Douglancy-是的,如果我尝试运行的代码更短,这将是一个很好的解决方案。然而,有几百行。。。哈哈。您的解决方案需要将所有代码复制到if部分和else部分,如果您明白我的意思的话?我只是尝试运行同样的一百行代码,根据布尔值是真是假,在一个范围内迭代。我考虑过这一点,但认为也许可以将调用的大部分代码放在一个单独的子例程中,它是从if/Else的每个分支调用的。我调用的子例程必须有一个参数来区分调用它的那一半,类似这样的。如果没有看到您的代码,很难确定,但如果这不可能,我会感到惊讶。谢谢Mathieu。对象声明和Set关键字起了作用。非常感谢你花时间写一篇详尽的解释,它很有魅力。谢谢马修。对象声明和Set关键字起了作用。非常感谢你花时间写了一篇透彻的解释,它很有魅力。