Usuário com melhor resposta
Save em tempo real.

Pergunta
-
Bom dia.
No meu projeto VBA Excel, quando clico no botão "Gravar", os dados ficam gravados na folha de cálculo. Porém, se tento aceder-lhe sem sair do formulário, não obtenho a sua visualização e por conseguinte, não tenho hipótese de os manipular.
Nos botões chave, tipo "Alterar Registo" ou "Gravar", tenho a instrução "ThisWorkBook.Save", no entanto não me disponibiliza os dados de imediato. Tenho que sair do formulário e voltar a ativá-lo para poder ter-lhe acesso.
PERGUNTA:
Há forma de colocar os dados gravados na folha, de maneira que fiquem disponíveis para acesso imediato através do formulário, sem ter que sair e voltar a entrar?
Obrigado.
M_A_L
- Editado M_A_S_L sábado, 4 de janeiro de 2014 13:50
Respostas
-
Estou entendendo que os dados mostrados no formulário são carregados apenas no evento Initialize do seu formulário. Então, quando você grava um registro numa planilha, o mesmo não é exibido no formulário porque você não carrega as informações do seu controle novamente.
Experimente utilizar uma filosofia de arquitetura semelhante à mostrada abaixo:
Private Sub UserForm_Initialize() fncCarregarDados End Sub Private Sub btnSalvar_Click() 'Instruções para salvar dados fncCarregarDados End Sub Private Sub fncCarregarDados() Dim lngRow As Long Dim lngLast As Long Dim wks As Excel.Worksheet Me.ListBox1.Clear
Set wks = ThisWorkbook.Worksheets("Plan1") With wks lngLast = .Cells(.Rows.Count, "A").End(xlUp).Row For lngRow = 2 To lngLast Me.ListBox1.AddItem .Cells(lngRow, "A").Value Next lngRow End With End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Editado Felipe Costa GualbertoMVP, Moderator sábado, 4 de janeiro de 2014 15:37 Faltou o método Clear para limpar a caixa de listagem
- Marcado como Resposta M_A_S_L domingo, 5 de janeiro de 2014 22:38
-
Boa noite Felipe.
Criei a Sub:
Private Sub fncCarregaDados() Call SOMA_NAO_REPETIDA Dim lng As Long Dim str As String Dim TotNomes As Integer Set mwksDados = ThisWorkbook.Worksheets("DADOS") Set mclcNomes = New Collection With mwksDados On Error Resume Next For lng = 2 To .Cells(.Rows.Count, "C").End(xlUp).Row str = .Cells(lng, "C").Value mclcNomes.Add str, str TotNomes = mclcNomes.Count Next lng On Error GoTo 0 End With End Sub
No evento inicialize introduzi:
Private Sub UserForm_Initialize() fncCarregaDados End Sub
Nos btn_gravar, btn_inserir e btn_eliminar, que executam ações de alteração de dados da folha tenho colocado no final do código a instrução ThisWorkbookSave e inseri a instrução de chamada da sub fncCarregaDados, mas ... ou deixa de apresentar dados na listbox ou na textbox e não executa corretamente as ações.
o que pode estar errado?
Abraço.
M_A_L
- Marcado como Resposta M_A_S_L domingo, 5 de janeiro de 2014 22:37
-
Você entendeu a lógico corretamente. Não era para isso acontecer.
Nesse caso, peço que poste o código completo para eu analisar.
---
Apenas um breve comentário que não tem a ver com a dúvida original: não abuse do método ThisWorkbook.Save em seu formulário. Por que você não o coloca apenas um vez no evento Terminate do seu formulário?
Private Sub UserForm_Terminate() ThisWorkbook.Save End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Marcado como Resposta M_A_S_L domingo, 5 de janeiro de 2014 22:37
Todas as Respostas
-
Estou entendendo que os dados mostrados no formulário são carregados apenas no evento Initialize do seu formulário. Então, quando você grava um registro numa planilha, o mesmo não é exibido no formulário porque você não carrega as informações do seu controle novamente.
Experimente utilizar uma filosofia de arquitetura semelhante à mostrada abaixo:
Private Sub UserForm_Initialize() fncCarregarDados End Sub Private Sub btnSalvar_Click() 'Instruções para salvar dados fncCarregarDados End Sub Private Sub fncCarregarDados() Dim lngRow As Long Dim lngLast As Long Dim wks As Excel.Worksheet Me.ListBox1.Clear
Set wks = ThisWorkbook.Worksheets("Plan1") With wks lngLast = .Cells(.Rows.Count, "A").End(xlUp).Row For lngRow = 2 To lngLast Me.ListBox1.AddItem .Cells(lngRow, "A").Value Next lngRow End With End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Editado Felipe Costa GualbertoMVP, Moderator sábado, 4 de janeiro de 2014 15:37 Faltou o método Clear para limpar a caixa de listagem
- Marcado como Resposta M_A_S_L domingo, 5 de janeiro de 2014 22:38
-
Boa noite, Felipe.
Os dados são carregados no evento inicialize.
Tenho um botão, que faz despoletar uma rotina que gentilmente me cedeu para o formulário "Histórico" que digitando as letras de busca numa textbox, me vai mostrando na listbox os nomes a procurar. Clicando no nome pretendido na listbox, executo as opções de alterar nome numa inputbox ou eliminar um registo, através dos respetivos botões. O código destes botões, faz limpar a listbox e regressar a pag 1 do multipage. Caso seja necessário fazer nova consulta o nome alterado aparece sem a alteração (embora na folha esteja alterado) e o nome eliminado aparece na caixa de texto (embora já esteja eliminado na folha de cálculo).
A instrução de : ThisWorkbookSave, encontra-se no inicio dos botões de chamada das rotinas e no final das rotinas dos botões que executam ações.
Vou olhar bem a sua sugestão e ver o que consigo.
Obrigado pela resposta.
Cumprimentos
M_A_L
- Editado M_A_S_L domingo, 5 de janeiro de 2014 02:36
-
Boa noite Felipe.
Criei a Sub:
Private Sub fncCarregaDados() Call SOMA_NAO_REPETIDA Dim lng As Long Dim str As String Dim TotNomes As Integer Set mwksDados = ThisWorkbook.Worksheets("DADOS") Set mclcNomes = New Collection With mwksDados On Error Resume Next For lng = 2 To .Cells(.Rows.Count, "C").End(xlUp).Row str = .Cells(lng, "C").Value mclcNomes.Add str, str TotNomes = mclcNomes.Count Next lng On Error GoTo 0 End With End Sub
No evento inicialize introduzi:
Private Sub UserForm_Initialize() fncCarregaDados End Sub
Nos btn_gravar, btn_inserir e btn_eliminar, que executam ações de alteração de dados da folha tenho colocado no final do código a instrução ThisWorkbookSave e inseri a instrução de chamada da sub fncCarregaDados, mas ... ou deixa de apresentar dados na listbox ou na textbox e não executa corretamente as ações.
o que pode estar errado?
Abraço.
M_A_L
- Marcado como Resposta M_A_S_L domingo, 5 de janeiro de 2014 22:37
-
Você entendeu a lógico corretamente. Não era para isso acontecer.
Nesse caso, peço que poste o código completo para eu analisar.
---
Apenas um breve comentário que não tem a ver com a dúvida original: não abuse do método ThisWorkbook.Save em seu formulário. Por que você não o coloca apenas um vez no evento Terminate do seu formulário?
Private Sub UserForm_Terminate() ThisWorkbook.Save End Sub
Felipe Costa Gualberto - http://www.ambienteoffice.com.br
- Marcado como Resposta M_A_S_L domingo, 5 de janeiro de 2014 22:37
-
Bom dia Felipe.
Obrigado pela chamada de atenção. A instrução "ThisWorkbookSave", apenas está colocada nas rotinas dos botões que executam ações, tais como, "gravar", "substituir" e "eliminar", porque pretendia que após a execução da rotina, os dados ficassem disponíveis no Formulário na consulta imediatamente a seguir.
Se colocar a instrução de Save apenas no evento "Terminate", isso corresponde ao mesmo que tenho que fazer agora, sair do Formulário e voltar a entrar. Dessa forma, os dados ficam disponíveis. É o que pretendo evitar. Utilizar os dados, sem sair do Formulário.
Corrija-me se estiver errado.
O código completo é bastante longo. Vou colocar o código dividido em 4 partes pois não são permitidos mais de 60000 carateres. A 2ª parte é o seguimento da 1ª e assim sucessivamente.
Abraço.
M_A_L
- Editado M_A_S_L domingo, 5 de janeiro de 2014 16:03
-
Resolvido.Felipe, muito obrigado pela sua intervenção. A juntar à dica que me deu, pensei que se antes
da instrução "gravar dados", limpar a variável carregada na rotina "FncCarregaDados" e que contem os nomes da folha, depois gravar e por fim, voltar a carregar os dados, poderia resolver. Tentei e bateu certo. Funciona sem ter que sair do formulário. Agora vou ter que bloquear o acesso ao separador 5 do multipage, para que a função FncCarregarDados possa ser ativada, caso contrario não o será.
É correto o raciocínio?
Abraços.
M_A_L
- Editado M_A_S_L domingo, 5 de janeiro de 2014 16:49
-
Amigo, Felipe.
Estava aqui uma grande confusão, pois em cima da textbox8 que supostamente deveria responder a uma determinada rotina, estava colocada a textbox9, que não sei de onde apareceu. Daí que quando pensava que escrevia na 8 estava a escrever na 9 e obviamente a aplicação não respondia.
Está tudo regularizado e a funcionar como um relógio suiço.
Muito obrigado pelos conhecimentos que me transmitiu.
Um grande abraço.
M_A_L
- Editado M_A_S_L domingo, 5 de janeiro de 2014 23:17
-