procv em VBA (vlookup ?)  [Resolvido]

Visual Basic for Aplication e macros no Excel.
Regras do fórum
Sua dúvida foi respondida? Marque como RESOLVIDO em seus tópicos, usando o botão com marca verde. Imagem

procv em VBA (vlookup ?)

Mensagempor Barreiro » Seg Nov 13, 2017 5:08 pm

tenho uma tabela excel e preciso fazer um vlookup de um campo em uma matriz e não consigo definir um campo-de-pesquisa. dá "tipos incompatíveis".
Em anexo vai a tabela e o VBA. Onde erro ?
O campo de pesquisa é E9 e a matriz e j9:k58
Dá pra ajudar ?
Obrigado.
Você não está autorizado a ver ou baixar esse anexo.
Barreiro
Membro
Membro
 
Mensagens: 5
Registrado em: Seg Nov 13, 2017 4:56 pm
Has thanked: 2 times
Have thanks: 1 time

{ SO_SELECT }

Re: procv em VBA (vlookup ?)

Mensagempor Mauro Coutinho » Ter Nov 14, 2017 7:54 am

Barreiro, o ideal é enviar o modelo de acordo com a rotina que enviou, na mesma faz referencias a varias abas que não existem no modelo anexado, e tambem acrescentar qual o resultado esperado, da forma que está dificilmente terá alguma ajuda.

[]s
Mauro Coutinho
São José dos Pinhais-Pr


Se a resposta foi últil para você, por gentileza, clique na mãozinha ao lado direito da sua tela. No canto superior.
Avatar do usuário
Mauro Coutinho
Ninja do Excel
Ninja do Excel
 
Mensagens: 3783
Registrado em: Sex Mar 26, 2010 9:24 pm
Localização: São José dos Pinhais - Pr
Has thanked: 168 times
Have thanks: 1369 times

Re: procv em VBA (vlookup ?)

Mensagempor Osvaldomp » Ter Nov 14, 2017 8:10 am

Experimente:

substitua esta linha
edieta = Application.WorksheetFunction.VLookup(eCelE, Dietas, 2, False)

por esta
edieta = Application.WorksheetFunction.VLookup(Range(eCelE).Value, Dietas, 2, False)

obs. não encontrei no seu código a atribuição de valor à variável Dietas
Osvaldo
Osvaldomp
Membro
Membro
 
Mensagens: 434
Registrado em: Seg Mar 26, 2012 6:33 pm
Has thanked: 85 times
Have thanks: 224 times

Re: procv em VBA (vlookup ?)

Mensagempor Barreiro » Ter Nov 14, 2017 10:33 am

Veja o que defini:
Dim eDietas As Range

depois:
Set ws3 = Sheets("CONTAGEM DIARIA")
Set eDietas = Worksheets(ws3).Range("b4:c53")

Daí quero acessar a informação e faço:
eDieta = Application.WorksheetFunction.VLookup(eCelE, eDietas, 2, False)

Acho que a definição para eDietas está errada.
Qdo executa o "Set eDietas" dá o erro "tipos incompatíveis.

Se ajudar, posso mandar as planilhas todas e o VBA.

Obrigado antecipadamente.
Barreiro
Membro
Membro
 
Mensagens: 5
Registrado em: Seg Nov 13, 2017 4:56 pm
Has thanked: 2 times
Have thanks: 1 time

Re: procv em VBA (vlookup ?)

Mensagempor Osvaldomp » Ter Nov 14, 2017 1:23 pm

antes você postou esta
edieta = Application.WorksheetFunction.VLookup(Range(eCelE).Value, Dietas, 2, False)

depois postou esta ???
edieta = Application.WorksheetFunction.VLookup(Range(eCelE).Value, eDietas, 2, False)

se eDietas se refere à tabela da Plan1, J9:K58, altere no seu código conforme abaixo
Código: Selecionar todos
Set eDietas = Sheets("Plan1").Range("J9:K58")

Código: Selecionar todos
edieta = Application.WorksheetFunction.VLookup(Range(eCelE).Value, eDietas, 2, False)
Osvaldo
Osvaldomp
Membro
Membro
 
Mensagens: 434
Registrado em: Seg Mar 26, 2012 6:33 pm
Has thanked: 85 times
Have thanks: 224 times

Re: procv em VBA (vlookup ?)

Mensagempor Barreiro » Ter Nov 14, 2017 1:53 pm

Estou te mandando a(s) planilhas e o VBA.
Testa e veja o que acontece.
Abrçs
Você não está autorizado a ver ou baixar esse anexo.
Barreiro
Membro
Membro
 
Mensagens: 5
Registrado em: Seg Nov 13, 2017 4:56 pm
Has thanked: 2 times
Have thanks: 1 time

Re: procv em VBA (vlookup ?)

Mensagempor Mauro Coutinho » Ter Nov 14, 2017 3:18 pm

Troque :
Set eDietas = Worksheets(ws3).Range("b4:c53")
por:
Set eDietas = ws3.Range("b4:c53")
Como você já setou ws3 não pode citar da forma que fez (Set ws3 = Sheets("CONTAGEM DIARIA"))

E como o Osvaldo já comentou, troque esta instrução :
eDieta = Application.WorksheetFunction.VLookup(eCelE, Dietas, 2, False) pela a que ele indicou :
edieta = Application.WorksheetFunction.VLookup(Range(eCelE).Value, eDietas, 2, False)

O tempo é curto, não deu para fazer mais testes, mas você terá erro no final, devido a encontrar linha vazia porque em sua contagem está utilizando o valor de "B90" + 9 e depois + 10, você tem de acertar senão na instrução que verifica e sai da rotina "If i > ws1.[b90] + 10 Then" o Valor será sempre menor. Se não conseguir, assim que tiver um tempinho dou uma olhada ou algum colega já ajusta.
Uma outra dica : Para você efetuar os testes sem ter de ficar enviando para a impressor e gastando papel, troque : ".PrintOut" por ".PrintPreview" assim é exibido na tela e não vai para a impressora.

[]s
Mauro Coutinho
São José dos Pinhais-Pr


Se a resposta foi últil para você, por gentileza, clique na mãozinha ao lado direito da sua tela. No canto superior.

For this post the author Mauro Coutinho thanked:
Barreiro (Qua Nov 15, 2017 10:48 am)
Avatar do usuário
Mauro Coutinho
Ninja do Excel
Ninja do Excel
 
Mensagens: 3783
Registrado em: Sex Mar 26, 2010 9:24 pm
Localização: São José dos Pinhais - Pr
Has thanked: 168 times
Have thanks: 1369 times

Re: procv em VBA (vlookup ?)

Mensagempor Barreiro » Qui Nov 16, 2017 10:54 am

Tudo bem Mauro, entendi. Mas como definir eDietas ?
Como Range tá dando o mesmo erro "tipos incompatíveis".
Grato
Barreiro
Membro
Membro
 
Mensagens: 5
Registrado em: Seg Nov 13, 2017 4:56 pm
Has thanked: 2 times
Have thanks: 1 time

Re: procv em VBA (vlookup ?)  [Resolvido]

Mensagempor Mauro Coutinho » Qui Nov 16, 2017 12:24 pm

Barreiro, não entendi o que quis dizer com "como definir eDietas ?", esta Variável já está definida na instrução "Set eDietas = ws3.Range("b4:c53")".
Se está tendo mensagem de erros, talvez não seja nela, verifique seu código linha por linha, lembro que no teste que fiz no dia após estes acertos, não deu erro.

O único erro que vai dar, é o que comentei no post anterior referente a qde de linhas, na contagem está considerando até a linha 88 e só tem 19 registros, e quando o procv encontrar "vazio" vai dar erro, então ou tem de adicionar uma condição para sair qdo vazia ou alterar a forma que considera os ranges.
A rotina completa ficaria assim com as modificações citadas anteriormente :
Código: Selecionar todos
Sub Emite_Etiquetas()
'
'Autor: Carlos Frederico Bastos
'Data: 20170927
'Objetivo: Emissão de Etiquetas
'
    Dim i, j, k, m, n, x As Integer
    Dim eLin1  As Integer
    Dim eTeste As String
    Dim ws1, ws2, ws3 As Worksheet
    Dim eDietas As Range
'
    Set ws1 = Sheets.Application.ActiveSheet
    Set ws2 = Sheets("Etiqueta")
    Set ws3 = Sheets("CONTAGEM DIARIA")
    Set eDietas = ws3.Range("b4:c53")
'
    i = 9
    eAndar = ws1.[C4]
    eLin1 = i
    eRefeicao = ws1.[H4]
'
    With ws2
       
        For i = i To ws1.[b90] + 9
            j = 1
            For j = j To 47 Step 11
                k = 1
                For k = k To 2
                    If k = 1 Then
                        eB1 = "C" & j       ' Local
                        eB2 = "C" & (j + 1) ' Paciente
                        eD1 = "D" & (j + 2) ' Idade
                        eD2 = "D" & (j + 3) ' Refeição
                        eC1 = "C" & (j + 6) ' Dieta
                        eC2 = "C" & (j + 7) ' Característica
                        eC3 = "B" & (j + 8) ' Obs
                       
                        eCelA = "A" & eLin1
                        eCelB = "B" & eLin1
                        eCelC = "C" & eLin1
                        eCelD = "D" & eLin1
                        eCelE = "E" & eLin1
                        eCelF = "F" & eLin1
                        eCelG = "G" & eLin1
                        'edieta = Application.WorksheetFunction.VLookup(eCelE, eDietas, 2, False)
                        edieta = Application.WorksheetFunction.VLookup(Range(eCelE).Value, eDietas, 2, False)
                        MsgBox edieta
                        .Range(eB1).Value = ws1.Range(eCelA).Value
                        .Range(eB2).Value = ws1.Range(eCelB).Value
                        .Range(eD1).Value = ws1.Range(eCelC).Value
                        .Range(eD2).Value = eRefeicao
                        .Range(eC1).Value = ws1.Range(eCelE).Value
                        .Range(eC2).Value = ws1.Range(eCelF).Value
                        .Range(eC3).Value = ws1.Range(eCelG).Value
                    Else
                        eI1 = "J" & j
                        eI2 = "J" & (j + 1) '2
                        eM1 = "K" & (j + 2) '3
                        eM2 = "K" & (j + 3) '4
                        eK1 = "J" & (j + 5) '6
                        eK2 = "J" & (j + 6) '7
                        eK3 = "I" & (j + 8) '9
                        eCelA = "A" & eLin1
                        eCelB = "B" & eLin1
                        eCelC = "C" & eLin1
                        eCelD = "D" & eLin1
                        eCelE = "E" & eLin1
                        eCelF = "F" & eLin1
                        eCelG = "G" & eLin1
                        .Range(eI1).Value = ws1.Range(eCelA).Value
                        .Range(eI2).Value = ws1.Range(eCelB).Value
                        .Range(eM1).Value = ws1.Range(eCelC).Value
                        .Range(eM2).Value = eRefeicao
                        .Range(eK1).Value = ws1.Range(eCelE).Value
                        .Range(eK2).Value = ws1.Range(eCelF).Value
                        .Range(eK3).Value = ws1.Range(eCelG).Value
                    End If
                    eLin1 = eLin1 + 1
                    x = ws1.[b90]
                    i = i + 1
                    If i > ws1.[b90] + 10 Then
                        i = 9
                        Exit For
                    End If
                Next k
            Next j
'            i = i - 1
            .PageSetup.PrintArea = ""
            .PageSetup.PrintArea = .Range("B1:N54").Address
            '.PrintOut
            .PrintPreview
           
            m = 1
            For m = m To 47 Step 11
                n = 1
                For n = n To 2
                    If n = 1 Then
                        eB1 = "C" & m       ' Local
                        eB2 = "C" & (m + 1) ' Paciente
                        eD1 = "D" & (m + 2) ' Idade
                        eD2 = "D" & (m + 3) ' Refeição
                        eC1 = "C" & (m + 5) ' Dieta
                        eC2 = "C" & (m + 6) ' Característica
                        eC3 = "B" & (m + 8) ' Obs
                        .Range(eB1).Value = ""
                        .Range(eB2).Value = ""
                        .Range(eD1).Value = ""
                        .Range(eD2).Value = ""
                        .Range(eC1).Value = ""
                        .Range(eC2).Value = ""
                        .Range(eC3).Value = ""
                    Else
                        eI1 = "J" & m
                        eI2 = "J" & (m + 1)
                        eM1 = "K" & (m + 2)
                        eM2 = "K" & (m + 3)
                        eK1 = "J" & (m + 6)
                        eK2 = "J" & (m + 7)
                        eK3 = "I" & (m + 8)
                        .Range(eI1).Value = ""
                        .Range(eI2).Value = ""
                        .Range(eM1).Value = ""
                        .Range(eM2).Value = ""
                        .Range(eK1).Value = ""
                        .Range(eK2).Value = ""
                        .Range(eK3).Value = ""
                    End If
                Next n
            Next m
        Next i
    End With
End Sub


[]s
Mauro Coutinho
São José dos Pinhais-Pr


Se a resposta foi últil para você, por gentileza, clique na mãozinha ao lado direito da sua tela. No canto superior.

For this post the author Mauro Coutinho thanked:
Barreiro (Sex Nov 17, 2017 9:31 am)
Avatar do usuário
Mauro Coutinho
Ninja do Excel
Ninja do Excel
 
Mensagens: 3783
Registrado em: Sex Mar 26, 2010 9:24 pm
Localização: São José dos Pinhais - Pr
Has thanked: 168 times
Have thanks: 1369 times

Re: procv em VBA (vlookup ?)

Mensagempor Barreiro » Sex Nov 17, 2017 9:33 am

Maravilha. Tinha esquecido de mudar a outra instrução.
O HSE (hosp. dos servidores de PE), agradece.
Abrçs.

For this post the author Barreiro thanked:
Mauro Coutinho (Sex Nov 17, 2017 8:25 pm)
Barreiro
Membro
Membro
 
Mensagens: 5
Registrado em: Seg Nov 13, 2017 4:56 pm
Has thanked: 2 times
Have thanks: 1 time


Voltar para VBA & Macros

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes