使用VBAselect单元格的dynamic范围并创build图表

我正在尝试使用VBA创build使用dynamic范围的图表。 具体来说,我有一个Excel table如下

数据表

根据这些数据,我想创build一个图表,date范围根据需要更改。 例如,有一次,我要求在7月1日至7月6日以及7月10日至7月14日的另一天。

以下是我创build这样的图表的尝试,但是我觉得除了我之外还有更好的方法。 因此,我的问题是,还有其他更好的办法吗?

1-我首先在要查找图表的“帮助单元”中inputdate值。 在这种情况下,单元M24的值是7月10日,而单元M26的值是7月14日。

2-然后,我使用match()函数来查找我的表的date列的位置。 函数是=MATCH(M24,Table1[Dates],0)=MATCH(M26,Table1[Dates],0)

3-鉴于我有date的相对位置,然后我使用下面的VBA代码来生成图表:

 Private Sub CommandButton1_Click() Dim mySheet As Worksheet Dim myShape As Shape Dim myChart As Chart Dim myVal1 As String Dim myVal2 As String Set mySheet = ActiveWorkbook.Worksheets("dataSheet") If myShape Is Nothing Then Set myShape = mySheet.Shapes.AddChart(XlChartType:=xlColumnClustered, _ Left:=CommandButton1.Left + CommandButton1.Width + 2, _ Width:=370, Height:=200) End If 'In the following, I am offsetting from the first cell 'of my Table, which contains the `value 1-Jul. 'My objective is to use the range 10-Jul to 14th Jul, 'so I also add a column offset 'Cells O24 and O26 contain the results of the match functions myVal1 = Range("B4").Offset(Range("O24").Value, 0).Address myVal2 = Range("B4").Offset(Range("O26").Value, 4).Address Set myChart = myShape.Chart myChart.ChartType = xlLine myChart.SetSourceData Source:=Sheets("dataSheet") _ .Range(CStr(myVal1 & ":" & myVal2)) End Sub 

所以呢,现在希望我的问题很清楚,有人可以教育我一个比这个更好的方法吗? 这似乎是比正确的编码更多的黑客手段…

提前谢谢了!

正如戴夫所说,这是相当稳固的。 但是你可以试试这个:

 Private Sub CommandButton1_Click() Dim d1 As Range, d2 As Range Dim ws As Worksheet: Set ws = Thisworkbook.Sheets("datasheet") '~~> Look for the dates With ws.Range("Table1[Dates]") Set d1 = .Find(ws.Range("M24").Value, .Cells(.Cells.Count)) Set d2 = .Find(ws.Range("M26").Value, .Cells(.Cells.Count)) End With '~~> Handle unavailable dates, interchanged inputs Dim i As Long, j As Long If d1 Is Nothing Or d2 Is Nothing Then MsgBox "Invalid coverage": Exit Sub If d2.Value > d1.Value Then i = 0: j = 4 Else i = 4: j = 0 '~~> Set the chart source Dim chsource As Range Set chsource = ws.ListObjects("Table1").HeaderRowRange Set chsource = Union(chsource, ws.Range(d1.Offset(0, i), d2.Offset(0, j))) '~~> Clean up existing chart Dim sh As Shape For Each sh In Me.Shapes If sh.Type = msoChart Then sh.Delete Next '~~> Create the chart With Me.Shapes.AddChart(, Me.CommandButton1.Left + _ Me.CommandButton1.Width + 2, Me.CommandButton1.Top, _ 370, 200).Chart .ChartType = xlLine .SetSourceData chsource .SetElement msoElementChartTitleAboveChart .ChartTitle.Text = "Trend Chart" End With End Sub 

您仍然分别在M24和M26上检索date,但不需要在公式中使用其他范围。
如果没有find值,则返回一个消息框。
只要finddate,它将创build图表,无论用户放在哪里。
另外我做了两种访问表的方法,1是使用Range ,另一种是使用ListObjects
这是有意为你得到两者的挂钩。 有时候一个比另一个好。
另外我明确地使用Me (这涉及到包含您的CB的表单)。
我也认为你的图应该有正确的图例,而不是系列(x)的名字,所以我把头添加到源。 HTH。

在我的教程图表variables端点之间的部分范围 ,我显示了一些使用定义的名称,没有VBA的替代品。 一种方法只是将第一个和最后一个logging的索引包含在图表中,另一个方法使用匹配来查找在用户input的date开始和结束的logging范围。