2015-12-01 39 views
1

我有两列是我在图表中使用的信息,它根据我选择的时间范围而变化。主要问题是列的长度可能不同,它可以是5行,当我选择另一个时间段时,它可以是7行或更少,然后是5.图表中的数据是刷新的,但列数不是,例如,我的数据是这样的:如何在数据更改时更新图表?

Tom 20 
Susan 30 
John 15 

因此图表将有三列,并根据第一列中的值,它们的颜色是不同的,但是当我选择的时间数据变化的另一个时期:

Peter 40 
Patrick 70 
Joe 36 
Megan 57 
Susan 74 

现在图表将包含只有前三个名称的三列:彼得,帕特里克,乔和列的颜色将与第一个图表相同。

我希望很容易理解我的问题,最主要的是图表的可视化不会像它应该的那样改变。我添加了一部分代码:

Sub Macro1() 

    Dim MyRangex As Range 
    Dim LastRow As Long 
    Dim ChartRange1 As Range 

    LastRow = Worksheets("Calculate").Cells(Rows.Count, "E").End(xlUp).row 

    Set MyRangex = Worksheets("Calculate").Range("E2:E" & LastRow) 
    Set ChartRange1 = Sheets("Calculate").Range("G2:G" & LastRow) 

    ActiveChart.SeriesCollection(1).Select 
    ActiveChart.SeriesCollection(1).XValues = MyRangex 
    ActiveChart.SeriesCollection(1).Values = ChartRange1 

    For i = 1 To Worksheets("Calculate").Cells(9, 10).value 
     ActiveChart.SeriesCollection(1).Points(i).Select 
     Select Case Worksheets("Calculate").Cells(i + 1, 5).value 
      Case Is = "Tom" 
       With Selection.Format.Fill 
        .Visible = msoTrue 
        .ForeColor.RGB = RGB(255, 0, 0) 
        .Transparency = 0 
        .Solid 
       End With 
      Case Is = "Susan" 
       With Selection.Format.Fill 
        .Visible = msoTrue 
        .ForeColor.RGB = RGB(0, 176, 240) 
        .Transparency = 0 
        .Solid 
       End With 
      Case Is = "Joe" 
       With Selection.Format.Fill 
        .Visible = msoTrue 
        .ForeColor.RGB = RGB(255, 255, 0) 
        .Transparency = 0 
        .Solid 
       End With 
      Case Is = "John" 
       With Selection.Format.Fill 
        .Visible = msoTrue 
        .ForeColor.RGB = RGB(191, 191, 191) 
        .Transparency = 0 
        .Solid 
       End With 
     End Select 
    Next i 
End Sub 
+0

请问,您如何选择期限?是否有一些特定的单元格输入新的时期?或者是否有某种与控制相关的宏,它更新了表格“计算”中的信息?这是什么控制? – ZygD

+0

还有另一张包含所有信息的工作表,您可以在其中选择从中选择数据的时间段。然后在工作表“计算”中计算一些信息,例如,每个人到商店有多少次,如果他没有在该时间段访问该商店,他不在列表中,因此列表正在改变。一切都是用很多代码完成的...... –

+0

是总是在同一列中的数据,只是具有不同数量的行,具体取决于时间段? –

回答

0

您应该使用Worksheet_Change事件。它必须驻留在工作表模块中。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Me.Range("C2"), Target) Is Nothing Then 
     MsgBox "data in C2 was changed" 
    End If 
End Sub 

在这个例子中的MsgBox当在小区C2数据被改变才会出现。根据你如何改变你的新时期,这部分应该改变。


如果手动或自动更新周期不管,我相信下面的代码会为你工作。 (除非有下这些名字的公式。)

的使用需求:
1.将此代码您工作模块内(不出现录制宏后定期模块)。
2.将图表重命名为“MyChartName”或将代码中的该名称替换为实际图表名称

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim MyRangex As Range 
    Dim LastRow As Long 
    Dim ChartRange1 As Range 
    Dim i As Long 
    Dim mySeries As Series 

    If Not Intersect(Me.Range("E2:E100"), Target) Is Nothing Then 

     LastRow = Worksheets("Calculate").Cells(Rows.Count, "E").End(xlUp).Row 

     Set MyRangex = Worksheets("Calculate").Range("E2:E" & LastRow) 
     Set ChartRange1 = Sheets("Calculate").Range("G2:G" & LastRow) 
     Set mySeries = ActiveSheet.ChartObjects("MyChartName").Chart.SeriesCollection(1) 

     mySeries.XValues = MyRangex 
     mySeries.Values = ChartRange1 

     For i = 1 To Worksheets("Calculate").Cells(9, 10).Value 
      With mySeries.Points(i).Format.Fill 
       Select Case Worksheets("Calculate").Cells(i + 1, 5).Value 
        Case Is = "Tom" 
         .Visible = msoTrue 
         .ForeColor.RGB = RGB(255, 0, 0) 
         .Transparency = 0 
         .Solid 
        Case Is = "Susan" 
         .Visible = msoTrue 
         .ForeColor.RGB = RGB(0, 176, 240) 
         .Transparency = 0 
         .Solid 
        Case Is = "Joe" 
         .Visible = msoTrue 
         .ForeColor.RGB = RGB(255, 255, 0) 
         .Transparency = 0 
         .Solid 
        Case Is = "John" 
         .Visible = msoTrue 
         .ForeColor.RGB = RGB(191, 191, 191) 
         .Transparency = 0 
         .Solid 
       End Select 
      End With 
     Next 
    End If 
End Sub 
+0

我已经试过这个,但它没有解决我的问题... –

+0

@MiglėPapuškaitė - 我将你的代码合并到'Worksheet_Change'事件中。请现在再试一次。我也做了一些小的优化。 – ZygD

+0

谢谢,它帮助了我。 –

相关问题