excel VBA如何检查三个值是否相同,排除单元格为空的情况?

tyu7yeag  于 2023-03-24  发布在  其他
关注(0)|答案(3)|浏览(315)

我一直在绞尽脑汁寻找最好的方法来检查三个单元格中的单元格值是否完全相同。然而,棘手的部分是,这三个单元格中的任何一个都可以是空白的。我还没有找到一个简单的解决方案,不需要在单元格的公式中使用十几个IF和EXACT函数。我已经尝试了一些用户定义的函数,希望减少单元格公式的复杂性。但我不知道最好的方法是什么
我正在做一个excel表格,允许用户将excel文件导入到工作簿中有一段代码可以解析导入文件的文件名,并将“E1#”粘贴到相应的单元格中(我们将该单元格称为A2。单元格A1显示文件的目录路径。Quant文件的“E1#”编号位于A2中,序列文件的“E1#”号放在A4中(文件目录放在A3中),订单详细信息“E1#”放在A6中。每个文件都是可选的,因此“E1#”单元格(A2,A4,A6)中可以具有或可以不具有数值。(A7)应显示“匹配”,因为单元格A2和A6具有匹配的E1#数字“1234”。如果只有一个单元格具有数字值,而其他两个E1#-单元格为空,如果多于一个的E1#单元格填充有数字并且如果数字彼此不匹配,则灰色单元格显示“不匹配”。
旁注:当我最初创建这个Excel工作表时。用户说他们只需要数量和序列文件字段。所以创建一个单元格公式(在灰色单元格内)用于检查两个单元格(A2和A4)的匹配相当简单。ISBLANK和EXACT语句使它工作得很好,但现在我必须添加第三个文件字段(“订单详情”)到excel表.现在我不知道如何使“匹配/不匹配”检查工作了.有没有更好的算法或代码的做法,我可以采取?任何意见将不胜感激.

我试过用IF、ISBLANK和EXACT函数创建一个很长的单元格公式。但是单元格公式变得太复杂,无法调试和阅读。我已经创建了几个用户定义的函数,但是我仍然很难用它来创建一个工作和内聚的单元格公式。(下面)我的UDF用EXACT函数在单元格公式中使用。InterfaceComp_str返回E1#数字或空白。

Public Function InterfaceComp_str(c1 As String, c2 As String) As String
If Len(c1) < 1 Then
    InterfaceComp_str = c2
End If

If Len(c2) < 1 Then
    InterfaceComp_str = c1
End If

If Not IsEmpty(c1) And Not IsEmpty(c2) Then
    If InStr(c1, c2) <> 0 And Len(c1) = Len(c2) Then
        InterfaceComp_str = c2
    End If
End If
End Function`

下面是灰色单元格(A7)中的单元格公式的示例:=IF(EXACT(InterfaceComp_str(A2,A4),InterfaceComp_str(A4,A6)),"Match", "Mismatch")
但是这个单元格公式有很多问题,我不确定我的UDF是否是解决这个问题的正确方法。

lvjbypge

lvjbypge1#

如果输入相同,则以下VBA代码将返回true,如果输入不同(包括空),则返回false

'Returns true if all inputs are the same value
Public Function MultiMatch(ParamArray ipArgs() As Variant) As Boolean

    Dim myC As Collection
    Set myC = New Collection
    
    On Error Resume Next
    Dim myItem As Variant
    For Each myItem In ipArgs
        dim myTest as String
        myString = vba.CStr(myItem)
        If VBA.Len(myItem) = 0 Then
            MultiMatch = False
            Exit Function
        End If
        
        ' try to add the key to the collection
        ' an error will be generated if the key already exists
        ' so you might need to format the string if rounding is an issue for single/double values
        myC.Add Key:=myTest, Item:=0
        If Err.Number = 0 Then
            MultiMatch = False
            exit function
        End If
    
    Next
    
    MultiMatch = True
    
End Function
yqkkidmi

yqkkidmi2#

试试下面的功能。
使用方式:

=InterfaceComp_str(A2,A3,A4) 'or as many cells as you want to compare

自定义项:

Function InterfaceComp_str(ParamArray inputs() As Variant) As String
    Dim i As Long, n As Long, v, firstVal, misMatch As Boolean
    
    For i = 0 To UBound(inputs)       'loop over input cells
        v = CStr(inputs(i))           'current value
        If Len(v) > 0 Then            'non-blank?
            n = n + 1                 'count of non-blank items
            If Len(firstVal) = 0 Then
                firstVal = v          'store first non-blank value
            Else
                If v <> firstVal Then 'different value?
                    misMatch = True   'flag mismatch
                    Exit For          'no need to check further
                End If
            End If
        End If
    Next i
    If n > 1 Then                     '>1 entry?
        InterfaceComp_str = IIf(misMatch, "Mismatch", "Match")
    End If
End Function

参数数组:https://learn.microsoft.com/en-us/office/vba/language/concepts/getting-started/understanding-parameter-arrays

xoshrz7s

xoshrz7s3#

您也可以使用工作表公式执行此操作。
如果单元格中只有数字要检查,则:

A7: =LET(
    arr, INDEX(
        A2:A6,
        {1, 3, 5}
    ),
    remBlanks, FILTER(
        arr,
        arr <> ""
    ),
    matchCount, COUNTA(
        FILTER(
            remBlanks,
            INDEX(
                remBlanks,
                1
            ) = remBlanks
        )
    ),
    IF(
        COUNTA(remBlanks) <= 1,
        "",
        IF(
            COUNTA(remBlanks) =
                matchCount,
            "Match",
            "Mismatch"
        )
    )
)

如果还需要测试单元格中的值是否为数字,则简单的测试可能包括比较COUNTCOUNTA

A7: =LET(
    arr, INDEX(
        A2:A6,
        {1, 3, 5}
    ),
    remBlanks, FILTER(
        arr,
        (arr <> "")
    ),
    matchCount, COUNTA(
        FILTER(
            remBlanks,
            INDEX(
                remBlanks,
                1
            ) = remBlanks
        )
    ),
    IF(
        COUNTA(remBlanks) <= 1,
        "",
        IF(
            AND(
                COUNTA(
                    remBlanks
                ) = matchCount,
                COUNT(
                    remBlanks
                ) =
                    COUNTA(
                        remBlanks
                    )
            ),
            "Match",
            "Mismatch"
        )
    )
)

了解Excel将看起来像日期和/或科学记数法数字的值视为数字,以及输入值的约束条件,您可能需要检查所有字符是否都是数字。

相关问题