VBA:使用INDEX MATCH循环不会转到下一个值

时间:2018-08-01 09:59:22

标签: excel vba excel-vba loops

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行)。

有关这项工作的任何提示吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

尝试

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

enter image description here

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

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

答案 1 :(得分: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))

enter image description here

存在非数组变量,请参见http://www.xl-central.com/lookup-multiple-criteria.html

答案 2 :(得分:1)

这是一种可能的VBA解决方案,需要2个步骤并使用replace。

步骤1:

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

enter image description here

第2步:

  • 循环遍历同一范围,并且只要UNIQREF相同,就进行替换。
  • 仅应在UNIQREF列中进行替换。

enter image description here

这是两个步骤的代码:

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