我有一段代码,我使用For... Next
循环来浏览Excel工作表,并告诉我是否找到了在文本框中输入的值。如果值匹配,我已将其修改为有效。然而,我收到了Object / With Block变量没有设置错误,这让我很困惑。我创建了以下内容:
Dim Value2Find_1 As String = txtMachNumber.Text 'Serial number value.
Dim Value2Find_2 As String = txtMachName.Text 'Machine name value.
Dim ReplaceWithValue1 As String = "" 'Replaces the serial number value if found in the sheet.
Dim ReplaceWithValue2 As String = "" 'Replaces the machine name value if found in the sheet.
Dim ReplaceWithValue3 As String = "" 'Replacement for the date-time in the Date Column.
Dim Range2Use_1 = xlWS.Range("A1:A4000") 'Range to span the A Column.
Dim Range2Use_2 = xlWS.Range("B1:B4000") 'Range to span the B Column.
Dim Range2Use_3 = xlWS.Range("F1:F4000") 'Range to span the F Column.
Dim xlCell_A = Range2Use_1.Find(txtMachNumber.Text) 'Looks up the searched serial value in A Column.
Dim xlCell_B = Range2Use_2.Find(txtMachName.Text) 'Looks up the searched machine value in B Column.
Dim LastRow = xlWS.Range("A4000").End(Excel.XlDirection.xlUp).Row + 1
Dim i As Integer
With xlWS
For i = 1 To LastRow
If Not (Value2Find_1 = txtMachNumber.Text And Value2Find_2 = txtMachName.Text) Then
MessageBox.Show("No value exists here...")
Else
Range2Use_1.Find(What:=Value2Find_1, MatchCase:=True)
Range2Use_2.Find(What:=Value2Find_2, MatchCase:=True)
MsgBox("Found both values: " & Value2Find_1 & " and " & Value2Find_2 & " on row " & xlCell_A.Row)
End If
Exit Sub
Next
End With
如果我的文本框条目不在工作表中,则错误将在以下代码行中返回:
MsgBox("Found both values: " & Value2Find_1 & " and " & Value2Find_2 & " on row " & xlCell_A.Row)
我已缩小范围,使其与返回所定位文本框条目的行号的变量有关 - xlCell_A
。然而,这就是我被困的地方。为了避免Object / With Block变量没有设置错误,我需要设置什么?我恐怕不知道这是什么要求。
答案 0 :(得分:1)
我认为代码的问题在于Find
方法在找不到匹配项时会返回Nothing
,如documentation中所述。因此,xlCell_A.Row
会返回错误,因为无法在Row
上调用Nothing
方法。
实际上,我发现您的代码存在许多其他问题:
i
。因此,它在每次交互中完全相同。xlWS
,这会使With块无法识别。Find
方法的返回值永远不会分配给任何东西。因此,它们没有效果。False
,因为您永远不会更改Value2Find_1
和Value2Find_2
的值,并将它们初始化为txtMachNumber.Text
和txtMachName.Text
分别。如果您打算评估值txtMachNumber.Text
和txtMachName.Text
是否分别出现在A列和B列中,您只需测试xlCell_A
和xlCell_B
是否为Nothing
。
由于您希望在使用Find
无法保证的同一行上找到它们,因此在代码中使用循环可能更容易
if语句中的txtMachNumber.Text
和txtMachName.Text
Range2Use_1.Cells(i,1)
和Range2Use_2.Cells(i,1)
。 (这会将第i行中的值与要搜索的值进行比较。)显然,您必须在找到匹配项后退出循环,例如使用break
语句。