none
Erro na explicação do comando WorksheetFunction.Match RRS feed

  • Pergunta

  • Gostaria de reportar o que acredito seja um erro na descrição do funcionamento do comando Application.WorksheetFunction.Match.

    No seguinte endereço: https://msdn.microsoft.com/EN-US/library/office/ff835873.aspx

    Está descrito que, caso o valor procurado no array não seja encontrado, a função Match retorna um valor de erro #N/A .

    O correto é que, caso não seja encontrado o valor procurado, o resultado retornado é Empty - vazio, detectável apenas com a função IsEmpty ou através do objeto err.number. Nenhuma outra função de manipulação de erros, como IsError ou IsNA, consegue detectar a falha na busca do valor no array.


    • Editado gcj_br terça-feira, 28 de abril de 2015 03:22
    terça-feira, 28 de abril de 2015 03:20

Respostas

  • Se você usar Application.Match e não for encontrado, será retornado um tipo de dados Variant de subtipo de erro. Então, a forma correta de usar seria algo como:

    Sub MatchComApplication()
        Dim vIndex As Variant
        
        vIndex = Application.Match(5, Range("A1:A5"), 0)
        If Not IsError(vIndex) Then
            'Encontrou
        Else
            'Não encontrou
        End If
    End Sub

    Se usar WorksheetFunction.Match e um valor não for encontrado, você obterá um erro em tempo de execução:

    Sub MatchComWorkhseetFunction()
        Dim lIndex As Long
        
        On Error Resume Next
        lIndex = Application.Match(5, Range("A1:A5"), 0)
        On Error GoTo 0
        
        If lIndex > 0 Then
            'Encontrou
        Else
            'Não encontrou
        End If
    End Sub

    Existe uma ressalva para os dois casos: se você buscar um 5 numérico e no vetor de busca houver apenas um 5 como texto, ele não encontrará o item. Então, cada busca sua deverá buscar a forma de texto e numérica dos seus itens, no caso de sua tabela não estar normalizada:

    Sub MatchComWorkhseetFunction()
        Dim lIndex As Long
        
        On Error Resume Next
        lIndex = Application.Match(CStr(5), Range("A1:A5"), 0)
        If lIndex = 0 Then lIndex = Application.Match(CDbl(5), Range("A1:A5"), 0)
        On Error GoTo 0
        
        If lIndex > 0 Then
            'Encontrou
        Else
            'Não encontrou
        End If
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 28 de abril de 2015 12:51
    Moderador

Todas as Respostas

  • Bom dia gcj_br,

    Você declarou a variável como numérica?

    Caso esteja declarado como numérica (int, long... ...) retornará zero (0).

    Se for declarada como Variant retornará vazio (empty)

    Se for declarada como String retornará "" (empty)

    Qualquer coisa da o grito.

    Abraço

    terça-feira, 28 de abril de 2015 03:44
  • Se você usar Application.Match e não for encontrado, será retornado um tipo de dados Variant de subtipo de erro. Então, a forma correta de usar seria algo como:

    Sub MatchComApplication()
        Dim vIndex As Variant
        
        vIndex = Application.Match(5, Range("A1:A5"), 0)
        If Not IsError(vIndex) Then
            'Encontrou
        Else
            'Não encontrou
        End If
    End Sub

    Se usar WorksheetFunction.Match e um valor não for encontrado, você obterá um erro em tempo de execução:

    Sub MatchComWorkhseetFunction()
        Dim lIndex As Long
        
        On Error Resume Next
        lIndex = Application.Match(5, Range("A1:A5"), 0)
        On Error GoTo 0
        
        If lIndex > 0 Then
            'Encontrou
        Else
            'Não encontrou
        End If
    End Sub

    Existe uma ressalva para os dois casos: se você buscar um 5 numérico e no vetor de busca houver apenas um 5 como texto, ele não encontrará o item. Então, cada busca sua deverá buscar a forma de texto e numérica dos seus itens, no caso de sua tabela não estar normalizada:

    Sub MatchComWorkhseetFunction()
        Dim lIndex As Long
        
        On Error Resume Next
        lIndex = Application.Match(CStr(5), Range("A1:A5"), 0)
        If lIndex = 0 Then lIndex = Application.Match(CDbl(5), Range("A1:A5"), 0)
        On Error GoTo 0
        
        If lIndex > 0 Then
            'Encontrou
        Else
            'Não encontrou
        End If
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    terça-feira, 28 de abril de 2015 12:51
    Moderador