从更新的结果生成柱形图

时间:2018-01-26 15:29:00

标签: excel excel-vba charts commandbutton column-chart vba

以下代码根据今天的日期(日期已在A列中手动编写)找到合适的行,并将数据插入同一行。我需要将最后一个结果(今天' s日期)添加到名为" charts"的其他工作表的柱形图中。

Sub Worksheets_Summary()
Dim OldSheet As Worksheet
Dim NewSheet As Worksheet
Dim Cell As Range
Dim ColNum As Integer
Dim RwNum As Long
Dim book As Workbook
Set book = ThisWorkbook
Set NewSheet = book.Worksheets("Summary")
RwNum = NewSheet.Columns(1).Find(Date).Row
ColNum = 1
For Each OldSheet In book.Worksheets
    If OldSheet.Name <> "Summary" Then
        ColNum = ColNum + 1

        NewSheet.Cells(1, ColNum).Formula _
    = "=HYPERLINK(""#""&CELL(""address"",'" & OldSheet.Name & "'!A1)," _
         & """" & OldSheet.Name & """)"


        NewSheet.Cells(RwNum, ColNum).Value = OldSheet.Range("B11").Value
    End If
Next OldSheet

NewSheet.UsedRange.Columns.AutoFit

End Sub

注意:图表中仅显示新结果。

这是代码运行后的摘要工作表: Summary sheet

这是代码运行后的仪表板工作表: Dashboard Sheet

2 个答案:

答案 0 :(得分:0)

好的,看看这是否适合您:

Sub Worksheets_Summary()
    Dim OldSheet As Worksheet
    Dim NewSheet As Worksheet
    Dim Cell As Range
    Dim ColNum As Integer
    Dim RwNum As Long
    Dim book As Workbook

    Dim MyChart As Chart
    Dim MyRange As Range
    Dim Range1 As Range
    Dim Range2 As Range
    Dim chartSheet As Worksheet


    Set book = ThisWorkbook
    Set NewSheet = book.Worksheets("Summary")
    RwNum = NewSheet.Columns(1).Find(Date).Row
    ColNum = 1
    For Each OldSheet In book.Worksheets
        If OldSheet.Name <> "Summary" Then
        ColNum = ColNum + 1

        NewSheet.Cells(1, ColNum).Formula _
         = "=HYPERLINK(""#""&CELL(""address"",'" & OldSheet.Name & "'!A1)," _
         & """" & OldSheet.Name & """)"


        NewSheet.Cells(RwNum, ColNum).Value = OldSheet.Range("B11").Value
        End If
    Next OldSheet

    NewSheet.UsedRange.Columns.AutoFit


    Set chartSheet = book.Worksheets("charts")

    Set MyChart = chartSheet.Shapes.AddChart(xlColumnClustered).Chart 'This is similar to the way I saw it done on the link I included.
        'You could use activesheet instead of chartsheet.

    Set Range1 = NewSheet.Range("A1:D1") ' Get Header from Summary Sheet
    Set Range2 = NewSheet.Range("A" & RwNum & ":D" & RwNum) ' Get most recent data row from Summary Sheet
    Set MyRange = Union(Range1, Range2)



    MyChart.SetSourceData source:=MyRange 'Use MyRange for the chart.

    MyChart.SeriesCollection(1).Name = Range("A" & 2).Value 'Get the date and use it as the chart title.


End Sub

我以为你已经有了一张名为&#34; chart&#34;的表,所以我没有创建一张。我还假设只将Sheet Summary中最新的行复制到图表工作表中,并且现有数据已被覆盖。

我还假设您开始使用的代码已经在更新摘要表。

我用它来了解如何使用VBA创建图表:[https://www.mrexcel.com/forum/excel-questions/650547-create-column-chart-through-vba-automatically.html]

答案 1 :(得分:0)

想要一种非VBA方法,一旦你设置了它,你就永远不会弄乱它吗?

我们将使用一些名称(也称为命名范围)来引用数据。

我认为包含您正在绘制的数据的工作表是&#34;摘要&#34;。

转到“公式”选项卡,“定义名称”。在名称中,输入Labels;适用范围,保留工作簿;在“参考”中,输入=Summary!$B$1:$E$1。单击Enter。

返回定义名称。在名称中,输入Name;在“参考”中,输入=OFFSET(Summary!$A$1,COUNT(Summary!$A:$A),0)。这将返回A1下方的行数与A1中的值一样多的单元格。

最后一次返回定义名称。在名称中,输入Values;在“参考”中,输入=OFFSET(Labels,COUNT(Summary!$A:$A),0)。这将返回范围,该范围是我们在上面命名的Labels范围之下的多个行,作为A列中值的数量。

现在选择Summary!A1:D2并在摘要表上插入柱形图。该图表显示了第一个日期的值。选择列并查看系列公式。它应该这样说:

=SERIES(Summary!$A$2,Summary!$B$1:$D$1,Summary!$B$2:$D$2,1)

编辑此公式以阅读

=SERIES(Summary!Name,Summary!Labels,Summary!Values,1)

Excel接受您的更改。由于名称的范围是工作簿,Excel将系列公式更改为:

=SERIES(Book1.xlsm!Name,Book1.xlsm!Labels,Book1.xlsm!Values,1)

(或者您工作簿的名称)。