Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
Por Diego100ges
Posts
#48506
Pessoal, bom dia.
Em um PROCV com VBA (VLookup) caso o retorno seja um erro (não encontre o valor) como posso trazer isso em mensagem sem parar o código todo?
Por exemplo, eu realizo alguns procvs, mas se o primeiro der erro todos vão dar, então eu poderia colocar essa mensagem já no inicio.

Muito Obrigado!
Avatar do usuário
Por Jimmy
Avatar
#48508
Olá Diego,

Poste uma planilha modelo com os dados, macro, etc. Facilita muito na resposta!

Jimmy San Juan
Avatar do usuário
Por Jimmy
Avatar
#48509
Se for pra chutar, pode ser que o código abaixo seja o que necessita, mas sem ver a planilha é só um chute...
Código: Selecionar todos
Sub Macro1()
    Proc = Application.VLookup(6, Sheets("Plan1").Range("E4:E10"), 1, False)
    If IsError(Proc) Then MsgBox "Não Achou...": Exit Sub
    MsgBox "Continuando..."
End Sub
Jimmy San Juan
Editado pela última vez por Jimmy em 25 Set 2019 às 16:29, em um total de 1 vez.
#48510
Olá, Jimmy!
Infelizmente não consigo postar a planilha, acabei não fazendo em um projeto separado para depois implementar nela, mas o código é o seguinte:
Código: Selecionar todos
Private Sub CommandButton1_Click()
Data = TextoData.Value

If TextoUC.Text = "" Or TextoData.Text = "" Then
    MsgBox "Você não preencheu a unidade consumidora ou a data de lançamento", vbOKOnly
    Exit Sub
Else
   Firstkey = TextoUC.Text & "-" & Application.WorksheetFunction.EoMonth(Data, 6) + 1
End If

Data = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 2, False)
Uc = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 3, False)
ConsumoPonta = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 5, False)
ConsumoFPonta = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 6, False)
ConsumoRPonta = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 7, False)
ConsumoRFPonta = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 8, False)
ConsumoDPonta = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 9, False)
ConsumoDFPonta = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 11, False)
Iluminacaopublica = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 15, False)
EncargoConexao = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 17, False)
AjusteFaturamento = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 20, False)
PisPasep = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 21, False)
Cofins = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 22, False)
TotalFatura = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 24, False)
ValorDevec = Application.WorksheetFunction.VLookup(Firstkey, Sheets("Faturas").Range("Faturas"), 16, False)

Label16.Caption = Data
Label17.Caption = Uc
Label18.Caption = ConsumoPonta
Label19.Caption = ConsumoFPonta
Label20.Caption = ConsumoRPonta
Label21.Caption = ConsumoRFPonta
Label22.Caption = ConsumoDPonta
Label23.Caption = ConsumoDFPonta
Label24.Caption = Iluminacaopublica
Label25.Caption = EncargoConexao
Label26.Caption = AjusteFaturamento
Label27.Caption = PisPasep
Label28.Caption = Cofins
Label29.Caption = TotalFatura
Label30.Caption = ValorDevec

End Sub
Até ai então o que acontece, quando eu estou lançando dados novos, esse código me retorna ao lado os dados do último lançamento dessa loja (mês anterior) para quem estiver lançando fazer uma pequena análise se os valores estão muito diferentes do que estavam no mês anterior, eu uso como chave primária o nome da loja concatenado com a data atual -1 mês ou seja (NOME DA LOJA-DATA MÊS ANTERIOR), e utilizo essa chave para fazer o PROCV, porém, se o gestor responsável não lançou os dados no mês anterior por algum motivo, o PROCV não vai encontrar nada, e o código vai dar ERRO, eu gostaria que não acontecesse o ERRO, apenas que não viessem resultados. e ele pudesse continuar o lançamento normal.
#48518
Segue um anexo Jimmy
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Jimmy
Avatar
#48530
Olá Diego,

Segue a planilha.

Apliquei aquela proposta que fiz, e deu certo.

Alterei a formatação da data, pois estava aparecendo no formato numérico. Não sei se fiz bem; pode ser que você tenha deixado naquele formato propositalmente. Se for o caso, me avise que eu volto.

Na SUB Label16_Click() eu dei um Call TextoData_Change, pois as 2 tinham exatamente o mesmo código.

Na sub CommandButton2_Click tirei o +1 das 16 linhas de atribuição ao range, e transferi para a linha de definição da variável Linha. Não há necessidade de fazer uma operação matemática 16 vezes se pode fazer apenas uma.

Jimmy San Juan
Você não está autorizado a ver ou baixar esse anexo.
Editado pela última vez por Jimmy em 25 Set 2019 às 16:28, em um total de 1 vez.
#48548
Jimmy, bom dia!
Funcionou perfeitamente, você é o cara!

Porém, fiquei com uma dúvida no critério de somar +1 na última linha, a dúvida é o seguinte, como eu faço pra preencher sempre na linha abaixo, se eu quiser colocar todas as informações na mesma coluna, eu tentei aqui, e salva apenas a última informação, seriam valores para janeiro até dezembro, e acaba salvando apenas dezembro, pode me explicar como seria o código?
Segue planilha em anexo.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Jimmy
Avatar
#48571
Olá,

Na Sub CommandButton2_Click você joga algo na variável JAN e depois joga no laber. Não precisa do intermediário JAN para isso. Pode jogar direto, como está agora na macro (dá uma olhada). Mesmo porque, JAN poderia receber uma data que nada tem a ver com Janeiro, logo, mesmo que queira intermediário, deve mudar o nome da variável, pra, pro exemplo Data1, Data2, ... Data12, porque JAN leva a crer que se trata de janeiro, o que não é verdade. pelo que eu entendi, o primeiro mês vai ser o próprio mês da data digitada, e os seguintes na sequencia dele, certo?

Na Sub TextoData_Change tinham 2 IFs com o mesmo conteúdo (executavam a mesma coisa) mas com verificações distintas. Juntei os 2 usando o operaor lógico OU. Se isso ou aquilo acontecer, then faça algo.

Quando você faz isso:
WSSheet.Range("D" & Linha) = TextoJan.Value
WSSheet.Range("D" & Linha) = TextoFev.Value

está jogando algo na célula, mas depois joga outra coisa, que substitui a primeira coisa jogada. O que tem que fazer é acrescentar, e não apenas jogar, ou jogar tudo de uma vez (mais fácil).
Digite manualmente na planilha, na linha 15, o como você gostaria que ficassem os dados, só pra eu entender a intenção. Fiquei sem saber se quer tudo junto mesmo, ou se quer as informações separadas por espaço, ou vírgula, ou CHR(10), etc. Vendo o que você quer fica mais fácil.

Essa parte então não entendi mesmo:
WSSheet.Range("C" & Linha) = TextoUC.Value
WSSheet.Range("C" & Linha) = TextoUC.Value

Você está executando 12 vezes a mesma instrução de movimentação!!

Nas mensagens acima que você julgar que ajudaram de alguma forma com a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita. Obrigado.

Jimmy San Juan
Você não está autorizado a ver ou baixar esse anexo.
#48606
Olá Jimmy, muito obrigado por sua ajuda, acabo aprendendo muito contigo!
Então, estou subindo a planilha com o formato que eu gostaria que ficasse, quando a repetição 12x da mesma informação, eu preciso que aconteça, porque todo começo de ano, recebemos os valores para os próximo 12 meses (Janeiro a Dezembro), e como ao longo do ano eu vou utilizando eles com PROCV, eu mantenho a tabela nesse formato para funcionar o PROCV, ai acontece de eu repetir 12x a mesma informação.
Quanto aos valores que estou jogando tudo na mesma célula, realmente não é isso que eu quero, como é um valor diferente por mês, gostaria que eles fossem se aplicando abaixo, e não substituindo sempre na mesma célula.

Muito obrigado!
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Jimmy
Avatar
#48618
Olá Diego,

Alterei a macro para ficar da forma que pediu.

Você tem 4 blocos de 12 linhas: uma para a coluna B, uma pra C, uma pra D e a quarta para gerar os 12 meses. Eu mudei isso por um FOR de 12 ciclos, para deixar a macro mais compacta. Deixei as linhas originais comentadas logo abaixo do FOR/NEXT. Escolha a forma que prefere e apague a outra. As linhas originais estão comentadas, mas antes de comentar eu as alterei para que funcionem como você quer.

Avalie e dê retorno.

Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.

Jimmy San Juan
Você não está autorizado a ver ou baixar esse anexo.
#48621
Muito obrigado Jimmy, funcionou perfeitamente!
Só fiquei com uma dúvida, quando eu utilizo uma "," em algum campo, e rodo a macro, ele cola na planilha como texto
por exemplo, coloquei la no mês 2, o valor de 0,199 e nos demais meses número inteiro, os inteiros são lançados como números, mas o 1,99, foi lançado como texto, é algum Format() que tenho que utilizar?

Novamente, muito obrigado!
Avatar do usuário
Por Jimmy
Avatar
#48626
Ok,

No terceiro FOR/NEXT, troque a linha
Código: Selecionar todos
        WSSheet.Range("D" & Lin) = Choose(Lin - Linha + 1, TextoJan, TextoFev, TextoMar, TextoAbr, _
            TextoMai, TextoJun, TextoJul, TextoAgo, TextoSetembro, TextoOut, TextoNov, TextoDez).Value
por
Código: Selecionar todos
        WSSheet.Range("D" & Lin) = Replace(Choose(Lin - Linha + 1, TextoJan, TextoFev, TextoMar, TextoAbr, _
            TextoMai, TextoJun, TextoJul, TextoAgo, TextoSetembro, TextoOut, TextoNov, TextoDez).Value, ",", ".")
O Replace troca tudo o que é vírgula por ponto, deixando no formato que o VBA gosta.

Essa é a vantagem de ter a atribuições dentro de um loop. Se precisar alterar algo, altera uma vez só. No caso das 12 linhas, se tiver optado por elas e não o FOR, terá que aplicar essa correção 12 vezes. Ainda bem que são só 12 e não 1500! :D

Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.

Jimmy San Juan
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord