【问题标题】:Excel VBA Lookup two values in same row based on values in three columnsExcel VBA 根据三列中的值查找同一行中的两个值
【发布时间】:2021-06-13 19:41:43
【问题描述】:

我有一个如下所示的表格:

基本上,“MatGroup”是“StorLoc”的子类型,“StorLoc”是“Department”的子类型。

我需要在这三列中查找匹配项,然后将其他两列的值返回到右侧(这些列代表周)。

我在上图中突出显示了一个示例。我在 第 4 周5 搜索 Department 1101StorLoc 0001MatGroup 1225 ,它应该返回值 243 和 245,然后可以将它们相加 = 488。

出于测试目的,我有一个工作公式可以在同一个工作表中执行此操作:

=SUMPRODUCT(XLOOKUP(K6&J8&K7;A2:A40&B2:B40&C2:C40;D2:E40))

但是,我需要一个纯 VBA 解决方案,因为我将把这些数据提取到一个完全独立的工作簿中。我无法使用与上述公式相同的解决方案,因为显然 VBA 不允许您使用 & 连接多个条件。

我目前使用大量 CountIfs 的解决方案并不完全令人满意,而且完全比必要的资源密集(而且混乱!):

resultCount = Application.WorksheetFunction.SumIfs(dataWorkBook.Range("A" & departmentStartRow & ":BC" & departmentEndRow).Columns(weekNumber + 1), dataWorkBook.Range("B" & departmentStartRow & ":B" & departmentEndRow), StorLoc, dataWorkBook.Range("C" & departmentStartRow & ":C" & departmentEndRow), MatGroup)

【问题讨论】:

  • VBA 接受& 进行连接,但其前后必须存在两个空格...
  • 我试过了,但我只得到一个类型不匹配的错误。 resultCount0001(storeCategory) = Application.WorksheetFunction.XLookup(storeNo & "0001" & pWS.Range(storeCategoryMatGroup1 & weekNum + 4), oWS.Range("A:A") & oWS.Range("B:B") & oWS.Range("C:C"), oWS.Range("A:B").Offset(weekNum + firstWeek)) 无论如何,我会在下面查看您的其他解决方案。 :)

标签: excel vba


【解决方案1】:

请尝试下一个代码。它使用一个数组,即使在大范围内也应该非常快,在内存中工作:

Sub LookupThreeConditions()
 Dim sh As Worksheet, sh1 As Worksheet, lastRow As Long, arr, i As Long
 Dim dep As String, stLoc As String, matGr As String, result As Long
 
 dep = "1101": stLoc = "0001": matGr = "1225"
 Set sh = ActiveSheet
 Set sh1 = sh.Next 'use here the sheet you need to copy in
 
 lastRow = sh.Range("A" & sh.rows.Count).End(xlUp).row
 arr = sh.Range("A2:F" & lastRow).value 'put the range in an array
 For i = 1 To UBound(arr)
    If arr(i, 1) & arr(i, 2) & arr(i, 3) = dep & stLoc & matGr Then
        result = arr(i, 5) + arr(i, 6): Exit For
    End If
 Next i
 MsgBox "Result is " & result
 sh1.Range("A1").value = result 'use here what range you need
 End Sub

【讨论】:

  • 看起来很有希望,但我对arr = sh.Range("A2:E" & lastRow).value 感到困惑如果这些列不是都彼此相邻怎么办?如果我想改为第 4 周和第 5 周怎么办?我已经更新了 OP 以反映这一点。
  • 我现在尝试了您的代码,尽管与我拥有的所有 CountIfs 相比,它使我的代码更加整洁,但它使其运行速度慢了很多。循环通过 6000 行似乎并不是超级高效。 :P 请记住,我随后也多次运行此代码。我正在循环运行它,检查 65 个不同部门的 2 个不同 StorLocs 中的 12 个不同 matGroup。那是 1560 个循环,如果我运行 52 周(1 年),那就是 81.120 个循环。
  • 没关系,我做了一些新的优化,例如跳过不必要的循环并为每个部门设置一个新数组,限制必须循环的行数。现在速度挺快的。 :) 非常感谢!
  • @Vikestart 您是否按原样测试了代码?你有没有尝试任何修改?如果不是,它应该非常快,即使是 100000 行。它可以很容易地修改为一个函数,返回所需的结果......“不必要的循环”是什么意思?代码找到一个事件后退出循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多