仅当A列和B列符合我的标准时,如何在C列中返回值?

时间:2012-05-24 23:56:40

标签: excel vba

所以这开始是因为我试图帮助别人,感到难过。所以基本上我在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                      

示例数据

3 个答案:

答案 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的更改就会撤消(我建议单步执行)通过宏并观察strTargetActiveCell)的值。情况可能并非如此,但我知道它适用于其他变量,这就是我避免使用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).ValueSheet1.Cells(i,2).Value等等,以获取不同列的值该行(而不是使用范围对象和.Offset

编辑:运行代码后,崩溃的原因是您的If语句。无论如何,你想要去下一个单元格。移除Else并将End If语句放在Select之前。在第二个Exit Do中的赋值语句后添加If,因为如果两列符合条件,则要停止循环。我已更新我的代码以显示此内容。

答案 1 :(得分:1)

INDEXMATCHSUMPRODUCT往往效果很好。前者的一个例子:

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行,则会失败