所以这开始是因为我试图帮助别人,感到难过。所以基本上我在B,C和D列中都有值。如果我的标准在H2和I2中,当我在H2和I2中的标准在B和C中匹配时,则在D中有相应的答案来填充J2。基本上是一个有2个标准的vlookup。 我有类似的东西。
Sub test()
Dim rngCrit1 As Range
Dim rngCrit2 As Range
Dim rngAnswer As Range
Dim strTarget As String
Set rngCrit1 = Range("H2")
Set rngCrit2 = Range("I2")
Set rngAnswer = Range("J2")
Range("B2").Select
strTarget = ActiveCell.Value
Do While strTarget <> ""
With ActiveCell
If strTarget = rngCrit1 Then
If .Offset(0, 1).Value = rngCrit2 Then
rngAnswer.Value = .Offset(0, 2)
Else
.Offset(1, 0).Select
strTarget = ActiveCell.Value
End If
End If
End With
Loop
End Sub
现在这件事只是崩溃,没有调试或任何东西。我是自学成才,所以我确定我把狗狗搞砸了。
*请注意,这只是为了满足我自己的兴趣并不重要,所以如果超过5分钟,请帮助其他人,而不是我。
Val1 Val2 Val3 Crit1 Crit2 Answer
a r 12 g v 22
b r 14
c s 15
d s 16
e t 18
f t 19
g y 20
g v 22
示例数据
答案 0 :(得分:3)
很高兴您正在努力提高自己的VBA技能。我建议的第一件事就是避免使用.Select
,它会改进您编写的任何宏。直接使用范围对象。例如:
Range("B2").Select
strTarget = ActiveCell.Value
变为
strTarget = Range("B2").Value
此外,通常,在检查“空”值而不是vbNullString
时使用Len(variable)=0
或""
。至于你的程序崩溃的原因,可能是你使用With
。与Select
类似,在大多数情况下应该避免(绝对是在这一个中)。虽然您更新了ActiveCell
,但它在With
声明的范围内,因此一旦您关闭它(End With
),对ActiveCell
的更改就会撤消(我建议单步执行)通过宏并观察strTarget
和ActiveCell
)的值。情况可能并非如此,但我知道它适用于其他变量,这就是我避免使用With
(并避免在With
语句中重新分配值)的原因
无论如何,我会添加以下代码并重写循环,如下所示:
Dim r as range
set r = Range("B2") 'keep in mind this range is on the ActiveSheet, so you're better
'off explicitly naming the Sheet e.g. Sheet1.Range("B2")
strTarget1 = Range("B2").Value
strTarget2 = Range("C2").Value
Do While Len(strTarget) <> 0
If strTarget1 = rngCrit1 Then
If strTarget2 = rngCrit2 Then
rngAnswer.Value = r.Offset(0,2)
Exit Do
End If
End If
set r = r.Offset(1,0)
strTarget1 = r.Value
strTarget2 = r.Offset(0,1).Value
Loop
请注意,您还可以使用Long
计数器i
为该行循环,然后调用Sheet1.Cells(i,1).Value
,Sheet1.Cells(i,2).Value
等等,以获取不同列的值该行(而不是使用范围对象和.Offset
编辑:运行代码后,崩溃的原因是您的If
语句。无论如何,你想要去下一个单元格。移除Else
并将End If
语句放在Select
之前。在第二个Exit Do
中的赋值语句后添加If
,因为如果两列符合条件,则要停止循环。我已更新我的代码以显示此内容。
答案 1 :(得分:1)
INDEX
和MATCH
或SUMPRODUCT
往往效果很好。前者的一个例子:
http://support.microsoft.com/kb/59482
答案 2 :(得分:1)
如果你能保证val1和val2是唯一的(例如,当搜索g&amp; v时,只有1行带有g和v)那么你可以使用sumifs
我把val1,val2和val3放在A,B和A列中。 C,并在G中搜索到E,F和答案,并想出了这个公式
=SUMIFS(C2:C9,A2:A9,E2,B2:B9,F2)
当然,如果val3不是数字,或者您要查找的字母超过1行,则会失败