问题描述
嗨,我想知道如何使用.address来确定在迭代中应该在哪一行停止。因此,我的代码正在查找预定日期(每周一次)的单元格地址,当我输入日期时,它将自动查找匹配/最接近的日期。我的问题是,根据最接近/匹配日期所在的列,在日期行的下一个列中添加一个值。
z = CDate(x)
MsgBox z
For Each find In Sheet2.Range("B4:B183")
If find = z Then
MsgBox "found at :" & find.Address
Do Until Sheet2.Range("C" & PaidRow) > find.Address
Sheet2.Range("C" & PaidRow).Value = 0
Loop
End If
Next
这是代码的一部分,我应该确定最接近/匹配日期的地址。
首先我将最接近/匹配日期的x值转换为实际日期,而不是excel值,例如44506 = 11/6/2021,然后for循环让我确定在放置msgbox find.address时正确的find.address。
但是我似乎无法在原始for循环之外使用find.address。
解决方法
您可以找到并使用找到日期的单元格,如下所示:
z = CDate(x)
Dim found as Range
Set found = Sheet2.Range("B4:B183").Find(z,lookat:=xlWhole)
If not found Is Nothing Then
MsgBox "found at :" & found.Address
found.Font.Bold = True 'for example
End If
,
Find
找不到近似匹配,只有精确匹配。尝试使用Worksheetfunction.MATCH
,如果需要近似匹配,则需要对数据进行排序。
根据排序顺序,您可以找到完全匹配或下一个更大或更小的近似值。然后,循环可以使用排序后的值来确定何时停止。
例如,您希望从7月开始的所有值以及您的日期按升序排序。因此,您寻找7月1日的比赛。您可以找到该日期或该日期之前的最后一个日期(可能是6月)。因此,如果根本没有7月的条目,那么下一个日期必须是7月。
因此,您将查看每个条目,直到遇到一个不在7月的日期。那就是您停止处理的时候。
,因此,我想出了如何执行此操作的方法,我不知道它是否有效,但它是否有效,感谢您对Gmalc,Scott和Variatus的所有投入。
这是我根据斯科特的答案更新的代码。
z = CDate(x)
Set find = Sheet2.Range("B4:B183").find(z,lookat:=xlWhole)
Dim InfoCol,InfoRow,LastItemRow,MatchDate As Long
LastItemRow = find.Row
For MatchDate = PaidRow To LastItemRow
If LastItemRow = MatchDate Then
Sheet2.Cells(MatchDate,3).Value = Range("G6").Value
Sheet2.Cells(MatchDate,4).Value = Range("E8").Value
Sheet2.Cells(MatchDate,1).Value = Range("E6").Value
Else: 'Sheet2.Cells(MatchDate,3).Value = .Range(Sheet2.Cells(MatchDate,3).Value).Value
Sheet2.Cells(MatchDate,3).Value = 0
Sheet2.Cells(MatchDate,4).Value = Range("E8").Value
Sheet2.Cells(MatchDate,1).Value = Range("E6").Value
End If
Next MatchDate