【问题标题】:VBA: loop with INDEX MATCH won't go to next valueVBA:带有 INDEX MATCH 的循环不会转到下一个值
【发布时间】:2019-01-08 20:33:57
【问题描述】:

VBA 新手在这里...任何帮助表示赞赏:)

我有一张这样的桌子:

S/N     UNIQREF   REF   OPE
ABC123             10    C1
ABC123             20    C2
ABC123             30    I1
ABC123             40    IM1
DEF456             10    C1
DEF456             20    I1
DEF456             30    DR1
HIJ789             10    C1
HIJ789             20    DR1
HIJ789             30    I1
HIJ789             40    XX1

...我需要填写 UNIQREF 列。

规则是:循环遍历我的S/N(序列号)列,只要保持不变,查找“I1”OPE(操作)左边的值,写入UNIQREF在所有行中。

例如我们以ABC123为例,在OPE中查找“I1”,看到它旁边(左侧)的值是30,所以我们在UNIQREF列中为所有ABC123 S/N写了30。

同样,我们会为所有 DEF456 S/N 写 20,为所有 HIJ789 S/N 写 30。

到目前为止,这是我的代码:

Public Sub routine()

Dim gamWAL as Worksheet
Set gamWAL = ThisWorkbook.Sheets("gamWAL")

i = 3 'because data in my table starts on line 3, line 2 is columns titles and line 1 is comments. Also starts in Column B (my S/N column)...

Do While gamWAL.Cells(i, "B").Value <> "" 'i want the loop to stop at the when the S/N list is over

    Do While gamWAL.Cells(i, "B").Value = gamWAL.Cells(i + 1, "B").Value

        gamWAL.Cells(i, "E").Value = Application.WorksheetFunction.Index(gamWAL.Range("F" & i & ":G3000"), Application.WorksheetFunction.Match("I1", gamWAL.Range("G" & i & ":G3000"), 0), 1)

        i = i + 1

    Loop

Loop

End Sub

问题:它确实为所有 ABC123 S/N 写入“20”,除了最后一个,然后没有继续到下一个 S/N“组”...宏继续“计算" 虽然(超长,因为该表目前是 900 行,但预计会增长到大约 4000 行)..

有什么技巧可以完成这项工作吗?

谢谢!

【问题讨论】:

    标签: vba excel loops


    【解决方案1】:

    试试,

    =INDEX(C:C, AGGREGATE(15, 7, ROW($2:$12)/((A$2:A$12=A2)*(D$2:D$12="I1")), 1))
    

    假设 REF 是数字并且 I1 对于每个 S/N 都是唯一的,那么 SUMIFS 也可以,并且对于记录删除/添加更加通用和友好。

    =sumifs(c:c, a:a, a2, d:d, "I1")
    

    【讨论】:

    • 那是严重的巫术。
    • 对 SUMIF 的思考也很好。
    • sumifs 的东西是伏都教。它就像一个魅力!小心解释(用简单的英语)它实际上做了什么?因为我不明白我们在总结什么......不过谢谢一百万!
    • 您正在“求和”一个数字;特别是 D 列为 I1 且 A 列与 A 列中的任何内容匹配的行中的单个数字。
    【解决方案2】:

    另一种公式方法,尽管毫无疑问比 Jeeped 的效率低,因为它是一个数组公式(使用 Ctrl+Enter+Shift 会显示大括号)。

    =INDEX($C$2:$C$12,MATCH(1,IF($A$2:$A$12=$A2,IF($D$2:$D$12="I1",1)),0))
    

    有一个非数组变体,见http://www.xl-central.com/lookup-multiple-criteria.html

    【讨论】:

      【解决方案3】:

      这是一个可能的 VBA 解决方案,经过 2 个步骤并使用替换。

      第 1 步:

      • 遍历Range("A1:A13")中的所有单元格,查看D列的值是否为I1。如果是这种情况,则写入参考列中的值,否则写入与 SN 中相同的值。
      • 这是您从第一步中得到的:

      第 2 步:

      • 循环遍历相同的范围,只要UNIQREF 相同,就执行替换。
      • 只能在UNIQREF 列中进行替换。

      以下是这两个步骤的代码:

      Public Sub TestMe()
      
          Dim startCell As Long: startCell = 2
          Dim endCell As Long: endCell = 13
      
          Dim cnt As Long, cnt2 As Long
          Dim myCell As Range
          Dim lookFor As String: lookFor = "I1"
          Dim wks As Worksheet: Set wks = Worksheets(1)
      
          For cnt = startCell To endCell
              Set myCell = wks.Cells(cnt, 1)
              If myCell.Offset(, 3) = lookFor Then
                  myCell.Offset(, 1) = myCell.Offset(, 2)
              Else
                  myCell.Offset(, 1) = myCell
              End If
          Next cnt
      
          For cnt = startCell To endCell
              Set myCell = wks.Cells(cnt, 1)
              If myCell <> myCell.Offset(, 1) Then
                  wks.Range(wks.Cells(startCell, 2), wks.Cells(endCell, 2)).Replace _
                      What:=myCell, Replacement:=myCell.Offset(, 1), LookAt:=xlPart
              End If
          Next cnt
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        相关资源
        最近更新 更多