【问题标题】:VBA - Source data from multiple sheetsVBA - 来自多个工作表的源数据
【发布时间】:2017-12-01 00:03:27
【问题描述】:

我正在尝试使用来自多个工作表的源数据创建一个新图表。无论工作表如何,数据都将始终位于同一列中。但是,我想从开头永久两张表之后的每张表中选择来自Range("F2", Range("F2").End(xlDown)) 的数据。

我想从中提取数据的工作表将用作图表的源数据,该图表将在添加新工作表时创建和删除,并且将重复循环。

因此,例如,我希望它从上面指定的范围内从表 3 到 52 或任何数量的表中获取数据,以便它成为一个有凝聚力的来源。我不确定是否有一种很好的方法可以在不使用隐藏工作表的情况下做到这一点。提前致谢。

Private Sub Locations()
Set Build = Charts.Add(After = Worksheets("Report"))
    With Build
        .SetSourceData
        .ChartType = xlColumnClustered
    End With
End Sub

【问题讨论】:

  • (你错过了End With
  • @BruceWayne - 很抱歉,它非常未完成,我只是提供我目前所拥有的。
  • 如果您打算在 2 个轴上绘图,大概您有不止一列?还是将一个默认为 1、2、3 等?
  • @QHarr - 是的,X 轴将是建筑物的名称,Y 轴将是建筑物名称在范围内的单元格中使用的次数
  • 如果您确定工作表顺序,您可以从 3 循环到 sheet.count(只有 2 个前面的工作表)调用提取所需范围并粘贴到“主”合并范围中的下一个可用行的子程序.然后另一个子创建图表。否则循环检查工作表名称不像 A 或 B(您要排除的两个)。

标签: vba excel charts excel-charts


【解决方案1】:

我的代码可以循环遍历 Sheet3 并将 B 列中的所有数据(不包括标题)添加到数组中,然后您可以使用该数组将值绘制到图表中吗?

Sub foo()
Dim wb As Workbook
Dim ws As Worksheet
Dim Myarray() As Variant
y = 0

For Each ws In ThisWorkbook.Worksheets
    If ws.Name <> "Sheet1" Then
        If ws.Name <> "Sheet2" Then
             LastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
             Counter = Counter + LastRow
             ReDim Preserve Myarray(Counter)
             For Each cell In ws.Range("B2:B" & LastRow)
                 Myarray(y) = cell.Value
                 y = y + 1
             Next cell
        End If
    End If
Next ws

如果您想将数组的内容写入帮助表:

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "Temp"
For p = 1 To UBound(Myarray)
    Sheets("Temp").Cells(p, 1).Value = Myarray(p - 1)
Next p

然后找到最后一行并将范围放入SetSourceData中以更新图表。

【讨论】:

【解决方案2】:

如果您拥有 Excel 2016 或更高版本,那么“数据”选项卡的“获取和转换”部分下的新 PowerQuery 功能非常适合此功能。 (在以前的版本中,PowerQuery 作为 Microsoft 提供的免费插件提供,您必须安装)。

有关如何使用它来混合来自多个工作表的数据的示例,请参见以下链接: excel indirect function to read dates and return dynamic values 从那里开始,制作数据透视表和数据透视图是一项简单的任务,它可以自动引入新的工作表,而无需用户进行任何更改。

【讨论】:

    【解决方案3】:

    我可以通过使用隐藏表来简化情况

    Private Sub Locations()
    
    Dim ws As Worksheet, rep As Worksheet, LastRow As Double
    With ThisWorkbook
        For n = 1 To Sheets.Count
            Set ws = Worksheets(n)
            Set rep = Worksheets("Report")
            LastRow = rep.Range("C1", rep.Range("C1").End(xlDown)).Rows.Count
            If IsNumeric(ws.Name) Then
                If rep.Range("C1") = "" Then
                    ws.Range("F2", ws.Range("F2").End(xlDown)).Copy _
                    Destination:=rep.Range("C1")
                Else:
                    ws.Range("F2", ws.Range("F2").End(xlDown)).Copy _
                    Destination:=rep.Range("C" & LastRow)
                End If
            End If
        Next n
    End With
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多