初始化正确值以避免对象变量或使用块变量未设置

时间:2016-12-28 18:37:33

标签: excel vba excel-vba

我有一段代码,我使用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变量没有设置错误,我需要设置什么?我恐怕不知道这是什么要求。

1 个答案:

答案 0 :(得分:1)

我认为代码的问题在于Find方法在找不到匹配项时会返回Nothing,如documentation中所述。因此,xlCell_A.Row会返回错误,因为无法在Row上调用Nothing方法。

实际上,我发现您的代码存在许多其他问题:

  1. for循环的内部不依赖于循环变量i。因此,它在每次交互中完全相同。
  2. 从不使用With块的变量xlWS,这会使With块无法识别。
  3. 循环中Find方法的返回值永远不会分配给任何东西。因此,它们没有效果。
  4. if语句中的条件始终返回False,因为您永远不会更改Value2Find_1Value2Find_2的值,并将它们初始化为txtMachNumber.TexttxtMachName.Text分别。
  5. 如果您打算评估值txtMachNumber.TexttxtMachName.Text是否分别出现在A列和B列中,您只需测试xlCell_AxlCell_B是否为Nothing

    由于您希望在使用Find无法保证的同一行上找到它们,因此在代码中使用循环可能更容易 if语句中的txtMachNumber.TexttxtMachName.Text Range2Use_1.Cells(i,1)Range2Use_2.Cells(i,1)。 (这会将第i行中的值与要搜索的值进行比较。)显然,您必须在找到匹配项后退出循环,例如使用break语句。