【问题标题】:running script through all open worksheets通过所有打开的工作表运行脚本
【发布时间】:2017-03-29 20:33:55
【问题描述】:

我浏览了 excel 书中所有打开的工作表的 4 个其他循环,所有这些循环都在 stackoverflow 上搜索。我对 VBA 很陌生,所以我很难理解如何将这些答案操作到我的代码中。

我想做的是在每个活动工作表中创建一个图表。下面是我在工作表 1 中创建图表的代码(从另一篇文章中找到,并将参数更改为我需要的参数)。它完全按照我的意愿创建图表。我不知道如何在我的代码中引用当前工作表而不是工作表 1,所以我知道这是我的第一个障碍。我确实找到了如何在 https://support.microsoft.com/en-us/kb/142126 上循环,但它只针对 Sheet 1 运行,因为我不知道如何正确更改该参数。

Sub chartcreation()
    Dim sh As Worksheet
    Dim chrt As Chart

    Set sh = ActiveWorkbook.Worksheets("Sheet1")
    Set chrt = sh.Shapes.AddChart.Chart

    With chrt
        'Data?
        .ChartType = xlXYScatterSmooth
        .SeriesCollection.NewSeries
        .SeriesCollection(1).Name = "=Sheet1!B1"
        .SeriesCollection(1).XValues = "=Sheet1!$A$3:$A$630"
        .SeriesCollection(1).Values = "=Sheet1!$B$3:$B$630"

        'Titles
        .HasTitle = True
        .ChartTitle.Text = "=Sheet1!B1"
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = Range("A2")
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = Range("B2")

        'Formatting
        .Axes(xlCategory).HasMinorGridlines = False
        .Axes(xlValue).HasMajorGridlines = True
        .Axes(xlCategory).MinimumScale = 15
        .Axes(xlCategory).MaximumScale = 90
        .Axes(xlValue).HasMinorGridlines = False
        .Axes(xlValue).MinimumScale = 0
        .Axes(xlValue).MaximumScale = 60
        .HasLegend = True

    End With



End Sub

【问题讨论】:

  • 根据您的定义,什么是活动工作表?您一次只能有 1 个活动工作表。
  • Sheet1 中有数据吗?
  • 对不起,我不清楚。我将在一个文件中有 384 张纸,我想循环浏览。因此,每张工作表都包含我要从中创建图表的 A 列和 B 列中的数据。如果我将脚本更改为每个工作表编号,我知道这会起作用,但我想知道循环是否会更简单,所以我没有上述脚本的 384 个副本。
  • 记得添加下次需要的所有信息 ;-) 答案已经给出,很容易改变。

标签: excel loops charts vba


【解决方案1】:

您的代码设置得很好,只需要进行一些更改。首先遍历 ActiveWorkbook 中的所有工作表,然后更改值以引用工作表变量。

Sub chartcreation()
    Dim sh As Worksheet
    Dim chrt As Chart

    For Each sh In ActiveWorkbook.Worksheets
        Set chrt = sh.Shapes.AddChart.Chart

        With chrt
            'Data?
            .ChartType = xlXYScatterSmooth
            .SeriesCollection.NewSeries
            .SeriesCollection(1).Name = sh.Range("B1").Value
            .SeriesCollection(1).XValues = sh.Range("$A$3:$A$630")
            .SeriesCollection(1).Values = sh.Range("$B$3:$B$630")

            'Titles
            .HasTitle = True
            .ChartTitle.Text = sh.Range("B1").Value
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = sh.Range("A2")
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = sh.Range("B2")

            'Formatting
            .Axes(xlCategory).HasMinorGridlines = False
            .Axes(xlValue).HasMajorGridlines = True
            .Axes(xlCategory).MinimumScale = 15
            .Axes(xlCategory).MaximumScale = 90
            .Axes(xlValue).HasMinorGridlines = False
            .Axes(xlValue).MinimumScale = 0
            .Axes(xlValue).MaximumScale = 60
            .HasLegend = True
        End With
    Next
End Sub

测试

【讨论】:

  • 使用sh.Range("B1").Value 将使这些值静态化,这取决于创建图表时单元格中的内容。您需要将它们写成公式,例如... = "='" & sh.Name & "'!B1" 以保留现有功能。
【解决方案2】:

您可以使用

循环浏览表格
Sheets("Sheetname").Select

在那里,您可以将工作表的名称放入砖块中。 或者你可以使用这个:

WS_Count = ActiveWorkbook.Worksheets.Count

这为您提供了工作簿的数量。通过 .Select 你可以一个接一个地选择

【讨论】:

  • 那是个怎样的循环?
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
相关资源
最近更新 更多