' Função PROCX - Substitui a função PROCX do Excel
Public Function PROCX(valorProcurado As Variant, matrizPesquisa As Range, matrizRetorno As Range, _
Optional seNaoEncontrado As Variant = "Valor não encontrado", _
Optional modoCorrespondencia As Integer = 0, _
Optional modoPesquisa As Integer = 1) As Variant
Dim i As Long
Dim ultimaLinha As Long
Dim passo As Long
Dim valorAtual As Variant
If matrizPesquisa.Rows.Count <> matrizRetorno.Rows.Count Then
PROCX = "Erro: As matrizes de pesquisa e retorno não têm o mesmo tamanho!"
Exit Function
End If
If modoPesquisa = 1 Then
i = 1
ultimaLinha = matrizPesquisa.Rows.Count
passo = 1
ElseIf modoPesquisa = -1 Then
i = matrizPesquisa.Rows.Count
ultimaLinha = 1
passo = -1
Else
PROCX = "Erro: Modo de pesquisa inválido! Use 1 (cima para baixo) ou -1 (baixo para cima)."
Exit Function
End If
Do While i <> ultimaLinha + passo
valorAtual = matrizPesquisa.Cells(i, 1).Value
Select Case modoCorrespondencia
Case 0 ' Correspondência exata
If valorAtual = valorProcurado Then
PROCX = matrizRetorno.Cells(i, 1).Value
Exit Function
End If
Case 2 ' Correspondência com curingas (usando Like)
If valorAtual Like valorProcurado Then
PROCX = matrizRetorno.Cells(i, 1).Value
Exit Function
End If
End Select
i = i + passo
Loop
PROCX = seNaoEncontrado
End Function
' Registrar PROCX com IntelliSense
Sub RegistrarPROCX()
Application.MacroOptions _
Macro:="PROCX", _
Description:="Função personalizada que substitui o PROCX do Excel. Busca um valor na matriz de pesquisa e retorna o valor correspondente na matriz de retorno.", _
Category:="Funções Personalizadas", _
ArgumentDescriptions:=Array( _
"ValorProcurado - O valor que você quer buscar na matriz de pesquisa.", _
"MatrizPesquisa - O intervalo de células onde o valor será buscado.", _
"MatrizRetorno - O intervalo de células que contém o valor de retorno.", _
"SeNaoEncontrado - O valor que será retornado se não for encontrado (opcional).", _
"ModoCorrespondencia - 0 para correspondência exata, 2 para curingas (opcional).", _
"ModoPesquisa - 1 para pesquisar de cima para baixo, -1 de baixo para cima (opcional).")
End Sub