一旦找到匹配项,就不需要再深入内部循环,因此我的建议是
Sub ID()
Dim sheet1 As Worksheet, sheet2 As Worksheet, Sheet3 As Worksheet
Dim isFound As Boolean: isFound = False
Set sheet1 = Sheets(1)
Set sheet2 = Sheets(2)
Set Sheet3 = Sheets(3)
Dim Sheet3ColB, Sheet2ColB As Variant
Dim ii As Long, tt As Long, w As Long: w = 3
Sheet3ColA = Sheet3.Range("A2:C" & Sheet3.Cells(Sheet3.Rows.Count, 2).End(xlUp).Row).Value2
Sheet2ColB = sheet2.Range("B3:B" & sheet2.Cells(sheet2.Rows.Count, 2).End(xlUp).Row).Value2
For ii = LBound(Sheet2ColB) To UBound(Sheet2ColB)
isFound = False
For tt = LBound(Sheet3ColA) To UBound(Sheet3ColA)
'perform case insensitive (partial) comparison
If InStr(1, LCase(Sheet2ColB(ii, 1)), LCase(Sheet3ColA(tt, 2))) > 0 Then
sheet2.Cells(w, 1) = Sheet3ColA(tt, 1)
sheet2.Cells(w, 4) = Sheet3ColA(tt, 3)
w = w + 1
isFound = True
Exit for
End If
Next
If Not isFound Then
sheet2.Cells(w, 2) = Sheet2ColB(ii, 1)
w = w + 1
End If
Next
End Sub