Excel 使用IF(INDEX())表示不适用

Excel 使用IF(INDEX())表示不适用,excel,vba,Excel,Vba,我很累 如果C列中有一个单元格与a列中的单元格相匹配,则在该行中,N列中的单元格=1,N列中的所有其他单元格=0 在我的潜艇里,我的所有单元都不合格 谢谢 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).Fo

我很累

如果C列中有一个单元格与a列中的单元格相匹配,则在该行中,N列中的单元格=1,N列中的所有其他单元格=0

在我的潜艇里,我的所有单元都不合格

谢谢

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

我会采取不同的方法。根据我的经验,使用VBA在单元格中循环比尝试使用匹配函数要快。它不必这样计算任何东西

我还喜欢命名我的范围,因为通过VBA查找最后一行并不总是可靠的。所以我可能会先命名我的A区域,然后引用该区域。或者我抛出一个输入框,让用户动态选择范围。但我会用你的模型

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
试试这个:

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
注:

使用公式的方法比loop+find快得多。 是数字表。。如果Match未找到任何内容,则返回False,因为此案例Match返回N/A且不是数字,否则返回True。Part=1*ISNUMBER。。将真/假转换为1/0。 我将Copy/PasteSpecial更改为.Value=.Value-速度更快 我已经更改了您的子组件的名称,以避免混淆情况,因为有内置函数Application.Match
tmoore82,谢谢,testRange=ws。Range2:N&LastRow需要是testRange=ws。Range2:E&LastRow和outputRange=ws。Range2:N&LastRow我不需要过度编写测试范围。这可能吗?我不确定我完全理解您的后续问题。您是否要求修改上述代码,使其引用列E而不是A,或者这是一个附加步骤?您能详细说明不覆盖testRange的意思吗?你是指变量还是实际的单元格值?tmoore82,谢谢你的回答,我不清楚我需要查看E2:E中的每个单元格,并将其与B2:B中的单元格范围进行比较。如果有匹配项,则在L列中的相应单元格中输入1,否则输入0:~simoco,感谢代码,速度要快得多,但找不到匹配项,或者每件事都是匹配项,因为它为每个单元格返回1。谢谢。Tim,如果在C列中找到A列中的相应值,则在N列中返回1,否则返回0,否则此要求来自您的question@simoco,使用匹配公式是否总是更快?这是可伸缩的吗?我最近在处理两个列表,一个是40k,一个是60k,在可操作性方面,我使用loop+find比使用匹配更幸运。宏运行了一段时间,但当我使用Match no宏时,只是填充了一系列单元格,我在工作簿中不断遇到处理问题的问题。一般来说,内置函数比VBA快得多,因为它们是用C编写的。对于包含许多公式的工作表,我会在宏和应用程序的begining中添加Application.Calculation=xlCalculationManual.Calculation=xlCalculationAutomatic,以防止在运行过程中重新计算工作表我也想知道,谢谢你的提问和回答。