excelvba';dim作为变量';韩元';不允许';每个';循环

excelvba';dim作为变量';韩元';不允许';每个';循环,excel,vba,charts,foreach,Excel,Vba,Charts,Foreach,我的代码有点麻烦。我试图删除占用同一合并单元格的图表,但出现错误。如果未将ScrapChart设置为variant,则代码不会为AllChartsInBox()中的每个ScrapChart编译,但如果尝试运行ScrapChart,则会出现运行时错误91。删除 为什么必须将Scrapchart设置为变体,但是SheetChart在Ws_Charts.ChartObjects中的每个SheetChart的循环中都可以正常工作,如果它被设置为ChartObject option explicit Di

我的代码有点麻烦。我试图删除占用同一合并单元格的图表,但出现错误。如果未将ScrapChart设置为variant,则代码不会为AllChartsInBox()中的每个ScrapChart编译
,但如果尝试运行
ScrapChart,则会出现运行时错误91。删除

为什么必须将Scrapchart设置为变体,但是SheetChart在Ws_Charts.ChartObjects中的每个SheetChart的
循环中都可以正常工作,如果它被设置为ChartObject

option explicit
Dim NumberofChartsinRange, ChartBoxIndex As Long
Dim SheetChart, AllChartsInBox() As ChartObject
Dim ScrapChart As Variant

Set Chartbox = Ws_Charts.Range("A1:F6")
Ws_Charts.Cells(1,1).Formula2 = formulastring

Chartbox.Merge
Chartbox.HorizontalAlignment = xlRight
Chartbox.VerticalAlignment = xlBottom

NumberofChartsinRange = 0

If Ws_Charts.ChartObjects.Count = 0 Then

Else

    ReDim AllChartsInBox(Ws_Charts.ChartObjects.Count - 1)
    
    For Each SheetChart In Ws_Charts.ChartObjects
        If Not Intersect(SheetChart.TopLeftCell, Chartbox) Is Nothing Then
            NumberofChartsinRange = NumberofChartsinRange + 1
            Set AllChartsInBox(ChartBoxIndex) = SheetChart: ChartBoxIndex = ChartBoxIndex + 1
        End If
    Next
End If

If NumberofChartsinRange > 1 Then
    For Each ScrapChart In AllChartsInBox
        ScrapChart.Delete
    Next ScrapChart
End If

您可以通过ChartObjects集合的单个过程完成此操作:

Dim SheetChart,co作为ChartObject,ChartBox作为Range
将tmp设置为ChartObject,将foundOne设置为Boolean,将i设置为Long
Set ChartBox=Ws_charts.Range(“A1:F6”)
Ws_charts.Cells(1,1).Formula2=formulastring
图表框,合并
ChartBox.HorizontalAlignment=xlRight
ChartBox.VerticalAlignment=xlBottom
对于i=Ws_charts.ChartObjects.Count到1步骤-1
Set co=Ws_charts.ChartObjects(i)
如果不相交(co.TopLeftCell,ChartBox)则为空
如果没有找到一个,那么“找到第一个图表”?
设置tmp=co
foundOne=True
其他的
'多个图表-删除第一个图表和此图表。。。
如果不是tmp,则tmp.Delete
公司删除
如果结束
如果结束
接下来我

通常情况下,阵列上的每个
循环都不使用
。更重要的是,数组的元素可能是
Nothing
,因为它的元素数与
Ws\u图表的元素数相同。ChartObjects
,但您可能没有将所有ChartObject添加到数组中。同样重要的是:您需要重复变量类型,否则它是
Variant
Dim NumberofChartsinRange,ChartBoxIndex尽可能长
等等。您正在迭代一个数组-为…下一个
循环使用一个
。使用集合而不是数组可能更容易-无需担心调整大小,除非在结尾需要一个额外的
End If
,这很有效。缺少的
End If
在哪里?在结尾需要3个'End If'语句,在
For…Next
循环期间,您打开了3个'If'语句。
如果不是tmp,则tmp.Delete
是一行
如果
并且如果
不需要结束
结束…您是正确的,我没有意识到tmp.Delete和co.Delete不在同一
如果
中,我忘记了单行
If
s