none
Abrir formulario no excel VBA com os dados do ultimo preenchimento RRS feed

  • Pergunta

  • Ola pessoal

    É o seguinte pessoal, tentei resolver aqui mas não consegui.

    Tenho um formulario para inserir dados em umas planilhas. esta funcionando bem.

    Mas o problema é o seguinte: Gostaria que toda vez que eu abrir a planilha e ao inicializar o formulario os dados do ultimo preenchimento estivessem no formulario ainda. esses dados ficam em combobox e textbox. Deu pra entender galera?

    não quero que ao fechar o formulario os dados contidos neles se apagem. como faço isso?

    Obs: Nesse formulario tem 9 multipage. Naõ sei se esse detalhe é importante.

    desde já agradeço

    Abraço a todos

    terça-feira, 22 de setembro de 2015 13:19

Respostas

  • Num formulário, crie duas caixas de texto: uma chamada TextBox1 e outra TextBox2 e cole o código abaixo:

    Const PROGRAM_NAME As String = "Controle de Estoque"
    
    Private Sub UserForm_Initialize()
        'Carrega dados do Regedit ao formulário
        TextBox1 = GetSetting(PROGRAM_NAME, Me.Name, TextBox1.Name)
        TextBox2 = GetSetting(PROGRAM_NAME, Me.Name, TextBox2.Name)
    End Sub
    
    Private Sub UserForm_Terminate()
        'Salva dados do formulário no Regedit
        SaveSetting PROGRAM_NAME, Me.Name, TextBox1.Name, TextBox1.Text
        SaveSetting PROGRAM_NAME, Me.Name, TextBox2.Name, TextBox2.Text
    End Sub
    


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

    sexta-feira, 25 de setembro de 2015 20:26
    Moderador
  • Esses dados correspondem a última linha preenchida na sua planilha de dados ?

    Se sim, é só resgatar esses dados e preenche-los no evento initialize do formulário.

    O exemplo abaixo faz isso, considerando que os dados estão na Plan1, começando na célula a1. Observe que são preenchidos os dados nas textbox de 1 a 4, com os valores das colunas da aba Plan1.

    Private Sub UserForm_Initialize()
    
    Dim intLastRow As Integer
    
    Sheets("Plan1").Select
    
    intLastRow = Sheets("Plan1").Range("A1").End(xlDown).Row
    
    UserForm1.TextBox1.Value = Sheets("Plan1").Cells(intLastRow, 1).Value
    UserForm1.TextBox2.Value = Sheets("Plan1").Cells(intLastRow, 2).Value
    UserForm1.TextBox3.Value = Sheets("Plan1").Cells(intLastRow, 3).Value
    UserForm1.TextBox4.Value = Sheets("Plan1").Cells(intLastRow, 4).Value
    
    End Sub

    terça-feira, 22 de setembro de 2015 13:54
  • quando se usa multpage realmente fica dificil se ter os nomes dos objetos

    eu uso uma lista com os nomes e concateno os valores com virgula e salvo tudo em uma unica celula

    Sub DeslocaGrava_Click()
        Ref = Array("revC", "freC", "incrC", "revL", "freL", "incrL", "Lo")
        For r = 0 To Ubound(Ref)
            revCA = ""
            For cs = 1 To 13
                ObRef = Ref(r) & cs
                revCA = revCA & Me.Controls(ObRef)
                If cs < 13 Then revCA = revCA & ","
            Next
            Cells(41 + r, 6).Value2 = revCA
        Next
    End Sub

    e para le os valores

    Sub DeslocaLe_Click()
        Ref = Array("revC", "freC", "incrC", "revL", "freL", "incrL", "Lo")
        For r = 0 To Ubound(Ref)
            Dr = Cells(41 + r, 6).Value2
            revCA = Split(Dr, ",")
            For cs = 1 To 13
                ObRef = Ref(r) & cs
                Dr = revCA(cs - 1)
                If Dr = "Verdadeiro" Then Dr = True:
                If Dr = "Falso" Then Dr = False:
                Me.Controls(ObRef) = Dr
            Next
        Next
    End Sub

    como pode ver eu tenho muitos objetos em sequencia

    esses são os nomes dos objetos que são passados para um array

    Ref = Array("revC", "freC", "incrC", "revL", "freL", "incrL", "Lo")

    como eu tenho 13 de cada um se faz um loop em todos

    For cs = 1 To 13

    e se junta os valores de todos com virgula e no final se salva em uma celula

    tenho outro userform com mais objetos e usei celulas como slots para salvar e le os valores

    outro exemplo

    Sub RealocarGrava_Click() Dim Dr As String, D As String Ref = Array("Fixacopy", "Plan_list", "De_1", "OZig_C", "Oinvq_C", "Oinvert_L", _ "Oquadante_L", "OQuatL", "Oinvq_L", "Oinvert_C", "OZig_L", "Oquadante_C", "OQuatC", "OdpL", "Odpc", _ "Para_2", "Quant", "Dquadante_L", "Dinvq_L", _ "Dquadante_C", "DQuatL", "Ddpc", "DdpL", "Dinvert_L", "DZig_L", "Dinvert_C", "DZig_C", _ "DQuatC", "Dinvq_C", "Alinhar_Baixo", "Latrea", "SetTud") Dr = "" For r = 0 To UBound(Ref) D = Me.Controls(Ref(r)).Value If D = "Verdadeiro" Then D = "V#" If D = "Falso" Then D = "F#" Dr = Dr & D If r < UBound(Ref) Then Dr = Dr & "," Next Cells(49, Me.Grava_Le.Value + 2).Value2 = Dr End Sub

    Eu substitui Verdadeiro e Falso por V# e F# para não ocupar muito espaço

    o resultado na celula fica mais ou menos assim

    F#,Fixa(7),pagamentos,V#,V#,V#,V#,26,V#,F#,V#,F#,,F#,V#,tributos,128,V#,V#,F#,300,F#,V#,F#,V#,F#,F#,,F#,V#,V#,V#

    sábado, 26 de setembro de 2015 22:25

Todas as Respostas

  • Esses dados correspondem a última linha preenchida na sua planilha de dados ?

    Se sim, é só resgatar esses dados e preenche-los no evento initialize do formulário.

    O exemplo abaixo faz isso, considerando que os dados estão na Plan1, começando na célula a1. Observe que são preenchidos os dados nas textbox de 1 a 4, com os valores das colunas da aba Plan1.

    Private Sub UserForm_Initialize()
    
    Dim intLastRow As Integer
    
    Sheets("Plan1").Select
    
    intLastRow = Sheets("Plan1").Range("A1").End(xlDown).Row
    
    UserForm1.TextBox1.Value = Sheets("Plan1").Cells(intLastRow, 1).Value
    UserForm1.TextBox2.Value = Sheets("Plan1").Cells(intLastRow, 2).Value
    UserForm1.TextBox3.Value = Sheets("Plan1").Cells(intLastRow, 3).Value
    UserForm1.TextBox4.Value = Sheets("Plan1").Cells(intLastRow, 4).Value
    
    End Sub

    terça-feira, 22 de setembro de 2015 13:54
  • Outra abordagem possível seria armazenar os valores do formulário em variáveis globais ao clicar no botão salvar.

    http://ambienteoffice.com.br/blog/variaveis-e-constantes/#more-370

    terça-feira, 22 de setembro de 2015 13:56
  • Henrique,

    Sugiro utilizar as instruções GetSetting e SaveSetting do VBA. Elas obtém e salvam registros no Regedit da máquina local, respectivamente.

    Você pode tambémf azer como o André sugeriu, armazenando os valores numa planilha oculta de configuração ou até mesmo num nome definido.


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

    terça-feira, 22 de setembro de 2015 16:13
    Moderador
  • Ola Andre

    Somente hoje pude ver as respostas.

    Esqueci de um detalhe. No meu form tem 1 multipage com 9 page e os dados desse form são de varias planilhas.

    como ficaria então conforme suas dicas?

    Aproveito tambem para tirar outra duvida: nesse formuçario que ja existe quero criar um botão para abrir outro formularaio que contem alguns botões de opção, onde o botão selecionado sera inserido em uma planilha.

    Como programar o botaõ para abrir esse segundo form?

    sexta-feira, 25 de setembro de 2015 20:16
  • Ola felipe

    somente hoje pude ver a resposta.

    Pesquisei aqui sobre essa instruções, mas não sei como usa-las.

    Tem como dar um exemplo?

    sexta-feira, 25 de setembro de 2015 20:18
  • Num formulário, crie duas caixas de texto: uma chamada TextBox1 e outra TextBox2 e cole o código abaixo:

    Const PROGRAM_NAME As String = "Controle de Estoque"
    
    Private Sub UserForm_Initialize()
        'Carrega dados do Regedit ao formulário
        TextBox1 = GetSetting(PROGRAM_NAME, Me.Name, TextBox1.Name)
        TextBox2 = GetSetting(PROGRAM_NAME, Me.Name, TextBox2.Name)
    End Sub
    
    Private Sub UserForm_Terminate()
        'Salva dados do formulário no Regedit
        SaveSetting PROGRAM_NAME, Me.Name, TextBox1.Name, TextBox1.Text
        SaveSetting PROGRAM_NAME, Me.Name, TextBox2.Name, TextBox2.Text
    End Sub
    


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

    sexta-feira, 25 de setembro de 2015 20:26
    Moderador
  • quando se usa multpage realmente fica dificil se ter os nomes dos objetos

    eu uso uma lista com os nomes e concateno os valores com virgula e salvo tudo em uma unica celula

    Sub DeslocaGrava_Click()
        Ref = Array("revC", "freC", "incrC", "revL", "freL", "incrL", "Lo")
        For r = 0 To Ubound(Ref)
            revCA = ""
            For cs = 1 To 13
                ObRef = Ref(r) & cs
                revCA = revCA & Me.Controls(ObRef)
                If cs < 13 Then revCA = revCA & ","
            Next
            Cells(41 + r, 6).Value2 = revCA
        Next
    End Sub

    e para le os valores

    Sub DeslocaLe_Click()
        Ref = Array("revC", "freC", "incrC", "revL", "freL", "incrL", "Lo")
        For r = 0 To Ubound(Ref)
            Dr = Cells(41 + r, 6).Value2
            revCA = Split(Dr, ",")
            For cs = 1 To 13
                ObRef = Ref(r) & cs
                Dr = revCA(cs - 1)
                If Dr = "Verdadeiro" Then Dr = True:
                If Dr = "Falso" Then Dr = False:
                Me.Controls(ObRef) = Dr
            Next
        Next
    End Sub

    como pode ver eu tenho muitos objetos em sequencia

    esses são os nomes dos objetos que são passados para um array

    Ref = Array("revC", "freC", "incrC", "revL", "freL", "incrL", "Lo")

    como eu tenho 13 de cada um se faz um loop em todos

    For cs = 1 To 13

    e se junta os valores de todos com virgula e no final se salva em uma celula

    tenho outro userform com mais objetos e usei celulas como slots para salvar e le os valores

    outro exemplo

    Sub RealocarGrava_Click() Dim Dr As String, D As String Ref = Array("Fixacopy", "Plan_list", "De_1", "OZig_C", "Oinvq_C", "Oinvert_L", _ "Oquadante_L", "OQuatL", "Oinvq_L", "Oinvert_C", "OZig_L", "Oquadante_C", "OQuatC", "OdpL", "Odpc", _ "Para_2", "Quant", "Dquadante_L", "Dinvq_L", _ "Dquadante_C", "DQuatL", "Ddpc", "DdpL", "Dinvert_L", "DZig_L", "Dinvert_C", "DZig_C", _ "DQuatC", "Dinvq_C", "Alinhar_Baixo", "Latrea", "SetTud") Dr = "" For r = 0 To UBound(Ref) D = Me.Controls(Ref(r)).Value If D = "Verdadeiro" Then D = "V#" If D = "Falso" Then D = "F#" Dr = Dr & D If r < UBound(Ref) Then Dr = Dr & "," Next Cells(49, Me.Grava_Le.Value + 2).Value2 = Dr End Sub

    Eu substitui Verdadeiro e Falso por V# e F# para não ocupar muito espaço

    o resultado na celula fica mais ou menos assim

    F#,Fixa(7),pagamentos,V#,V#,V#,V#,26,V#,F#,V#,F#,,F#,V#,tributos,128,V#,V#,F#,300,F#,V#,F#,V#,F#,F#,,F#,V#,V#,V#

    sábado, 26 de setembro de 2015 22:25