Application.Match Error 2015

时间:2017-12-28 12:14:04

标签: excel vba excel-vba

我的电子表格包含超过30,000行数据,每行有38个数据点。为了确定是否有任何重复的行,我连接了每行的14个字段,并修剪了数据。这为每行包含349个字符创建了一个键。

编辑:当所有14个字段完全相同时,会发生密钥的重复。从视觉评论中,我已经确定了大约200行(2000年),其中所有14个字段中的数据完全相同。

然后,我使用application.match运行搜索,以确定是否已创建该密钥。当没有重复时,application.match函数工作正常。但是,如果存在重复,则返回

  

2015年错误

我知道这是函数返回#VALUE的时候。当我使用立即窗口检查时,值是重复的,当我输入" = Xi = Yj"在电子表格中,它表示相同(即TRUE)

由于我需要知道项目下一部分的正确行值,我想知道的是,是否有任何方法可以识别重复值,并获得正确的行值?

我的代码如下(仍然只是一个PoC):

While Cells(a, 1) <> vbNullString

    If Cells(a, 36).Interior.Color = 5296274 Then

    ElseIf Cells(a, 36) <> vbNullString Then

    Else
        Cells(a, 39) = Trim(Cells(a, 3) & Cells(a, 4) & Cells(a, 5) & Cells(a, 6) & Cells(a, 7) & Cells(a, 8) & Cells(a, 9) & Cells(a, 10) & _
        Cells(a, 11) & Cells(a, 12) & Cells(a, 13) & Cells(a, 14) & Cells(a, 15) & Cells(a, 16) & _
        Cells(a, 17) & Cells(a, 18) & Cells(a, 19))

        Cells(a, 44) = Len(Cells(a, 39))

        m = vbNullString

        m = Application.Match(Cells(a, 39), Range(Cells(2, 39), Cells(a - 1, 39)), 0)

        If m = vbNullString Then
            Cells(a, 39).Select
            Selection.Style = "Good"

        Else
'            Range(Cells(a - 1, 39), Cells(a, 39)).Select
'            Selection.Style = "Bad"

        End If
    End If
    a = a + 1

Wend

2 个答案:

答案 0 :(得分:1)

尝试将错误嵌入条件中,有两个选项。像这样:

If IsError(Application.Match(Cells(a, 39), Range(Cells(2, 39), Cells(a - 1, 39)), 0)) Then
     'm = something
Else    
     m = Application.Match(Cells(a, 39), Range(Cells(2, 39), Cells(a - 1, 39)), 0)
End If

答案 1 :(得分:0)

经过大量的实验,我想出了错误的原因。

正在创建的密钥长度为349个字符。许多Excel的功能的最大字符限制为256(0 - 255)。

基于此,我使用修剪功能剪下了按键。

现在代码如下:

While Cells(a, 1) <> vbNullString

    If Cells(a, 36).Interior.Color = 5296274 Then

    ElseIf Cells(a, 36) <> vbNullString Then

    Else
'        Cells(a, 39) = Join(Application.Index(Cells(a, 3).Resize(, 17).Value, 0, 0), ";")
        Cells(a, 39) = Trim(Cells(a, 3)) & Trim(Cells(a, 4)) & Trim(Cells(a, 5)) & Trim(Cells(a, 6)) & Trim(Cells(a, 7)) & Trim(Cells(a, 8)) & Trim(Cells(a, 9)) & Trim(Cells(a, 10)) & _
        Trim(Cells(a, 11)) & Trim(Cells(a, 12)) & Trim(Cells(a, 13)) & Trim(Cells(a, 14))

'       & Trim(Cells(a, 15)) & Trim(Cells(a, 16)) & Trim(Cells(a, 17)) & Trim(Cells(a, 18)) & Trim(Cells(a, 19))) removed

        Cells(a, 44) = Len(Cells(a, 39))

        m = vbNullString

        m = Application.Match(Cells(a, 39), Range(Cells(1, 39), Cells(a - 1, 39)), 0)

        If m = vbNullString Then
            Cells(a, 39).Select
            Selection.Style = "Good"
'            Cells(a, 41).Select
'            Selection.ClearContents

        Else
            Cells(a, 39).Select
            Selection.Style = "Bad"
            Cells(a, 40) = m

            Cells(m, 39).Select
            Selection.Style = "Bad"
            Cells(m, 40) = a

        End If
    End If
    a = a + 1

Wend