VBA代码,用于根据单元格

时间:2016-12-17 01:00:19

标签: excel vba excel-vba macros

我正在尝试使用VBA在Excel中为我的宏编写代码,但我一直卡在用户定义的变量部分。我目前有一个电子表格,其中包含四组与一个日期相对应的测量数据。

我想要达到的目的是:
- 一个单元格用于开始日期,另一个单元格用于由用户指定的结束日期;我想要宏来读取这两个单元并使用这两个日期,读取它们之间的数据,并使用我拥有的4个数据系列创建与这些日期对应的折线图。

最终目标是能够在用户希望的两个日期之间创建图表。

如果我指定整个列,我已经想出了绘制线图的宏(即我已经将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

2 个答案:

答案 0 :(得分:1)

您可以先设置所需数据范围,然后将其指定为新图表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

答案 1 :(得分:0)

我认为你可以通过使用命名范围来实现这一点。使用公式

定义命名范围
=OFFSET(A8:E200,0,<column>)

输入数据系列作为图表的输入范围

=<sheet1>! <name>

替换&lt;之间的所有值。和&gt;适用于你的任何东西。请参阅https://support.microsoft.com/en-us/kb/183446

的完整参考

您还可以将偏移公式与索引/匹配结合使用,以查找起始/结束点,以获取数据的子集。