Notifications
Clear all

procv em VBA (vlookup ?)

10 Posts
3 Usuários
0 Reactions
1,440 Visualizações
(@barreiro)
Posts: 0
New Member
Topic starter
 

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.

 
Postado : 13/11/2017 3:08 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

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

 
Postado : 14/11/2017 5:54 am
(@osvaldomp)
Posts: 857
Prominent Member
 

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

 
Postado : 14/11/2017 6:10 am
(@barreiro)
Posts: 0
New Member
Topic starter
 

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.

 
Postado : 14/11/2017 8:33 am
(@osvaldomp)
Posts: 857
Prominent Member
 

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

Set eDietas = Sheets("Plan1").Range("J9:K58")

edieta = Application.WorksheetFunction.VLookup(Range(eCelE).Value, eDietas, 2, False)
 
Postado : 14/11/2017 11:23 am
(@barreiro)
Posts: 0
New Member
Topic starter
 

Estou te mandando a(s) planilhas e o VBA.
Testa e veja o que acontece.
Abrçs

 
Postado : 14/11/2017 11:53 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

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

 
Postado : 14/11/2017 1:18 pm
(@barreiro)
Posts: 0
New Member
Topic starter
 

Tudo bem Mauro, entendi. Mas como definir eDietas ?
Como Range tá dando o mesmo erro "tipos incompatíveis".
Grato

 
Postado : 16/11/2017 8:54 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

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 :

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

 
Postado : 16/11/2017 10:24 am
(@barreiro)
Posts: 0
New Member
Topic starter
 

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

 
Postado : 17/11/2017 7:33 am