基于恒定年度数据填充每小时数据

时间:2018-05-30 03:58:02

标签: excel

我想从仅包含年份和值的表中获取值,并将这些值输入到由每年的每小时日期时间组成的表中。

我尝试使用嵌套的if else语句检查日期时间是否包含特定日期(有点像C语言中的switch语句或Python中的字典)但是我有大约30年的数据并使用if else语句获取毛很快。

示例:

Input Data Table:
Year   Value
2018    100
2019    200
2020    300

Output Data Table:
 Datetime     Value
01/01/2018     100
02/01/2018     100
03/01/2018     100
...../2018     100
01/01/2019     200
02/01/2019     200
03/01/2019     200
...../2019     200
01/01/2020     300
02/01/2020     300
03/01/2020     300
...../2020     300

感谢。

2 个答案:

答案 0 :(得分:0)

您可以使用VLOOKUP函数和DATE函数来查找与给定年份匹配的第一个值,如下所示:

=VLOOKUP(DATE(A1,1,1),$B$1:$C$10,2,FALSE)

其中A1是包含数字年2018的单元格,而B1:C10是一个范围,左边是日期,旁边是要查找的值。 2表示返回第二列。 FALSE表示"完全匹配" ,或者如果您想要近似匹配,则可以是TRUE

更多信息:

答案 1 :(得分:0)

这是一个使用正则表达式找到模式dd / mm / yyyy然后从中提取日期的答案。然后使用字典返回该年的值。

代码:

Option Explicit

Public Sub PopulateValues()

    Dim inputDict As Object
    Set inputDict = CreateObject("Scripting.Dictionary")
    inputDict.Add "2018", 100
    inputDict.Add "2019", 200
    inputDict.Add "2020", 300

    Dim valuesArr(), i As Long
    Application.ScreenUpdating = False

    With ActiveSheet '<== change to actual sheet name reference
        valuesArr() = .Range("A2:B" & .Cells(.Rows.Count, "A").End(xlUp).Row).Value '<== Based on datetime column; find last row; Assumes header row to skip
        For i = LBound(valuesArr, 1) To UBound(valuesArr, 1)
            valuesArr(i, 2) = inputDict(GetYear(valuesArr(i, 1)))
        Next i
        .Range("B2").Resize(UBound(valuesArr, 1), 1) = Application.WorksheetFunction.Index(valuesArr, 0, 2)
    End With
    Application.ScreenUpdating = True
End Sub

Public Function GetYear(ByVal inputString As String) As String

    Dim regex As Object, tempString As String
    Set regex = CreateObject("VBScript.RegExp")

    With regex
        .Global = True
        .IgnoreCase = False
        .Pattern = "(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}"
    End With

    If regex.test(inputString) Then
       GetYear = Right$(regex.Execute(inputString)(0), 4)
    Else
       GetYear = inputString
    End If

End Function

示例测试数据:

Test data