【问题标题】:Excel VBA Find function - differentiate multiple resultsExcel VBA 查找功能 - 区分多个结果
【发布时间】:2021-03-24 08:37:00
【问题描述】:

我有一个包含两个工作表的工作簿。在一个工作表上,我有一列以逗号分隔的值作为文本(电子元件参考)。例如。 C1 = "R1, R2, R3, ..., R125" ; C2 = "C1, C2, C3, ..." ; C3 = "TR1, TR2, TR3, ..." ; C4 = "IC1, IC2, IC3 ..."

我创建了下面的代码来搜索 Sheet2 上的 column C 以查找特定值(例如“R1”),当它找到该值时,获取该部分同一行中另一列的编号。例如。如果在单元格C12 中找到R1,它将返回单元格D12. 中的部件号

C 列 仅包含逗号分隔值的唯一列表时,我在下面编写的代码运行良好,但是当存在重复时我遇到了问题。例如。对于上面的示例,如果R1 在单元格C1 中,而TR1 在单元格C3 中,那么当我尝试查找R1 时,有时它只能在单元格C3 中找到它,因此返回不正确TR1 的零件号,而不是 R1。我对 CxxICxx 引用有同样的问题。

不知何故,我需要修改代码,以便如果我只搜索 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

【问题讨论】:

  • 你在搜索C列还是B列,你的代码显示Range("C11:C1000").Find
  • 嗨,是的,对不起,你是对的,我正在解析工作表 1 的 B 列中的所有非空白值,并且对于每个值,搜索(使用查找函数)工作表 2 的 C 列火柴。第 1-10 行有一些标题/标题,所以它只从 C11 开始。我已经编辑了我的问题,所以希望它现在能更好地匹配代码。谢谢。
  • 您只使用第一个找到的项目,可以吗?
  • 如果您的问题是您想在一个单元格中准确地找到“R1”,然后更改为LookAt:=xlwhole。如果您需要查找多个结果,请使用FindNext 和循环。
  • 您从 Col B 返回值而不是 D cel.Offset(0, 1)=foundItem.Offset(0, -1).Value

标签: excel vba function find


【解决方案1】:

如果您找到匹配的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2016-12-26
    • 2014-06-08
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多