VBA代码来根据单元格中用户定义的variables来select列

我正在尝试在VBA的excel中为我的macros编写代码,但是我一直卡在用户定义的variables部分。 我目前有一个电子表格,其中包含四组对应于一个date的测量数据。

我试图达到的是:
– 开始date有一个单元格,用户指定结束date的另一个单元格; 我想要macros读取这两个单元格,并使用这两个date,读取它们之间的数据,并创build一个与我有4个数据系列这些date对应的线图。

最终目标是能够在用户希望的两个date之间创build一个图表。

我已经想出了macros来绘制线图,如果我指定整个列(即我已经把B3:F170作为数据范围),但我不知道如何将用户定义的范围集成在代码中。

任何帮助将不胜感激。 提前谢谢了。

编辑:这是我到目前为止,对不起,如果它相当凌乱,我刚刚开始!

Dim chtChart As Chart Set chtChart = Charts.Add With chtChart .Name = "Chart Name" .ChartType = xlLine .SetSourceData Source:=Sheets("Sheet1").Range("B3:F170"),_ PlotBy:=xlColumns End With Dim FromDateCell As String Dim ToDateCell As String Dim DateRange As Range FromDateCell = Range("I13").Value ToDateCell = Range("I14").Value DateRange = Range(FromDateCell, ToDateCell) Range(DateRange).Select 

您可以首先设置所需的数据范围,然后将其分配为新的图表Source ,如下所示:

 Option Explicit Sub main() Dim chtChart As Chart Dim FromDateCell As Range, ToDateCell As Range, DataRange As Range With Sheets("Sheet1") '<--| reference your relavant sheet Set FromDateCell = .Range("B3:B170").Find(.Range("I13").Value, LookIn:=xlValues, lookat:=xlWhole) '<--| get "initial date" cell in range B3:B170 Set ToDateCell = .Range("B3:B170").Find(.Range("I14").Value, LookIn:=xlValues, lookat:=xlWhole) '<--| get "final date" cell in range B3:B170 Set DataRange = Range(FromDateCell, ToDateCell).Resize(, 5) '<--| set the "data" range as the one ranging form "initial date" to "final date" cells extended to enclose four columns to the right End With Set chtChart = Charts.Add With chtChart .Name = "Chart Name" .ChartType = xlLine .SetSourceData Source:=DataRange, PlotBy:=xlColumns End With End Sub 

相同的代码可以重写(即重构 )使用特定的函数来获得想要的范围,并让您的代码更具可读性,整个代码更易于维护

如下所示:

 Sub main() Dim chtChart As Chart Set chtChart = Charts.Add With chtChart .Name = "Chart Name" .ChartType = xlLine .SetSourceData Source:=GetDataRange, PlotBy:=xlColumns '<--| here you use GetDataRange() function to return the wanted range End With End Sub Function GetDataRange() As Range Dim FromDateCell As Range, ToDateCell As Range With Sheets("Sheet 1") Set FromDateCell = .Range("B3:B170").Find(.Range("I13").Value, LookIn:=xlValues, lookat:=xlWhole) Set ToDateCell = .Range("B3:B170").Find(.Range("I14").Value, LookIn:=xlValues, lookat:=xlWhole) Set GetDataRange = .Range(FromDateCell, ToDateCell).Resize(, 5) End With End Function 

我认为你可以通过使用命名的范围很简单地实现这一点。 用公式定义一个命名范围

 =OFFSET(A8:E200,0,<column>) 

input该数据系列作为graphics的input范围

 =<sheet1>! <name> 

将<和>之间的所有值replace为适用于您的任何值。 请参阅https://support.microsoft.com/en-us/kb/183446上的完整参&#x8003;

您也可以使用偏移公式与索引/匹配组合来查找开始/结束点以获取数据的子集。