【问题标题】:Function to return all events in a certain date返回特定日期内所有事件的函数
【发布时间】:2018-02-08 02:39:42
【问题描述】:

我有一个表格,其中包含开始日期、结束日期和事件名称

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

例如

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

不确定如何解决这个问题,我尝试添加

如果不是 p.exists(events(i)) 则添加

但我现在得到一个 N/A#

【问题讨论】:

  • 请举例说明您是如何调用该函数的。您正在尝试对字符串进行数值比较。
  • 查找值是串行的,日期也应该是串行的。它们只是格式化为 M/DD/YYYY
  • 你是说序列号是字符串,所以你不能在它们上使用 > 或
  • 日期只是 Excel 中的一个数字。它如何解释If rng &lt;= eventdate
  • Eventdate 是日期的序号,所以也应该是数字

标签: excel function datetime vba


【解决方案1】:

这是一个非常简单的替代方案:

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

【讨论】:

  • 有没有办法消除欺骗?
  • @RPr 我没有看到任何重复?
  • 对不起,在我的数据中,有一些数据是明智的,并且具有相同的名称我正在尝试 scriping.dictionary,但它似乎不起作用
【解决方案2】:

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

【讨论】:

  • 我认为不会,因为 value 是 range 对象的默认属性,因此您不需要指定它(至少在这里),尽管这样做是一个好习惯。
  • 是的,我一直对此感到不满。不确定我是否有下一个结尾如果下一个错误在最后还是什么
  • SRJ,你说得对,我有更多时间研究它,问题是 eventdate 是一个字符串。
【解决方案3】:

这是一个建议,称为,例如=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

【讨论】:

  • 谢谢,你能告诉我使用 create object 行和这行 d.Item(rng.Offset(0, pIndex - 1)) = 1 吗?我假设它将值存储在创建的“scripting.dictionary”对象中,然后你最后将它们全部加入?
  • 阅读例如excelmacromastery.com/vba-dictionary 以获取字典指南。它们有点像数组或集合,您可以存储数据(作为键/项对),如果值已经存在,则可以。在这里,当满足要求时将事件作为键添加,结果将键输出为以逗号分隔的字符串。
  • 如果值已经存在,你可以这样做----这应该是不能*吗?
  • 应该读到“可以检查值是否已经存在”,尽管在我上面使用它的方式中它会自动覆盖。没有这个,你最终可能会得到例如“事件1,事件2,事件1”
  • 最后的 = 1 有什么作用,去掉骗子?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多