Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como substituir o PROCV adequadamente por código VBA no Excel

Como podemos substituir decentemente o PROCV por um código VBA no Excel no cenário abaixo?

O cenário é o seguinte: tenho um universo de 4000 valores distintos na coluna A e apenas 8 valores possíveis na coluna B.

Até entendo que daria para fazer dois WHILE encadeados com IF no interior deles, mas acho pouco prático, além de "perder tempo" de processamento (mesmo que neste caso não faça tanta diferença).

Como solução, cogitei criar 8 Arrays diferentes e usar Select Case para comparar num bloco só (evitando escrever todos as quase 700 possibilidades em casa "Case".

Só que não tá dando certo, pois aparentemente: ou não consigo usar Select Case comparando um valor com um Array inteiro, ou tem algo errado no código (vide abaixo).

Alguém conseguiria me esclarecer o que está errado no código abaixo, ou ainda sugerir outra possibilidade de substituição do PROCV no VBA?

Seria possível ainda usar Collection neste caso? Se sim, como faria para usar a comparação de um valor com algum item da Collection (ou seja, qual a sintaxe para uso da Collection com Select Case)?

lin = 2

Dim var7824(1000) As Variant
Dim var7723(1000) As Variant

var7824(0) = "0022"
var7824(1) = "0023"
var7824(2) = "0024"

var7723(0) = "0029"
var7723(1) = "0030"
var7723(2) = "0031"

While Range("A" & lin).Value <> 0

    Select Case Range("A" & lin).Value

        'Case 22, 23, 24, 25, 26
        Case var7824()
            Range("B" & lin).Value = "7824"

        'Case 29, 30, 31, 32, 33, 34, 35, 36, 37
        Case var7723
            Range("B" & lin).Value = "7723"

    End Select

lin = lin + 1

Wend
1 resposta
solução!

Oi Patrícia tudo bem?

É o Select Case não aceita vetor como tipo.

Eu criei a função PROCVBA (que é parecida com a função PROC que procura tanto em linha, como em coluna, mas no meu consegue procurar nos dois fazendo uma diagonal se necessário)

Assim não precisa ficar fazendo while dentro de while, embora debaixo dos panos é isso que vai estar acontecendo mas fica uma forma bem mais clean.

Dá uma olhada nos exemplos


Sub EscreverCelulasNaPlanilha()



Cells(9, 8) = "1"
Cells(9, 9) = "A"
Cells(10, 8) = "2"
Cells(10, 9) = "B"
Cells(11, 8) = "3"
Cells(11, 9) = "C"
Cells(12, 8) = "4"
Cells(12, 9) = "D"
Cells(13, 8) = "5"
Cells(13, 9) = "E"
Cells(14, 8) = "6"
Cells(14, 9) = "F"
Cells(16, 8) = "1"
Cells(16, 9) = "2"
Cells(16, 10) = "3"
Cells(16, 11) = "4"
Cells(16, 12) = "5"
Cells(16, 13) = "6"
Cells(17, 8) = "A"
Cells(17, 9) = "B"
Cells(17, 10) = "C"
Cells(17, 11) = "D"
Cells(17, 12) = "E"
Cells(17, 13) = "F"
Cells(23, 11) = "1"
Cells(24, 11) = "2"
Cells(24, 13) = "A"
Cells(25, 11) = "3"
Cells(25, 13) = "B"
Cells(26, 11) = "4"
Cells(26, 13) = "C"
Cells(27, 11) = "5"
Cells(27, 13) = "D"
Cells(28, 11) = "6"
Cells(28, 13) = "E"
Cells(29, 13) = "F"



End Sub

Sub DemoVertical()

    numero = 1
    letra = PROCVBA(numero, Range("H9:H14"), 1, 0)

    MsgBox (letra)



End Sub

Sub DemoHorizontal()

    numero = 3
    letra = PROCVBA(numero, Range("H16:M16"), 0, 1)

    MsgBox (letra)



End Sub

Sub DemoDiagonal()

    numero = 4
    letra = PROCVBA(numero, Range("K23:K28"), 2, 1)

    MsgBox (letra)



End Sub


Function PROCVBA(valor_procurado, matriz_tabela, num_indice_coluna, num_indice_linha)

'procurar_intervalo nesse caso é false

For Each celula In matriz_tabela


    If celula = valor_procurado Then


        PROCVBA = Cells(celula.Row + num_indice_linha, celula.Column + num_indice_coluna)
        Exit Function


    End If



Next



End Function

Espero ter ajudado!!!