Sub使用IF(INDEX())给出#N / A.

时间:2014-03-13 00:01:30

标签: excel-vba vba excel

我厌倦了

如果col C中的单元格与col A中的单元格匹配,那么在该行中,col N = 1中的单元格col N = 0中的所有其他单元格

在我的Sub中,我继续在所有单元格中获得#N / A

由于

Sub Match()
Dim LastRow As Long
Dim ws As Worksheet

Set ws = Sheets("Source")

LastRow = ws.Range("A" & ws.Rows.count).End(xlUp).Row

ws.Range("N2:N" & LastRow).Formula = "=IF(INDEX('Source'!A:A,MATCH($A2,'Source'!$C:$C,0))<> "" "",1,0)"

Range("N2:N" & LastRow).Copy
Range("N2:N" & LastRow).PasteSpecial xlPasteValues

Range("N1").Select
ActiveCell.FormulaR1C1 = "Grouping"

End Sub

2 个答案:

答案 0 :(得分:1)

我会采取不同的方法。根据我的经验,使用VBA循环遍历单元格比尝试使用MATCH函数更快。它不必以这种方式计算任何东西。

(我也喜欢命名我的范围,因为通过VBA查找最后一行并不总是可靠的。所以我可能首先命名我的A范围,然后参考该范围。或者我和#39; d抛出一个输入框,让用户动态选择范围。但我会使用你拥有的模型。)

Sub Match()
    Dim LastRow As Long
    Dim ws As Worksheet
    Dim matchRange As Range
    Dim testRange As Range
    Dim foundIt As Range

    Set ws = Sheets("Source")

    LastRow = ws.Range("A" & ws.Rows.count).End(xlUp).Row

    Set matchRange = ws.Range("A2:A" & LastRow)
    Set testRange = ws.Range("N2:N" & LastRow)

    For Each c In testRange.Cells
        Set foundIt = matchRange.Find(What:=c.Value, _
                                      LookIn:=xlValues, _
                                      LookAt:=xlWhole, _
                                      SearchOrder:=xlByRows, _
                                      SearchDirection:=xlNext, _
                                      MatchCase:=False)

        If Not foundIt Is Nothing Then
            c.Value2=1
        End If
    Next c

    Range("N1").Select
    ActiveCell.FormulaR1C1 = "Grouping"

End Sub

答案 1 :(得分:1)

试试这个:

Sub MyMatch()
    Dim LastRow As Long
    Dim ws As Worksheet

    Set ws = Sheets("Source")

    With ws
        LastRow = ws.Range("A" & .Rows.Count).End(xlUp).Row

        With .Range("N2:N" & LastRow)
            .Formula = "=1*ISNUMBER(MATCH($A2,'Source'!$C:$C,0))"
            .Value = .Value
        End With

        .Range("N1").FormulaR1C1 = "Grouping"
    End With
End Sub

注意:

  1. 使用公式的方法比循环+查找快得多
  2. 如果ISNUMBER(MATCH(..))找不到任何内容,则
  3. False会返回Match(因为这种情况Match会返回#N/A并且它不是数字),{ {1}}否则。部分True会将=1*ISNUMBER(..) / True转换为False / 1
  4. 我将0更改为Copy/PasteSpecial - 速度更快
  5. 我更改了您的子名称以避免混淆情况(因为有内置函数.Value = .Value