用于在单个单元格中搜索/匹配60+值的VBA / Excel方法

时间:2015-01-18 23:44:50

标签: excel vba excel-vba

我正在太系统之间进行迁移。旧系统使用Tags对产品进行分类,新系统引入Type。

我可以将数据作为已加载到Excel中的数千行的CSV。这是格式的一个例子。

Col A      | Col B | Col C
Product    | Type  | Tags
Samsung S5 |       | Android, Samsung, 5.1" Screen
Sony Z3    |       | Android, Bluetooth, Sony, 5.2" Screen
LG G3      |       | Android, LG, 5.5" Screen

我希望能够使用C列中的单个标记填充B列。我可以这样做:

A1: =IF(SEARCH("Sony",B2),"Sony", IF(SEARCH("Samsung",B2),"Samsung",etc))

但是,我想在C列中搜索/匹配60多个单独的标签到B列中的单个值,因此这种方法很快变得无法管理。

是否有其他方法使用Excel函数或我是否必须使用VBA?

我多年没有使用过VBA,所以任何例子/指针都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

  

是否有其他方法使用Excel函数或我是否必须使用VBA?

恕我直言VBA,试试这个:

  1. 第一个变体(慢于第二个变体)

    Sub test()
    Dim oCellTag As Range, oCellSource As Range
    For Each oCellTag In Sheets("Tags").Range("A1:A3") 'Range with Tags in one sheet
        For Each oCellSource In Sheets("Source").Range("C2:C4") 'Range with data for search tags in another sheet
            If UCase(oCellSource.Value) Like "*" & UCase(oCellTag.Value) & "*" And oCellTag.Value <> "" Then 'if cell contain tag
                Sheets("Source").Cells(oCellSource.Row, oCellSource.Column - 1).Value = oCellTag.Value
            End If
        Next
    Next
    End Sub
    
  2. 第二个变种(快速)

    Sub test2()
    Dim oCellTag As Range, oCellSource As Range, KeySource, KeyTag
    Dim Source As Object: Set Source = CreateObject("Scripting.Dictionary")
    Dim Tags As Object: Set Tags = CreateObject("Scripting.Dictionary")
    'Grab the dates from the WorkSheets
    For Each oCellTag In Sheets("Tags").Range("A1:A3")
        If oCellTag.Value <> "" Then
            Tags.Add oCellTag.Row, oCellTag.Value
        End If
    Next
    For Each oCellSource In Sheets("Source").Range("C2:C4")
        If oCellSource.Value <> "" Then
            Source.Add oCellSource.Row, oCellSource.Value
        End If
    Next
    'Match
    For Each KeyTag In Tags
        For Each KeySource In Source
            If UCase(Source(KeySource)) Like "*" & UCase(Tags(KeyTag)) & "*" Then
                Sheets("Source").Cells(KeySource, 2).Value = Tags(KeyTag)
            End If
        Next
    Next
    End Sub