我是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,那么代码就会崩溃。
提前致谢。任何帮助将不胜感激。
答案 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)
您可以将循环设为Long
或Date
,并转换为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
希望有所帮助