Excel VBA 查找功能-区分多个结果
Excel VBA Find function - differentiate multiple results
我有一个包含两个工作表的工作簿。在一张工作表上,我有一列逗号分隔值作为文本(电子元件参考)。例如。 C1 = "R1, R2, R3, ..., R125" ; C2 = "C1, C2, C3, ..." ; C3 = "TR1, TR2, TR3, ..." ; C4 = "IC1, IC2, IC3 ..."
我创建了下面的代码以在 Sheet2 上的 C 列中搜索特定值(例如“R1”),以及何时它找到该值,从同一行的另一列获取零件号。例如。如果它在单元格 C12
中找到 R1
,它将 return 来自单元格 D12.
的部件号
当 C 列 仅包含逗号分隔值的唯一列表时,我在下面编写的代码可以完美运行,但如果存在重复值,我就会遇到问题。例如。对于上面的示例,如果 R1
在单元格 C1
中,而 TR1
在单元格 C3
中,那么当我尝试查找 R1
时,有时它只会找到它在单元格 C3
中,因此 return 是 TR1
而不是 R1
的错误部件号。我对 Cxx
和 ICxx
引用有同样的问题。
不知何故我需要修改代码,这样如果我只搜索 R1
并且在特定单元格中找到它,那么我需要检查 R1
子字符串是否有前面有一个“T”(“TR1”),如果有,继续搜索。
我可能还需要检查找到的 R1
后面是否有一个逗号(即“R1,”),这样我也不会遇到问题,例如R1
在一个单元格中,R11
在另一个具有不同部件号的单元格中。
我真的不知道如何修改我的代码来解决这个问题?我是否需要将找到正匹配的每个单元格转换为字符串,然后进行某种子字符串 - 内 - 字符串搜索?
Private Sub Pop_Rel_Click()
Dim W1 As Workbook
Set W1 = ActiveWorkbook
W1.Sheets("Sheet 1").Select
'Select All non-empty cells in Column B (Ref-des) Row 11 onwards...
ActiveSheet.Range("B11:B10000").SpecialCells(xlCellTypeConstants).Select
'Loop through ref-des selection...
Dim cel As Range
Dim selectedRange As Range
Dim foundItem As Range
Set selectedRange = Application.Selection
For Each cel In selectedRange.Cells
'...search for corresponding part number from sheet 2
Set foundItem = W1.Sheets("Sheet 2").Range("C11:C1000").Find(What:=cel.Value, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
If foundItem Is Nothing Then
Debug.Print cel.Address, cel.Value, "NOT FOUND"
Else
'find P/N from sheet 2...
'...and insert into column C of sheet 1
cel.Offset(0, 1) = foundItem.Offset(0, -1).Value
Debug.Print cel.Address, cel.Value, foundItem.Address, foundItem.Offset(0, -1).Value, foundItem.Offset(0, 1).Value, foundItem.Offset(0, 2).Value
End If
'Debug.Print cel.Address, cel.Value,
Next cel
'End loop
MsgBox ("Populated in Worksheet 1:" & Chr(10) & "1. Part Numbers")
End Sub
如果找到匹配 Split
将逗号字符串放入数组中,并检查数组中的每个元素是否完全匹配。如果未找到匹配项,请使用 FindNext
.
继续搜索
Option Explicit
Private Sub Pop_Rel_Click()
Const HDR = 10 ' 10 rows header
Dim Wb As Workbook, ws1 As Worksheet, ws2 As Worksheet
Dim cel As Range, rngB As Range, rngSearch As Range, rngFound As Range
Dim ar As Variant, s As String
Dim i As Long, iLastRow As Long
Dim sFirstFind As String, bMatch As Boolean
Set Wb = ActiveWorkbook
Set ws1 = Wb.Sheets("Sheet 1")
Set ws2 = Wb.Sheets("Sheet 2")
'Select All non-empty cells in Column B (Ref-des) Row 11 onwards...
iLastRow = ws1.Range("B" & Rows.Count).End(xlUp).Row
Set rngB = ws1.Range("B" & HDR & ":B" & iLastRow).SpecialCells(xlCellTypeConstants)
iLastRow = ws2.Range("C" & Rows.Count).End(xlUp).Row
Set rngSearch = ws2.Range("C" & HDR & ":C" & iLastRow)
For Each cel In rngB
'...search for corresponding part number from sheet 2
Set rngFound = rngSearch.Find(What:=cel.Value, _
LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
bMatch = False
If Not rngFound Is Nothing Then
' split string by comma into array
bMatch = False
sFirstFind = rngFound.Address
Do
ar = Split(rngFound.Value, ",")
For i = 0 To UBound(ar)
If Trim(ar(i)) = cel Then
' copy
cel.Offset(0, 1) = rngFound.Offset(0, 1).Value
bMatch = True
Exit For
End If
Next
Set rngFound = rngSearch.FindNext(rngFound)
Loop While Not rngFound Is Nothing And bMatch = False _
And rngFound.Address <> sFirstFind
End If
' no match
If bMatch = False Then
cel.Offset(0, 1) = "not found"
Debug.Print "NOT FOUND", cel.Address, cel.Value
End If
Next cel
MsgBox ("Populated in Worksheet 1:" & Chr(10) & "1. Part Numbers")
End Sub
我有一个包含两个工作表的工作簿。在一张工作表上,我有一列逗号分隔值作为文本(电子元件参考)。例如。 C1 = "R1, R2, R3, ..., R125" ; C2 = "C1, C2, C3, ..." ; C3 = "TR1, TR2, TR3, ..." ; C4 = "IC1, IC2, IC3 ..."
我创建了下面的代码以在 Sheet2 上的 C 列中搜索特定值(例如“R1”),以及何时它找到该值,从同一行的另一列获取零件号。例如。如果它在单元格 C12
中找到 R1
,它将 return 来自单元格 D12.
当 C 列 仅包含逗号分隔值的唯一列表时,我在下面编写的代码可以完美运行,但如果存在重复值,我就会遇到问题。例如。对于上面的示例,如果 R1
在单元格 C1
中,而 TR1
在单元格 C3
中,那么当我尝试查找 R1
时,有时它只会找到它在单元格 C3
中,因此 return 是 TR1
而不是 R1
的错误部件号。我对 Cxx
和 ICxx
引用有同样的问题。
不知何故我需要修改代码,这样如果我只搜索 R1
并且在特定单元格中找到它,那么我需要检查 R1
子字符串是否有前面有一个“T”(“TR1”),如果有,继续搜索。
我可能还需要检查找到的 R1
后面是否有一个逗号(即“R1,”),这样我也不会遇到问题,例如R1
在一个单元格中,R11
在另一个具有不同部件号的单元格中。
我真的不知道如何修改我的代码来解决这个问题?我是否需要将找到正匹配的每个单元格转换为字符串,然后进行某种子字符串 - 内 - 字符串搜索?
Private Sub Pop_Rel_Click()
Dim W1 As Workbook
Set W1 = ActiveWorkbook
W1.Sheets("Sheet 1").Select
'Select All non-empty cells in Column B (Ref-des) Row 11 onwards...
ActiveSheet.Range("B11:B10000").SpecialCells(xlCellTypeConstants).Select
'Loop through ref-des selection...
Dim cel As Range
Dim selectedRange As Range
Dim foundItem As Range
Set selectedRange = Application.Selection
For Each cel In selectedRange.Cells
'...search for corresponding part number from sheet 2
Set foundItem = W1.Sheets("Sheet 2").Range("C11:C1000").Find(What:=cel.Value, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
If foundItem Is Nothing Then
Debug.Print cel.Address, cel.Value, "NOT FOUND"
Else
'find P/N from sheet 2...
'...and insert into column C of sheet 1
cel.Offset(0, 1) = foundItem.Offset(0, -1).Value
Debug.Print cel.Address, cel.Value, foundItem.Address, foundItem.Offset(0, -1).Value, foundItem.Offset(0, 1).Value, foundItem.Offset(0, 2).Value
End If
'Debug.Print cel.Address, cel.Value,
Next cel
'End loop
MsgBox ("Populated in Worksheet 1:" & Chr(10) & "1. Part Numbers")
End Sub
如果找到匹配 Split
将逗号字符串放入数组中,并检查数组中的每个元素是否完全匹配。如果未找到匹配项,请使用 FindNext
.
Option Explicit
Private Sub Pop_Rel_Click()
Const HDR = 10 ' 10 rows header
Dim Wb As Workbook, ws1 As Worksheet, ws2 As Worksheet
Dim cel As Range, rngB As Range, rngSearch As Range, rngFound As Range
Dim ar As Variant, s As String
Dim i As Long, iLastRow As Long
Dim sFirstFind As String, bMatch As Boolean
Set Wb = ActiveWorkbook
Set ws1 = Wb.Sheets("Sheet 1")
Set ws2 = Wb.Sheets("Sheet 2")
'Select All non-empty cells in Column B (Ref-des) Row 11 onwards...
iLastRow = ws1.Range("B" & Rows.Count).End(xlUp).Row
Set rngB = ws1.Range("B" & HDR & ":B" & iLastRow).SpecialCells(xlCellTypeConstants)
iLastRow = ws2.Range("C" & Rows.Count).End(xlUp).Row
Set rngSearch = ws2.Range("C" & HDR & ":C" & iLastRow)
For Each cel In rngB
'...search for corresponding part number from sheet 2
Set rngFound = rngSearch.Find(What:=cel.Value, _
LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
bMatch = False
If Not rngFound Is Nothing Then
' split string by comma into array
bMatch = False
sFirstFind = rngFound.Address
Do
ar = Split(rngFound.Value, ",")
For i = 0 To UBound(ar)
If Trim(ar(i)) = cel Then
' copy
cel.Offset(0, 1) = rngFound.Offset(0, 1).Value
bMatch = True
Exit For
End If
Next
Set rngFound = rngSearch.FindNext(rngFound)
Loop While Not rngFound Is Nothing And bMatch = False _
And rngFound.Address <> sFirstFind
End If
' no match
If bMatch = False Then
cel.Offset(0, 1) = "not found"
Debug.Print "NOT FOUND", cel.Address, cel.Value
End If
Next cel
MsgBox ("Populated in Worksheet 1:" & Chr(10) & "1. Part Numbers")
End Sub