1

所以这开始于我试图帮助别人,被难住了。所以基本上我在 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                      

样本数据

4

3 回答 3

3

很高兴您正在努力提高您的 VBA 技能。我建议的第一件事是避免使用.Select. 直接使用范围对象。例如:

Range("B2").Select
strTarget = ActiveCell.Value

变成

strTarget = Range("B2").Value

此外,一般来说,在检查“空”值时使用vbNullStringor而不是. 至于你的程序为什么会崩溃,可能是你使用了. 就像,在大多数情况下应该避免(绝对在这个)。尽管您更新了 ,但它在语句的范围内,因此一旦您关闭它 ( ),这些更改就会撤消(我建议逐步执行宏并观察 and 的值)。情况可能并非如此,但我知道它适用于其他变量,这就是我避免(并避免在语句中重新分配值)的原因Len(variable)=0""WithSelectActiveCellWithEnd WithActiveCellstrTargetActiveCellWithWith

无论如何,我会添加以下代码并重写循环如下:

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语句放在 之前SelectExit Do在 2nd 的赋值语句之后添加一个If,因为如果您的两列符合条件,您希望停止循环。我也更新了我的代码以显示这一点。

于 2012-05-25T18:37:25.700 回答
1

INDEXMATCH,或SUMPRODUCT倾向于为此工作。前者的一个例子:

http://support.microsoft.com/kb/59482
于 2012-05-25T01:40:59.087 回答
1

如果您可以保证 val1 和 val2 是唯一的(例如,在搜索 g 和 v 时,只有 1 行带有 g 和 v)那么您可以使用 sumifs
我将 val1、val2 和 val3 放在 A、B 和 C 列中,并搜索 E、F 和 G 中的答案,当然想出了这个公式
=SUMIFS(C2:C9,A2:A9,E2,B2:B9,F2)
,如果 val3 不是数字,或者您要查找的字母超过 1 行,则此公式将失败

于 2012-05-25T15:34:14.073 回答