Notifications
Clear all

Passagem sem PROCV Excel VBA

13 Posts
2 Usuários
0 Reactions
2,087 Visualizações
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Boa tarde a todos,

Necessito da vossa ajuda. :idea:

Estou a ter alguma dificuldade em conseguir pesquisar nas linhas de uma coluna informação passada de outro separador.

A ideia é aproveitar a informação de um separador de Registo e passar os dados desse mesmo registo para a atualização em novas colunas de um separador de base de dados no Excel

Na imagem o Separador Registo, onde o registo "2017-1" é a chave a pesquisar na BD. Os campos a azul, têm na fórmula o PROCV, onde estou a ir buscar à BD os campos preenchidos pelo Registo " 2017-1". A ideia é o utilizador neste separador colocar o registo a pesquisar (2017-1 / 2017-2, etc..) (aparecendo através do PROCV os campos a azul já registados BD) e preencher depois os campos a amarelo. A ideia agora é pegar nos valores das células correspondente à cor amarelo, ir ao separador BD, procurar na coluna C o registo "2017-1" e preencher na coluna G e H os novos campos preenchidos, desse mesmo registo colocado.

Tenho já criado o Separador Registo:

E dados já preenchidos no Separador BD, onde os campos a amarelo são os campos a serem preenchidos conforme registo colocado no separador registos..

Já desenvolvi o seguinte código e necessito de algum feedback sobre o mesmo, face a estar com erros..

Sub Sorriso1_Click()
'
' buscavalor Macro
'
	Application.ScreenUpdating = False

        Dim reg As String

		Dim nome As String
        Dim emm As String

        
        'Variavel ultima linha com valores da Base de Dados
        Dim UltimaLinha As Integer
        
        'Pega valor do registo "2017-#"
        reg = Range("B2").Value

		'Pega valor preenchido pelo utilizador para passar para registo da BD
        nome = Range("B8").Value
        emm = Range("B9").Value

		
        'Após colocação dos campos acima pelo utilizador ele passa para o Separador BD
        Sheets("BDA").Select
            
		'Regista o número de Linhas já preenchidas da Base de Dados para diminuir as linhas de procura
        UltimaLinha = Range("C1048576").End(xlUp).Row + 1
        
        
        Do Until ActiveCell = reg
        
        	ActiveCell.Offset(1, 0).Select 'desce uma linha

        	If ActiveCell = reg Then   'faz a análise lógica

				ActiveCell.Offset(0, 5).Select 'desloca para a coluna G
            	ActiveCell.FormulaR1C1 = nome
				ActiveCell.Offset(0, 1).Select 'desloca para a coluna H
				ActiveCell.FormulaR1C1 = emm
			End If
		Loop
End Sub

'Creio que em vez do ciclo Do Until, possa fazer através de um For Registo ou um ciclo IF...
'Do género:

Ultimalinha = ActiveCell.Row + 1 'pega ultima linha preenchida
'Range("C" & Ultimalinha).Select 'coloca o curso na mesma
For i = 1 To ultimalinha 'percursso o ciclo da primeira à ultima linha preenchida da coluna Registo "2017-1, até 2017-ultimo registo"
        Range("C" & i).Select
	If(Range"C" & i).Value = Reg 'Se encontrar registo 2017-1 na coluna C
		Range("G" & Reg).Value = nome 'Vai à coluna G dessa mesma linha e coloca o valor que deu ao nome no separador registo
		Range("H" & Reg).Value = emm 'Vai à coluna H dessa mesma linha e coloca o valor que deu ao emm no separador registo
	End If 'termina ciclo
Next i 'termina ciclo

'Voltar para Separador Registo
 Sheets("Registos").Select
'Posiciona Cursor no B2, no do Registo
    Range("B2").Select

Esta segunda parte talvez fosse mais direta, mas mesmo assim estou com dificuldade, estando a pensar se preciso do For e do IF.

Cada Registo é único na coluna C, havendo sempre só um..

Até estava na ideia se o Registo colocado for por exemplo "2017-5" aparecer uma MsgBox dizendo "Registo não existe na BD" e se passar para lá com sucesso MsgBox "Registo 2017-X  Atualizado"

Alguém me pode dar umas dicas? :?:

Obrigado desde já.

 
Postado : 19/02/2017 1:17 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Teste para passar campos do separador registos para o respetico campo Registo, colunas G e H a amarelo na BD:

 
Postado : 19/02/2017 1:38 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa noite Pedro,

Veja se o código que se encontra no Módulo1 ajuda.

Qualquer dúvida é só perguntar.

att,

 
Postado : 19/02/2017 5:05 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Olá Bruno,

O meu muito obrigado!

Seu código foi muito útil e sem dúvida que eu que estou a aprender vba me deu muitas ideias de como fazer coisas de forma mais direta e com outros códigos.

Eu atualizei o ficheiro que coloco em anexo.
Mas se for possível, gostaria que caso o utilizador introduza um registo que não conste na coluna C, por exemplo 2017-150, aparece mensagem que o registo não existe!
Acha possível?

Outra coisa que reparei é que se colocar no separador registo, o número 2017-3, ele assume sempre como data, não aparecendo info na função PROCV dos campos abaixo da BD. Deve ser algum problema de formatação do campo.

Acha que me pode ajudar nestes dois pontos?

O meu muito obrigado!

 
Postado : 19/02/2017 5:44 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Pedro,

Dê uma olhada nas alterações que fiz no código. Coloquei a mensagem para o caso de não achar registro, mas não vi o problema com a data.
Por via das dúvidas alterei a variável 'Registro' para Variant.

att,

 
Postado : 19/02/2017 7:23 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Está a funcionar corretamente.
O problema com a Data era que quando colocava o registo 2017-1 ele passava para jan-2017.

Mas agora está a funcionar em perfeição!
Coloco o ficheiro em anexo de forma a alguém que necessitar do exemplo.
Coloquei ao mesmo tempo a opção para gravar registo para PDF numa pasta já definida.

Obrigado e um abraço!
Pedro Santos

 
Postado : 20/02/2017 3:56 am
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Só uma questão Bruno, caso o utilizador já tenha realizado um Registro e já tenha os campos nome e equipamento preenchidos na Base dados é possível aparecer uma MsgBox a pedir confirmação?
Do genéro:

If WsRe.Cells(8, 2).Value = ""  'Grava registo
Else: MsgBox"Já existem dados preenchidos para este registo!" Deseja gravar registo com novos dados?") ' E aqui aparecia opção sim e não para utilizador!

Acha possível fazer isto com o atual código?

 
Postado : 20/02/2017 4:47 am
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa tarde Pedro,

Dê uma olhada nas alterações que fiz no código.

att,

 
Postado : 21/02/2017 11:53 am
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Olá Bruno,

Sem dúvida você é craque!
Muito bom o seu conhecimento e trabalho!
Só uma última questão, estou a colocar um ciclo para apenas gravar dados se os campos a passar para BD não se encontrarem vazias "".
Já coloquei ciclo if e aparece Mensagem a dizer que célula B8 está vazia, mas depois de preencher célula B8 o ciclo não continua a comparar se já existem dados na BD, dá para ver esse ciclo no ficheiro em anexo?

Outro tema mais selectivo e que peço sua opinião mais profissional:
Se chegar BD a Ano 2018 com a formula =ANO(HOJE()), ficarei com o exemplo do último registo de 2017 o 2017-299, e o seguinte será 2018-300.. Não há formula simples de passar para 2018-1, ou aconselha a gravar BD anualmente e fazer nova planilha ou livro excel para cada ano??

Um grande abraço!

 
Postado : 21/02/2017 4:20 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa noite Pedro,

Fiz uma alteração no código para aparece o aviso caso os campos estejam vazio.

Fazer uma para cada ano depende do seu trabalho, caso você não use os dados dos anos anteriores acredito que o melhor seria dividir por ano.
De qualquer forma, planilhas especificas para dia,mês ou ano depende de como você trabalha.

 
Postado : 22/02/2017 5:48 pm
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

Olá Bruno,

Obrigado pelas dicas! Irei fazer anualmente!

Contudo, no código estou a ter o mesmo problema que tinha anteriormente.
Ou seja, quando tenho o campo nome e equipamento vazio "", ele mostra mensagem a dizer que tem campos por preencher, e após preencher os mesmos, ele não se encontra a passar os dados introduzidos para a BD.
Por vezes aparece a mensagem se quero substituir as já existentes, caso já existem, mas se não tiver nome e equipamento preenchidos para o registo colocado, ele não se encontra a gravar registo.
Pode pf verificar o que se poderá passar?

Um abraço.

 
Postado : 23/02/2017 3:26 am
(@pedro12345)
Posts: 48
Eminent Member
Topic starter
 

O código para gravar registo na BD com células BD em vazio não está gravando!..
Pode verificar o que se está passando com o código do último ficheiro carregado?

 
Postado : 25/02/2017 8:34 am
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa noite Pedro,

Se as células B8 e B9 estiverem vazias é para gravar informação? Como as células estão vazias, a macro é interrompida e depois que você preenche você deve chamar ela de novo.

Outra coisa, o código foi montado para buscar informações e preencher e não preencher informações preexistentes.

att,

 
Postado : 06/03/2017 9:45 pm