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

时间:2017-07-19 23:35:54

标签: excel vba excel-vba

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

E栏包含相应日期的股票SPY的收盘价。

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

此列表每天更新,意味着明天,它将包含7/20/2017和当天的收盘价。我的问题是我无法弄清楚如何制作它以便选择今天的日期和过去的五年,这样我就可以计算出标准差。

谢谢大家的帮助!对不起,如果这看起来很简单,我上周刚刚开始学习VBA!

1 个答案:

答案 0 :(得分:0)

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

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

根据需要进行更改,即工作表名称(我称之为&#34;股票价格&#34;)和列。它也有点冗长,可以做得更紧凑,但我认为它可以帮助你学会保持这样。我建议您使用F8逐步查看会发生什么,并取消注释.select行,以便您可以直观地看到它在做什么。