【发布时间】:2015-09-19 02:40:09
【问题描述】:
这很奇怪。根据 MSDN(以及 StackOverflow 上的几个问题),当在指定范围内找不到指定值时,VBA 中的 Range.Find 方法应该返回Nothing。但是,当我运行以下代码时,如果未找到该值,则 Range.Find 方法不会返回 Nothing。它不会返回任何东西。
请假设所有变量都已正确定义。 VBA 位于 Access 2013 模块中,并引用了 Microsoft Office 15.0 对象库。
Dim rng As Excel.Range
Dim rngFound As Excel.Range
' ...
For i = 0 To UBound(strHeader)
Set rngFound = rng.Find( _
What:=strHeader(i), _
After:=rng(rng.Cells.Count), _
LookAt:=xlWhole, _
MatchCase:=True _
)
If rngFound Is Nothing Then
bolValid = False
Exit For
ElseIf i = UBound(strHeader) Then
bolValid = True
End If
Next i
如果在rng 范围内找不到strHeader(i) 中的字符串,则应将变量rngFound 设置为Nothing。但是,事实并非如此。
假设早期迭代中rngFound.Address 的值是“$J$1”。现在假设在rng 中找不到当前迭代的值。 Range.Find 应该返回Nothing,但是在立即窗口中查询时,rngFound.Address 仍然是“$J$1”。
知道是什么导致了这种奇怪的行为吗?
编辑:完整的功能代码,根据要求。
Private Function CheckIntegrity(FileName As String) As Boolean
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim rng As Excel.Range
Dim rngFound As Excel.Range
Dim strHeader() As String
Dim i As Integer
Dim bolValid As Boolean
On Error GoTo PROC_ERR
ReDim strHeader(9)
strHeader(0) = "String1"
strHeader(1) = "String2"
strHeader(2) = "String3"
strHeader(3) = "String4"
strHeader(4) = "String5"
strHeader(5) = "String6"
strHeader(6) = "String7"
strHeader(7) = "String8"
strHeader(8) = "String9"
strHeader(9) = "String10"
Set wb = OpenWorkbook(FileName, True)
If Not wb Is Nothing Then Set ws = wb.Worksheets(1)
If Not ws Is Nothing Then Set rng = ws.Range("A1:Z1")
If Not rng Is Nothing Then
For i = 0 To Ubound(strHeader)
Set rngFound = rng.Find( _
What:=strHeader(i), _
After:=rng(rng.Cells.Count), _
LookAt:=xlWhole, _
MatchCase:=True _
)
If rngFound Is Nothing Then
bolValid = False
Exit For
ElseIf i = Ubound(strHeader) Then
bolValid = True
End If
Next i
End If
wb.Close SaveChanges:=False
CheckIntegrity = bolValid
PROC_EXIT:
Set wb = Nothing
Set ws = Nothing
Set rng = Nothing
Set rngFound = Nothing
Erase strHeader
i = 0
bolValid = False
Exit Function
PROC_ERR:
MsgBox "Error encountered. " & Err.Number & " " & Err.Description
Resume PROC_EXIT
End Function
如果未找到 strHeader 的元素,则不会将 rngFound 的值设置为 Nothing。
【问题讨论】:
-
你怎么知道
rngFound不是Nothing,这是什么意思它什么都不返回。 -> 每个变量都有一个值。以After:=rng(rng.Cells.Count)为起点的目的是什么? -
在没有匹配时为我返回
Nothing。当您从即时窗口查询时,您停在哪一行? -
@TimWilliams 当我查询即时窗口时它停在
If rngFound Is Nothing Then线上。 -
@user3964075 我知道 Range.Find 没有返回
Nothing,因为在 Range.Find 方法搜索了某些内容之后,rngFound的值不是If rngFound Is Nothing Then线上的Nothing我知道不在那里。After:=...参数的目的是搜索rng范围的第一个单元格。 -
我从未见过这种行为,也无法复制您所看到的。愿意分享您的整个代码吗?