none
Save em tempo real. RRS feed

  • 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
    sábado, 4 de janeiro de 2014 13:48

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


    sábado, 4 de janeiro de 2014 15:36
    Moderador
  • 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
    domingo, 5 de janeiro de 2014 02:45
  • 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
    domingo, 5 de janeiro de 2014 12:33
    Moderador

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


    sábado, 4 de janeiro de 2014 15:36
    Moderador
  • 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
    domingo, 5 de janeiro de 2014 01:35
  • 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
    domingo, 5 de janeiro de 2014 02:45
  • 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
    domingo, 5 de janeiro de 2014 12:33
    Moderador
  • 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
    domingo, 5 de janeiro de 2014 15:46

  • 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
    domingo, 5 de janeiro de 2014 15:55
  • 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
    domingo, 5 de janeiro de 2014 22:37
  • Tudo bem, que bom que resolveu seu problema.

    Felipe Costa Gualberto - http://www.ambienteoffice.com.br

    segunda-feira, 6 de janeiro de 2014 21:43
    Moderador