VBA通过修改For i Next i简化代码

时间:2016-10-27 17:07:11

标签: excel vba excel-vba

我正在简化一系列不必要复杂的陈述。我希望使用For i程序简化下面的示例,但我不确定如何增加我的语句范围以影响工作表上更多对象的可见性(这可能是一个简单的解决方案,我错过了某种方式,隧道视觉今天可能有效。)

实施例: Sheet1包含135个图表对象,它们以下列模式标记:

A1Z
A2Z
A3Z
A4Z
A5Z
A6Z
A7Z
A8Z
A9Z

B1Z
B2Z
B3Z
B4Z
B5Z
B6Z
B7Z
B8Z
B9Z

依此类推,直至表格中的最终对象," O9Z"。

当前在工作表上分配了一个CommandButton_Click事件按钮,该按钮调用这些(丑陋)程序,其编写如下:

If Sheet2.Range("D12").Value = "A1Z" Then
            Sheets("Charts").ChartObjects("A1Z").Visible = True
            Sheets("Charts").ChartObjects("A2Z").Visible = False
            Sheets("Charts").ChartObjects("A3Z").Visible = False
            Sheets("Charts").ChartObjects("A4Z").Visible = False
            Sheets("Charts").ChartObjects("A5Z").Visible = False
            Sheets("Charts").ChartObjects("A6Z").Visible = False
            Sheets("Charts").ChartObjects("A7Z").Visible = False
            Sheets("Charts").ChartObjects("A8Z").Visible = False
            Sheets("Charts").ChartObjects("A9Z").Visible = False
            Sheets("Charts").ChartObjects("B1Z").Visible = False
            Sheets("Charts").ChartObjects("B2Z").Visible = False
            Sheets("Charts").ChartObjects("B3Z").Visible = False
            Sheets("Charts").ChartObjects("B4Z").Visible = False
            Sheets("Charts").ChartObjects("B5Z").Visible = False
            Sheets("Charts").ChartObjects("B6Z").Visible = False
            Sheets("Charts").ChartObjects("B7Z").Visible = False
            Sheets("Charts").ChartObjects("B8Z").Visible = False
            Sheets("Charts").ChartObjects("B9Z").Visible = False

我可以使用For i语句简化这个膨胀过程有点

If Sheet2.Range("D12").Value = "A1Z" Then
Dim i As Integer
For i = 2 To 9
Sheets("Charts").ChartObjects("A" & i & "Z").Visible = False
Sheets("Charts").ChartObjects("A1Z").Visible = True
Next i

我的程序的一个问题是,它只会影响对象A2Z到A9Z的可见性而不影响对象B1Z-O9Z。

我相信除了i之外还可以添加第二个变量来循环遍历范围内的每个字母" A"," B"," C&# 34;," D"等等#" O"并调整For i语句以考虑它,以便工作表上的每个对象与If语句中的引号中的值不匹配(在此示例中," A1Z")被隐藏。

我不确定采用哪种方法来解释这个字母范围。

2 个答案:

答案 0 :(得分:2)

尝试循环遍历所有图表对象。

Dim cht As ChartObject
For Each cht In Sheets("Chart").ChartObjects
    cht.Visible = cht.Name = "A1Z"
Next cht

如果您希望可见的图表是动态的,那么:

Dim cht As ChartObject
For Each cht In Sheets("Chart").ChartObjects
    cht.Visible = cht.Name = Sheet2.Range("D12").Value
Next cht

答案 1 :(得分:0)

你可以尝试使用for each loop

来尝试这样的事情
Dim chartObj As ChartObject, strTest As String

strTest = Sheet2.Range("D12").Value

    For Each chartObj In Sheets("Charts").ChartObjects
        If chartObj.Name = strTest Then
            chartObj.Visible = True
        Else
            chartObj.Visible = False
        End If
    Next chartObj

对于每个循环,您可以遍历集合中的每个对象,例如,您可以为表格中的每个工作表执行此操作