我有一些代码可以在一个电子表格(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
来修复运行时错误答案 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