VBA-选择包含过去5年日期的单元格

VBA-选择包含过去5年日期的单元格,vba,excel,Vba,Excel,我目前有一个电子表格,在a列中有过去10年的日期(不包括周末和节假日)。例如,A1包含“7/19/2007”,A2520包含“7/19/2017” 列E包含股票间谍在相应日期的收盘价 我试图计算出过去5年的标准差。为了做到这一点,我的想法是编写一个VBA代码,选择今天的日期和前五年,然后用它来计算标准偏差 该清单每天更新,也就是说,明天将包含2017年7月20日和当天的收盘价。我的问题是,我不知道怎么做,所以它会选择今天的日期和过去的五年,然后我可以计算标准偏差 谢谢你们的帮助!抱歉,如果这看起

我目前有一个电子表格,在a列中有过去10年的日期(不包括周末和节假日)。例如,A1包含“7/19/2007”,A2520包含“7/19/2017”

列E包含股票间谍在相应日期的收盘价

我试图计算出过去5年的标准差。为了做到这一点,我的想法是编写一个VBA代码,选择今天的日期和前五年,然后用它来计算标准偏差

该清单每天更新,也就是说,明天将包含2017年7月20日和当天的收盘价。我的问题是,我不知道怎么做,所以它会选择今天的日期和过去的五年,然后我可以计算标准偏差


谢谢你们的帮助!抱歉,如果这看起来很简单,我上周才开始学习VBA

这怎么样?我做了一些假设,比如你的日期是连续的,并且在日期列中没有空单元格。我还假设你的日期是有序的,升序的。(所以你10年前的一天在第10行,今天在第1000行)


根据需要进行更改,即表名(我称之为“股价”)和列。它也有点冗长,可以变得更紧凑,但我想它会帮助你学会保持这样。我建议使用
F8
来查看发生了什么,并取消对
的注释。选择
行,这样您就可以直观地看到它在做什么。

您想如何选择它?射程?您可以使用
SumIfs()
或过滤器吗?你试过什么?嘿!因此,我的想法是,它选择从“今天的日期”开始的单元格范围,并追溯到5年的交易日(大约1260天)。我不能使用SumIfs,至少据我所知,因为我不想把它们全部加起来。我不知道你所说的过滤器是什么意思,我真的不知道如何将它合并到VBA代码中。对不起,如果我不清楚我是新手,我可以澄清更多的问题。谢谢嗯,我想我在上一篇评论中不清楚,我的目标是能够选择这些单元格,然后对其进行偏移,这样我就可以选择价格所在的列。也许有一个更有效的方法,但我不确定我还能做什么。选择此选项后,我的目标是将每个单元格除以前一个单元格,然后减去一个单元格。例如,如果E1是100,E2是110,那么它将是(110/100)-1Hey!哇,太棒了,谢谢你列出了这些步骤,这真的帮助我更好地理解它。我还在研究如何计算出标准偏差,但我相信从这里开始会容易得多。我的一个问题是,我注意到你用了decadeAgo,5年前我还能用它吗?而不是10。5年前,我无法找到VBA用来指代什么。再次感谢你的帮助@vba。初学者-当然!10年前制造它的部分在
函数PY()…
中。看到我的编辑,希望它更清楚!同样,我建议使用
F8
,逐行执行宏,并取消注释
。选择
,这样您可以在Excel中更轻松地查看发生的情况。很高兴它有帮助@vba.初学者-如果你想在5年零3天之前完成,你只需要做
get_Previous_Date=DateSerial(年(Dt)-5,月(Dt),日(Dt)-3)
。如果只需要两个月,
get_Previous_Date=DateSerial(年(Dt)、月(Dt)-2、日(Dt))
。这有意义吗?[注意:我已经更新了该函数名,使其更加直观]@vba.初学者-最后,我几乎肯定Excel中有一个本机
标准偏差
函数。只要看看这个,你就可以走了!举个例子,很抱歉回复太晚,我刚刚可以使用我的电脑。对既然你已经解释过了,那就更有意义了,非常感谢!我将使用标准偏差函数,然后我确信我将能够从中找出它。另一个更离题的问题是,你是如何在VBA方面变得如此出色的?你有没有专门的网站或其他你想了解的东西?我一直在youtube上学习WiseOwl教程,但这只是一个开始。再次感谢你的帮助!
Sub get_difference()
Dim dateRng As Range, cel As Range, priceRng As Range
Dim dateCol As Long, stockCol As Long, lastDate As Range
Dim tdyDate As Date, decadeAgo As Date

dateCol = 1 ' column A has your dates
stockCol = 5

tdyDate = WorksheetFunction.Text(Now(), "mm/dd/yyyy")
decadeAgo = get_Previous_Date(tdyDate)
Debug.Print decadeAgo

With Sheets("Stock Prices") ' change name as necessary
    With .Columns(dateCol)
        Set lastDate = .Find(what:=tdyDate) ' Assuming no break in data from A1
        'lastDate.Select
        Set cel = .Find(what:=decadeAgo)
        'cel.Select
    End With
    Set rng = .Range(.Cells(cel.Row, dateCol), .Cells(lastDate.Row, dateCol))
    'rng.Select
    Set priceRng = rng.Offset(0, stockCol - dateCol)
    'priceRng.Select
    'priceRng.Offset(0, 1).Select
    priceRng.Offset(0, 1).FormulaR1C1 = "=IFERROR((RC[-1]/R[-1]C[-1])-1,"""")"
End With

End Sub
Function get_Previous_Date(Dt As Date) As Date
    ' https://www.mrexcel.com/forum/excel-questions/37667-how-subtract-year-date-2.html
    Dim numYearsBefore as Long, numDaysBefore as Long, numMonthsBefore as Long
    numYearsBefore = 10 ' Change this to any amount of years
    numDaysBefore = 0
    numMonthsBefore = 0
    get_Previous_Date = DateSerial(Year(Dt) - numYearsBefore, Month(Dt) - numMonthsBefore, Day(Dt) - numDaysBefore)
End Function