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行)。
有关这项工作的任何提示吗?
谢谢!
答案 0 :(得分:2)
尝试
=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")
答案 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))
存在非数组变量,请参见http://www.xl-central.com/lookup-multiple-criteria.html
答案 2 :(得分:1)
这是一种可能的VBA解决方案,需要2个步骤并使用replace。
步骤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