【问题标题】:excel vba date search functionexcel vba日期搜索功能
【发布时间】:2017-06-12 11:38:42
【问题描述】:

我是 excel vba 的新手,我目前被这个问题困住了。希望有人能指出我正确的方向。

我正在搜索从该月的最后一天开始的一系列单元格。 例如:

varEOM = "31"
varMM = "03"
varYYYY = "2006"

如果 2006 年 3 月 31 日没有数据,则它不会出现在列表/列中。因此,我想以编程方式回顾 30 日、29 日等。我正在回顾 10 年的数据。

另外,由于数据的性质,varYYYY、varMM 和 varEOM 是字符串而不是整数,所以我认为我需要在某个时候将它们从字符串转换为整数。

我在寻找一种合理的方式来循环和递减计数器直到达到有效日期时遇到问题。

这是我目前的代码:

Dim varYYYY As String, varMM As String, varEOM As String, varInteger As Integer, varString As String

varEOM = "31"
varMM = "03"
varYYYY = "2006"

varInteger = CInt(varEOM)
varValueToFind = varYYYY & varMM & varEOM

Do Until Not IsNull(el)

    Set rng = Range("b1", Range("b65536").End(xlUp))
    ' Find the cell reference on the varValuetoFind
    Set el = rng.Find(varValueToFind, LookIn:=xlValues)
    Set fl = rng.Find(varValueToFind, LookAt:=xlPart)
    Debug.Print varYYYY
    Debug.Print varMM
    Debug.Print varEOM
    Debug.Print el
    Debug.Print fl.Address
    Debug.Print varValueToFind

    varInteger = varInteger - 1

    Debug.Print varInteger

 Loop

如果 31 日有数据,则代码有效。但是如果 31 号没有数据,需要回溯到 20060330,那么代码就崩溃了。

提前致谢。任何帮助将不胜感激。

【问题讨论】:

  • 如果有多个相同的日期怎么办?
  • 旁注:我建议不要使用Integer,除非您需要与旧 API 通信。而是始终使用LongCLng()。阅读here 了解更多信息以及原因。

标签: vba excel


【解决方案1】:

您永远不会更新您的值来查找,因为它不在您的 Do 循环中。我将它移到循环中,所以现在应该可以工作了。

Dim varYYYY As String, varMM As String, varEOM As String, varInteger As Integer, varString As String

varEOM = "31"
varMM = "03"
varYYYY = "2006"

varInteger = CInt(varEOM)


Do Until Not IsNull(el)

varValueToFind = varYYYY & varMM & varInteger 'Here your value to find gets updated.

Set rng = Range("b1", Range("b65536").End(xlUp))
' Find the cell reference on the varValuetoFind
Set el = rng.Find(varValueToFind, LookIn:=xlValues)
Set fl = rng.Find(varValueToFind, LookAt:=xlPart)
Debug.Print varYYYY
Debug.Print varMM
Debug.Print varEOM
Debug.Print el
Debug.Print fl.Address
Debug.Print varValueToFind

varInteger = varInteger - 1

Debug.Print varInteger

Loop

【讨论】:

  • ehm 很好,但这仍然不会在每次循环迭代期间更改varValueToFind,因为递增变量是varInteger,但这不适用于varValueToFind,所以它应该是这样的至少:varValueToFind = varYYYY & varMM & varInteger 否则它仍然会在每次循环迭代中搜索相同的日期。
【解决方案2】:

您可以将循环设为LongDate,然后将Find 转换为String。例如:

Dim varYYYY As String, varMM As String, varEOM As String, varInteger As Integer, varString As String

dim dayOfMonth as long    ' This is the loop variable

varEOM = "31"
varMM = "03"
varYYYY = "2006"

varInteger = CInt(varEOM)
' Move varValueToFind inside the loop
' varValueToFind = varYYYY & varMM & varEOM

' Change from Do..Loop to For..Next
' Do Until Not IsNull(el)
For dayOfMonth = CLng(varEOM) to 1 Step -1

    ' You can probably move Set rng outside the loop
    ' since this doesn't change
    Set rng = Range("b1", Range("b65536").End(xlUp))

    ' Update the date ...
    varValueToFind = varYYYY & varMM & Format(dayOfMonth , "00")
    ' Find the cell reference on the varValuetoFind
    ' NOT SURE WHY YOU HAVE TWO FINDS HERE
    ' Do you want this instead?
    ' Set el = rng.Find(varValueToFind, LookIn:=xlValues, LookAt:=xlPart)
    Set el = rng.Find(varValueToFind, LookIn:=xlValues)
    Set fl = rng.Find(varValueToFind, LookAt:=xlPart)
    Debug.Print varYYYY
    Debug.Print varMM
    Debug.Print varEOM
    Debug.Print el
    Debug.Print fl.Address
    Debug.Print varValueToFind

    varInteger = varInteger - 1

    Debug.Print varInteger

    ' Exit if find was successful
    ' If Not IsNull(el) Then Exit For
    If Not el Is Nothing Then Exit For
 ' Loop
Next dayOfMonth

希望有帮助

【讨论】:

  • 作为测试,我将 20060331 添加到 B 列。然后我取消了 Debug.Print el 和 Debug.Print el.address 的注释。脚本运行成功。这是立即输出。 2006 03 31 20060331 20060331 $B$7
  • 我猜如果这个语句没有找到正确的值“Set el = rng.Find(varValueToFind, LookIn:=xlValues, LookAt:=xlPart)”。那么el变量是否设置为null以外的值?因此出现 91 错误?
  • 根据msdn.microsoft.com/en-us/library/office/ff839746.aspx。如果未找到匹配项,则 Range.Find 方法不返回任何内容。也许这个声明没有按预期工作? “如果不是 IsNull(el) 则退出”
  • 好的。正确的测试是Not el Is Nothing。我在上面的代码中更改了它。在 VBA 中 NullNothing 是不同的。
猜你喜欢
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 2015-10-27
  • 2016-12-25
相关资源
最近更新 更多