【问题标题】:Comparison of row with a column (named range)行与列的比较(命名范围)
【发布时间】:2021-07-30 03:28:22
【问题描述】:

我的数据:

TABLE 1 Person1 Person2 Person3 Person4 Person5 Person6 Person7 Person8
Monday A B C D E E F F
Tuesday B F D C E E F A
Wednesday C D A F E E F F
PLACE
A
B
C
D

我的问题: 我想比较每天命名范围Place 中的所有值是否都在Monday, Tuesday, Wednesday,... 的行内,如果有些值丢失,这些值是哪一个。
所以,对于Wednesday,它应该给出一个"B" missingIF 公式或任何你有的建议。 "E""F" 不在 Place 中,应该忽略它们。

到目前为止我尝试了什么: 研究总是让我比较 2 列而不是行和列。
我试过这样的数组函数($B3:$I3 == "Monday row" == "row1"):

=INDEX(Place;SMALL(IF(ISERROR(MATCH(Place;$B3:$I3;0));(ROW(Place)-MIN(ROW(Place))+1);"");ROWS($A$1:A1)))

错误:比较单个行需要许多“帮助”列。还有“#NUM!”即使来自Place 的所有值都出现或仅缺少一个值。

我开始使用许多 COUNTIF 公式,例如

=COUNTIF(row1;INDEX(Place;1))+COUNTIF(row1;INDEX(Place;2))+COUNTIF(row1;INDEX(Place;3))+COUNTIF(row1;INDEX(Place;4))

当所有值都出现时给我一个"4",如果部分或全部缺失,则给我一个较低的值。但是如何将获取这些数字与“查看”缺少哪些值导致“低于 4”数字联系起来?

【问题讨论】:

    标签: excel comparison


    【解决方案1】:

    我认为这个 UDF 会给你想要的结果。

    Function Check(Data As Range) As String
        ' 296
        
        ' Data specifies one row from the table excl column #1
        Dim Fun()       As String               ' function return value
        Dim i           As Long                 ' index to Fun()
        Dim Places      As Variant              ' array of range "Place"
        Dim R           As Long                 ' loop counter; Places
        Dim Match       As Variant              ' result of Match() function
        
        ' this command will slow down your workbook.
        '   If inconvenient (too sluggish), remove it.
        ' If removed, the UDFs in the worksheet may not recalculate as you expect.
        '   Click "Calculate Now" on the ribbon's 'Formulas' tab to update.
        Application.Volatile
        
        ' the named range "Places" must exist in the worksheet
        ' in the sample it's B10:B13
        Places = ActiveSheet.Range("Places").Value
        ReDim Fun(UBound(Places))
        
        For R = 1 To UBound(Places)
            Match = Application.Match(Places(R, 1), Data, 0)
            If IsError(Match) Then
                i = i + 1
                Fun(i) = Places(R, 1)
            End If
        Next R
        
        If i Then
            Fun(0) = "Missing: "
        Else
            Fun(0) = "All present"
        End If
        ReDim Preserve Fun(i)
        Check = Replace(Join(Fun, ", "), ",", vbNullString, 1, 1)
    End Function
    

    代码必须粘贴到标准代码模块。您必须插入它,默认情况下它的名称类似于“Module1”,您可以更改它。不要使用任何现有的代码模块。通过输入类似于以下的语法从工作簿中的任何位置调用该函数:=Check(C3:J3)。这里 C3:J3 定义了表格的倒数第二列,不包括“星期一”,结果将根据范围 Places 评估此范围中列出的项目。

    【讨论】:

    • 有没有办法只使用公式?只是好奇……
    • 如果你质疑我的宗教信仰,我会说是的。但如果你问我开发这样一个公式需要多长时间,我必须承认我不知道。
    • 如果考虑公式解决方案,你能说一下你的Excel是什么版本的吗?
    【解决方案2】:

    如果你有 Excel 2019 或更高版本,你可以像这样使用 Textjoin 和 Countif:

    =TEXTJOIN(",",,IF(COUNTIF(B2:I2,Places)=0,Places,""))
    

    其中 Places 是一个命名范围 $A$6:$A$9。

    您必须重复很多公式或使用单独的列来使其显示“全部存在”或“缺失”

    =IFS(SUM(COUNTIF(B2:I2,Places))=ROWS(Places),"All present",SUM(COUNTIF(B2:I2,Places))=0,"All missing",TRUE,"Missing "&TEXTJOIN(",",,IF(COUNTIF(B2:I2,Places)=0,Places,"")))
    

    除非您有 Excel 365,您可以在其中使用 Let 来避免重复:

    =LET(counts,COUNTIF(B2:I2,Places),
    total,SUM(counts),
    IFS(total=ROWS(Places),"All present",total=0,"All missing",TRUE,"Missing "&TEXTJOIN(",",,IF(counts=0,Places,""))))
    

    如果您没有 Textjoin,我认为除了使用单个 Countif 或 Matches 之外别无选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多