我想从仅包含年份和值的表中获取值,并将这些值输入到由每年的每小时日期时间组成的表中。
我尝试使用嵌套的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
感谢。
答案 0 :(得分:0)
您可以使用VLOOKUP
函数和DATE
函数来查找与给定年份匹配的第一个值,如下所示:
=VLOOKUP(DATE(A1,1,1),$B$1:$C$10,2,FALSE)
其中A1
是包含数字年2018
的单元格,而B1:C10
是一个范围,左边是日期,旁边是要查找的值。 2
表示返回第二列。 FALSE
表示"完全匹配" ,或者如果您想要近似匹配,则可以是TRUE
。
Office.com:Getting Started with VLookUp
Office.com:Date function (Excel)
答案 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
示例测试数据: