excel vbadatesearchfunction

我是一个全新的excel vba,目前我一直在这个问题上。 希望有人能指出我正确的方向。

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

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

如果没有2006年3月31日的数据,那么它将不在列表/列中。 因此,我想以编程的方式回顾第30,29等等。 我回顾了10年的数据。

此外,由于数据的性质,varYYYY,varMM和varEOM是string而不是整数,所以我认为我需要在某些时候将它们从string转换为整数。

我有问题find一个合乎逻辑的方式来循环和递减计数器,直到我达到有效的date。

这是我到目前为止的代码:

 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日没有数据,我需要恢复到2006年3月30日,那么代码就会崩溃。

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

你永远不会更新你的价值,因为它不在你的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 

您可以使循环为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 

希望有所帮助