用于返回特定日期内所有事件的函数

问题描述 投票:1回答:3

我有一个表有一个开始日期,结束日期,然后是事件名称

我希望能够查找日期并查看它是否介于开始日期和结束日期之间,然后拉入符合这些条件的所有事件名称

例如

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#

excel excel-vba function datetime vba
3个回答
0
投票

这是一个非常简单的选择:

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

enter image description here


0
投票

您需要使用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

0
投票

这是一个建议,例如, = 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
© www.soinside.com 2019 - 2024. All rights reserved.