昨天得到了一些好人的帮助。我推断它并想问是否有人知道更有效的方法来做到这一点。查找开始日期位置是非常有效的,因为它接近3行代码,但查找结束日期有点困难,因为它找到日期的第一个实例,然后迭代循环直到它到达结束,这是低效的原因很明显。这是两个单独的函数(一个用于查找日期的开始行,另一个用于查找结束日期的最后一行。任何人都有任何想法?代码如下
注意:开始日期与结束日期不同...通常相隔一个月(2/1/14)(2/28/14)
关于我的开始日期和结束日期是什么令人困惑。道歉。 dateToAnalyze是从主子接收日期的参数。第一个函数“GetStartLocations”查找在电子表格中传递给它的开始日期。为了与我提出的日期保持一致。开始日期(2/1/14)将传递给GetStartLocations,结束日期(2/28/14)将传递给GetEndLocations。
这些函数仅用于最终找到传递日期的行位置。如果它没有找到日期...而不是错误...它会向前递增以找到下一个最近的日期。这对于GetStartLocations函数非常有用,但对于最终位置来说效果不是很好,因为它最终可能会在所需的结束日期之后递增。
Public Function GetStartLocations(dateToAnalyze As Range, masterList As Worksheet) As Long
Dim finderCounter As Integer
Dim finder As Range
finderCounter = 0
Do
Set finder = masterList.Range("A:A").Find(dateToAnalyze.Value + finderCounter, LookIn:=xlValues, LookAt:=xlWhole)
finderCounter = finderCounter + 1
Loop Until Not finder Is Nothing
GetStartLocations = finder.Row
End Function
Public Function GetEndLocations(dateToAnalyze As Range, masterList As Worksheet) As Long
'Seperate function for End location required since the find function finds the first instance of date being searched
Dim finderCounter As Integer
Dim finder As Range
Dim location As Long
finderCounter = 0
'Finds initial date in master list...If date is not found..increments upwards until it finds next nearest date sucessfully
Do
Set finder = masterList.Range("A:A").Find(dateToAnalyze.Value + finderCounter, LookIn:=xlValues, LookAt:=xlWhole)
finderCounter = finderCounter + 1
Loop Until Not finder Is Nothing
location = finder.Row
Do
DoEvents
location = location + 1
Loop Until Range("A" & location).Value <> Range("A" & (location + 1)).Value
GetEndLocations = location
End Function
答案 0 :(得分:2)
如果结束日期只是开始日期的最后一次使用,
... SearchDirection:=xlPrevious, After:=masterList.Range("A"&rows.count)
...在工作表周围向后循环,从底部开始查找。
答案 1 :(得分:1)
查找可能不是最有效的方法。通常读取变量数组或使用Worksheetfunction.MATCH可以更快 有关各种方法的利弊的讨论,请参阅 https://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/