我有一个表有一个开始日期,结束日期,然后是事件名称
我希望能够查找日期并查看它是否介于开始日期和结束日期之间,然后拉入符合这些条件的所有事件名称
例如
start end name
1/1 1/7 Event1
1/5 1/8 Event2
1/6 1/6 Event3
如果我想要一个1/5的日期,返回值将是Event1;事件2
Function DateEventLookup(eventdate As Long, startrng As Range, endrng As Range, pIndex As Long)
' eventdate is the lookup , startrng is the first array, endrng is the second array, pindex is the column to return
Dim rng As Range
Dim rng2 As Range
Dim xResult As String
xResult = ""
For Each rng In startrng
If rng.Value <= eventdate Then
For Each rng2 In endrng
If rng2.Value >= eventdate Then
xResult = xResult & "," & rng2.Offset(0, pIndex - 1)
End If
Next
End If
Next
DateEventLookup = xResult
End Function
我一直得到N / A#所以我不知道如何用第二个标准纠正这个问题
编辑#1
我拿了两个答案的组合。然而,我仍然得到欺骗
Public Function EventList(starts As Range, ends As Range, events As Range, d As Date) As String
Dim N As Long
Dim i As Long
Dim P As Object
Set P = CreateObject("Scripting.Dictionary")
N = Cells(Rows.Count, starts.Column).End(xlUp).Row
For i = 1 To N
If CDate(starts(i)) <= d And CDate(ends(i)) >= d Then P.Item(events(i)) = 1
'EventList = EventList & "; " & events(i)
Next i
EventList = Join(P.keys, ", ")
End Function
不知道如何解决这个问题我尝试添加一个
如果NOT p.exists(事件(i))则ADD
但我现在正在获得N / A#
这是一个非常简单的选择:
Public Function EventList(starts As Range, ends As Range, events As Range, d As Date) As String
Dim N As Long, i As Long
N = Cells(Rows.Count, starts.Column).End(xlUp).Row
For i = 1 To N
If CDate(starts(i)) <= d And CDate(ends(i)) >= d Then EventList = EventList & "; " & events(i)
Next i
EventList = Mid(EventList, 2)
End Function
您需要使用Range.Value,而不是范围本身。
(这是未经测试的,但我认为这一改变将使其有效)
For Each rng In startrng
If rng.value <= eventdate Then
For Each rng2 In endrng
If rng2.value >= eventdate Then
xResult = xResult & "," & rng2.Offset(0, pIndex - 1)
End If
Next
这是一个建议,例如, = DateEventLookup(DATE(2018,1,5),A2:A4,B2:B4,3)你不得不摆弄这些参数,因为不知道你的数据是如何布局的。
Function DateEventLookup(eventdate As Date, startrng As Range, endrng As Range, pIndex As Long)
' eventdate is the lookup , startrng is the first array, endrng is the second array, pindex is the column to return
Dim rng As Range
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
For Each rng In startrng
If rng <= eventdate Then
If rng.Offset(, 1) >= eventdate Then
d.Item(rng.Offset(0, pIndex - 1)) = 1
End If
End If
Next
DateEventLookup = Join(d.keys, ",")
End Function