如果While循环中的IsError给出错误

时间:2015-07-02 13:31:54

标签: vba excel-vba excel

我有一些代码可以在一个电子表格(ID表)中创建两个字段的串联。然后,它在电子表格(S1)中搜索串联,并使用MATCH返回新的ID。之后,它在电子表格2(S2)中搜索新ID,并返回最终ID,该ID将输入到摘要字段中。

代码是:

While MC > MD

    Worksheets("ID sheet").Activate

    MF = WorksheetFunction.VLookup(MD, Range("U2:W" & Range("U1")), 2, False)   ' Vlookup for part 1
    MG = WorksheetFunction.VLookup(MD, Range("U2:W" & Range("U1")), 3, False)   ' Vlookup for part 2
    MH = MF & MG

    Worksheets("S1").Activate
    MI = WorksheetFunction.Match(MH, Range("HC:HC"), 0)         ' Match concatenation in Range HC
    MK = Range("A" & MI)                                        ' Find deal ID

    Worksheets("S2").Activate

    ML = WorksheetFunction.Match("*" & MK & "*", Range("W:W"), 0)     ' Match deal ID in Range W
    MM = Range("F" & ML)                                        ' Find Register ID

    Worksheets("Summary").Activate
    Range("F2").Activate
    ActiveCell.Offset(MD - 1, 1) = MM                           

    MD = MD + 1

Wend

ID表中的所有连接都在S1中找到。

但是,并非S1中的所有ID都在S2中找到。当我最初运行代码时,它会在S2中缺少第一个ID时返回错误。

我尝试将以下代码作为第一个条目输入WHILE循环。

On Error Resume Next

这会跳过该行,但会在摘要中生成错误条目。我需要的是摘要表中的空白条目(这给出了错误之前生成的最后一个值)。

然后我尝试了:

If Not IsError(MI) Then
    MK = Range("A" & MI)                                        ' Find deal ID

    Worksheets("S2").Activate

    ML = WorksheetFunction.Match(MK, Range("W:W"), 0)     ' Match deal ID in Range W
    MM = Range("F" & ML)                                        ' Find Register ID

Else
    MI = ""

End If

感谢Eddy的初步解决方案。

当我运行它时,我得到一个运行时错误1004。

我也试过这段代码,结果相同:

If IsError(ML) Then
        MF = 0
        MG = 0
        MH = 0
        MI = 0
        MK = 0
        ML = 0
        MD = MD + 1

    Else
        MM = Worksheets("S2").Range("F" & ML)                                        ' Find Register ID

        Worksheets("Summary").Activate
        Range("F2").Activate
        ActiveCell.Offset(MD - 1, 1) = MM                            ' set value in F4 to the MFGI ID

        MD = MD + 1
    End If

修改

除了建议之外,我还更新了我的代码,以反映每次比赛结束后需要IF ISERROR。

现在代码如下:

Dim MF As String
Dim MG As String
Dim MH As String
Dim MI As Variant
Dim MK As String
Dim ML As Variant
Dim MM As String

While MC > MD

    MF = WorksheetFunction.VLookup(MD, Worksheets("ID sheet").Range("U2:W" & Worksheets("ID sheet").Range("U1")), 2, False)   
    MG = WorksheetFunction.VLookup(MD, Worksheets("ID sheet").Range("U2:W" & Worksheets("ID sheet").Range("U1")), 3, False)   
    MH = MF & MG                                                ' combine 
    MI = Application.Match(MH, Worksheets("S1").Range("HC:HC"), 0)        ' Match combined 

    If Not IsError(MI) Then
        MK = Worksheets("S1").Range("A" & MI)                                        ' Find deal ID
        ML = Application.Match(MK, Worksheets("S2").Range("W:W"), 0)                          ' Match deal ID in Range W

        If Not IsError(ML) Then
            MM = Worksheets("S2").Range("F" & ML)

        Else
            ML = vbNullString
            MM = vbNullString

        End If

    Else
        MI = vbNullString
        MM = vbNullString

    End If

    Worksheets("Summary").Activate
    Range("F2").Activate
    ActiveCell.Offset(MD - 1, 1) = MM                            ' set value in F4 to the ID

    MD = MD + 1

Wend 

通过将DIM更改为VARIANT

来修复运行时错误

1 个答案:

答案 0 :(得分:2)

匹配的每次调用都需要If Not IsError() Then,然后:用WorksheetFunction.Match

替换所有Application.Match语句

所以这个:

If Not IsError(MI) Then
    MK = Range("A" & MI)                                        ' Find deal ID

    Worksheets("S2").Activate

    ML = WorksheetFunction.Match(MK, Range("W:W"), 0)     ' Match deal ID in Range W
    MM = Range("F" & ML)                                        ' Find Register ID

Else
    MI = ""

End If

应更改为:

If Not IsError(MI) Then
    MK = Worksheets("S1").Range("A" & MI)    
    ML = Application.Match(MK, Worksheets("S2").Range("W:W"), 0)

    If Not IsError(ML) Then
        MM = Worksheets("S2").Range("F" & ML)
    Else
        MM = vbNullString
    End If
Else
    MI = vbNullString
End If