【问题标题】:Excel Lookup 2 conditionExcel 查找 2 条件
【发布时间】:2022-06-14 18:53:25
【问题描述】:

我有一个数据表:

我想要这个结果:

像第一个匹配帐户一样,第二个匹配选项只有 3 个选项,我总是喜欢排列数字。

【问题讨论】:

  • 到目前为止你尝试过什么?你检查过这里的许多问答都问同样的问题吗?
  • 我没有找到,如果有喜欢的请发给我
  • 编辑这个以适应:stackoverflow.com/a/71894910/4961700
  • 嗨 @SolarMike 我需要像 Banana 1,12,1 这样的数组结果
  • 如果您决定不进一步解释您想要的结果,并且不要分享您尝试过的内容。您至少应该检查所需的结果是否正确。我对此表示怀疑。

标签: excel vba excel-formula excel-2010


【解决方案1】:

请测试下一个代码。根据您的问题和 cmets,它应该返回看起来合乎逻辑。它假定您代表所需输出的图片是错误的。它从“E1”开始在同一张表中返回。当然,它可以很容易地适应任何地方返回:

Sub TestExtractFruitsPerAccount()
   Dim sh As Worksheet, lastR As Long, arr, arrIt, i As Long 
   Dim arrFin, j As Long, dict As Object

   Set sh = ActiveSheet
   lastR = sh.Range("A" & sh.rows.count).End(xlUp).Row
   arr = sh.Range("A1:C" & lastR).value
   
   Set dict = CreateObject("Scripting.Dictionary")
   For i = 2 To UBound(arr)
        If Not dict.Exists(arr(i, 1)) Then
            dict.Add arr(i, 1), Array(arr(i, 2) & "|" & arr(i, 3))
        Else
            arrIt = dict(arr(i, 1)): ReDim Preserve arrIt(UBound(arrIt) + 1)
            arrIt(UBound(arrIt)) = arr(i, 2) & "|" & arr(i, 3)
            dict(arr(i, 1)) = arrIt
        End If
   Next i

   ReDim arrFin(1 To dict.count, 1 To 4)
   Dim strApp As String, strBan As String, strMng As String
   
   For i = 0 To dict.count - 1
        arrFin(i + 1, 1) = dict.Keys()(i)
        arrIt = dict.Items()(i)
        For j = 0 To UBound(arrIt)
            Select Case Split(arrIt(j), "|")(1)
                Case "APPLE"
                    If strApp = "" Then
                        strApp = "Pkt." & Split(arrIt(j), "|")(0)
                    Else
                        strApp = strApp & "," & Split(arrIt(j), "|")(0)
                    End If
                Case "BANANA"
                    If strBan = "" Then
                        strBan = "Pkt." & Split(arrIt(j), "|")(0)
                    Else
                        strBan = strBan & "," & Split(arrIt(j), "|")(0)
                    End If
                Case "MANGO"
                    If strMng = "" Then
                        strMng = "Pkt." & Split(arrIt(j), "|")(0)
                    Else
                        strMng = strMng & "," & Split(arrIt(j), "|")(0)
                    End If
            End Select
        Next j

        If strApp <> "" Then arrFin(i + 1, 2) = strApp
        If strBan <> "" Then arrFin(i + 1, 3) = strBan
        If strMng <> "" Then arrFin(i + 1, 4) = strMng
        strApp = "": strBan = "": strMng = ""
   Next i
   sh.Range("E1").Resize(1, 4).value = Array("Account", "APPLE", "BANANA", "MANGO")
   sh.Range("E2").Resize(dict.count, 4).value = arrFin
End Sub

我把你的问题当作一个挑战,即使根据我的口味至少它很奇怪。

请进行测试并发送一些反馈。这不是你需要的吗?如果没有,请尝试根据上述代码返回的内容更好地描述您的需求。

如果有不清楚的地方,请随时要求澄清。我可以评论代码行。我按原样发布它,以确保您会看到它。你的问题,事实上,很可能会被删除......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多