excel vba日期搜索功能

时间:2017-06-09 12:19:30

标签: excel vba excel-vba

我是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,那么代码就会崩溃。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

希望有所帮助