首页 > 解决方案 > 在 Excel 工作表中搜索并根据带有层次结构的 where 子句返回一个值?

问题描述

我正在尝试根据客户使用的产品退回主要销售人员

我有一个工作簿,其中包含许多工作表。第一个工作表是一个摘要工作表,其中包含一个搜索字段和一个按钮,单击该按钮可返回其他工作表中的特定列数据。其他工作表基于产品,我们有三个产品,等于三个工作表。每个工作表中的列都是相同的,不同产品的数据不同。

我被要求在每个产品工作表中添加一个新列“销售人员”,目的是在执行新搜索时将该数据提取到摘要工作表中。我面临的问题是,当客户使用多种产品时,会有一个销售主管。虽然每个产品都有一个销售人员,但每个产品是不同的人,并且在客户使用多种产品的情况下,其中一个销售人员担任首席销售人员的角色

工作簿结构是 工作表 1 是汇总表,将有一个名为“销售主管”的新列标题 工作表 2 用于窗户,销售人员为 Jack 工作表 3 用于门,销售人员为 Mary 工作表 4 用于瓷砖销售人员是莎拉

返回正确的潜在客户销售人员的场景

1 - WHERE customer product list = door AND windows THEN 应该检索的销售人员是 Jack

2 - WHERE customer product list = tiles and windows THEN 那么应该检索的销售人员是 Sarah

3 - WHERE 客户产品列表 = 窗户、门和瓷砖 THEN 应该检索的销售人员是 Sarah

4 - WHERE 客户产品列表 = 单个产品 THEN 检索到的销售人员的姓名应该是该工作表上销售人员列中的人员姓名

注意:每个工作表之间的共同链接是客户 ID 字段。这使我们能够在执行以下查询时查看客户拥有的所有产品。

理想情况下,我需要的是灵活的东西,这样就不需要将人们的名字硬编码到代码中来检索主要销售人员

下面是我为跨工作表搜索而编写的代码,就像现在一样。它很好用,只需要找到一种方法来添加上面的内容!提前致谢。

Option Compare Text

Sub OptionCompareText()


End Sub

Sub SearchMultipleSheets()

    'The 5 in the line below is the maximum array value which further down is the arr(i, 5) = ws.Name entry
    Dim arr(999, 5) As Variant, r As Range
    Dim ws As Worksheet, i As Integer, s As String
    Dim lastrow As Long
    lastrow = Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Row

    Set r = Sheets ("Sheet2").Range("A2:A & Lastrow)

    With Sheets(1)
        s = Range("c1").Value
        .Range("a3").Resize(.UsedRange.Rows.Count, .UsedRange.Columns.Count).ClearContents
    End With
    For Each ws In Worksheets
        If ws.Name <> Sheets(1).Name Then
        With ws
            For Each r In .Range("a2", .Range("a" & .Rows.Count).End(xlUp))
                If r.Value & r.Offset(0, 1).Value & r.Offset(0, 2).Value & r.Offset(0, 3).Value Like "*" & s & "*" Then
                    arr(i, 0) = ws.Name
                    'arr(i, 1) = r.Value
                    arr(i, 1) = r.Offset(0, 1).Value
                    arr(i, 2) = r.Offset(0, 2).Value
                    arr(i, 3) = r.Offset(0, 3).Value
                    arr(i, 4) = r.Offset(0, 4).Value

                    i = i + 1
                End If
            Next r
        End With
        End If
    Next ws
    With Sheets(1)
        .Range("a3").Resize(i, 6).Value = arr
    End With
End Sub

标签: excelvba

解决方案


推荐阅读