Notifications
Clear all

Atualizar um combobox dinâmico

6 Posts
3 Usuários
0 Reactions
1,533 Visualizações
(@heittor)
Posts: 0
New Member
Topic starter
 

Pessoal, bom dia.

Estou com o seguinte problema: Tenho uma tela onde os combobox são criados dinamicamente de acordo com a quantidade de campos digitadas pelo usuário e salva numa planilha. Até aí tudo bem, pois ele está fazendo certo. O problema é que se o usuário selecionar um valor e depois salvar, o combobox continua pegando o valor antigo. Abaixo segue a parte dos códigos responsável por popular o combobox e salvar na planilha

a) Trecho do código do botão Ok que cria os combobox

' Cria os campos de acordo com a quantidade no campo quantidade
  For i = 2 To vQtde + 1
               
    ' Cria os labels de acordo com o índice
    Set TLabell(i) = fraQuestao.Controls.Add("Forms.Label.1", "lblQuestao" & i)
    
    ' Cria os combobox de acordo com o índice
    Set TCombobox(i) = fraQuestao.Controls.Add("Forms.Combobox.1", "cbxQuestao" & i)
                   
    ' Verificar como limpar o Combobox [VERIFICAR AQUI]
    TCombobox(i).ListIndex = -1
    TCombobox(i).Clear
    TCombobox(i).Value = ""
                   
    ' Propriedades do Label
    ' Fonte
    TLabell(i).Font.Bold = True
    TLabell(i).Font.Size = 12
    
    ' Altura e posição
    TLabell(i).Top = intTopL + 6
    TLabell(i).Left = 6
    TLabell(i).Height = 13
    TLabell(i).Width = 280
    
    ' Preenche o caption de acordo com cada primeira linha da coluna
    TLabell(i).Caption = Worksheets("Dados").Cells(1, i).Value

    ' Propriedades do Combobox
    
    ' Altura e posição
    TCombobox(i).Left = 6
    TCombobox(i).Top = intTopC + 24
    TCombobox(i).Height = 15
    TCombobox(i).Width = 280
    
    ' Inicia pela segunda linha, pois a primeira é para o Label
    linha = 2
    
    ' Realiza o controle de linhas que não estão em branco por coluna
    Do Until Worksheets("Dados").Range(sCell(i) & linha).Value = ""
      TCombobox(i).AddItem Worksheets("Dados").Range(sCell(i) & linha).Value
      linha = linha + 1
    Loop

    ' Atualiza o topo
    intTopL = intTopL + 38
    intTopC = intTopC + 38
    
  Next i

b) Trecho do código onde joga na planilha

' Insere informações para a aba Respostas
  Cells(linhaVazia, 1).Value = tbxNome.Value
  
  vQtde = tbxQtdeQuest.Value
  
  ' Cria os campos de acordo com a quantidade no campo quantidade '
  For i = 2 To vQtde + 1
      Cells(1, i).Value = frmQuestao.Controls("lblQuestao" & i).Caption
      Cells(linhaVazia, i).Value = frmQuestao.Controls("cbxQuestao" & i).Value
  Next
    
  ' Mostra mensagem informando que as informações foram inseridas com sucesso.
  MsgBox ("Inforrmação inserida com sucesso")
  
  ' Volta para a aba MENU
  Sheets("MENU").Select

Por favor, preciso muito de ajuda nisso, pois não sei mais o que pode ser feito. Já coloquei as propriedades Clear, ListIndex no Combobox e mesmo assim não resolveu. :(

 
Postado : 06/02/2015 7:43 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não entendi "O problema é que se o usuário selecionar um valor e depois salvar, o combobox.... "

Após salvar os dados na planilha o que é esperado acontecer?

 
Postado : 06/02/2015 8:41 am
(@heittor)
Posts: 0
New Member
Topic starter
 

Reinaldo, eu me expressei mal.

O problema é o seguinte

Digamos que o combobox tenha os valores x, y e z.

O usuário seleciona o valor x, porém antes de salvar os dados e jogar na planilha ele decide que quer o valor y. Quando o usuário clica em "Salvar" o resultado que consta na planilha ainda é x, sendo que deveria constar o y.

 
Postado : 06/02/2015 9:08 am
(@heittor)
Posts: 0
New Member
Topic starter
 

Alguém poderia me ajudar? :cry:

 
Postado : 09/02/2015 5:41 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Vc só postou um pedaço do código, não enviou o modelo da planilha, e a dúvida ficou confusa.

Além de não ajudar o pessoal a entender o teu problema, não deu os recursos para analisar o código.

Assim, o esperado é que ninguém responda mesmo...

 
Postado : 09/02/2015 5:50 am
(@heittor)
Posts: 0
New Member
Topic starter
 

Desculpe, achei que fosse algo simples.

Bom, segue o código completo do Botão Ok

Private Sub btnOk_Click()
  
  ' Cria a variável de controle do loop
  Dim i, linha As Integer
  
  ' Cria a variável de controle da quantidade
  Dim vQtde As Integer
  
  ' Cria um array de Labels
  Dim TLabell(1 To 99) As Control
  
  ' Controla o topo
  Dim intTopL, intTopC As Integer
     
  ' Cria o frame para questão
  Dim fraQuestao As MSForms.Frame
  
  ' Cria um array de Combobox
  Dim TCombobox(1 To 99) As Control
    
  ' Cria um array para as colunas do Excel [ALTERAR]
  Dim sCell(1 To 50) As String
    
  sCell(1) = "A"
  sCell(2) = "B"
  sCell(3) = "C"
  sCell(4) = "D"
  sCell(5) = "E"
  sCell(6) = "F"
  sCell(7) = "G"
  sCell(8) = "H"
  sCell(9) = "I"
  sCell(10) = "J"
  sCell(11) = "K"
  sCell(12) = "L"
  sCell(13) = "M"
  sCell(14) = "N"
  sCell(15) = "O"
  sCell(16) = "P"
  sCell(17) = "Q"
  sCell(18) = "R"
  sCell(19) = "S"
  sCell(20) = "T"
  sCell(21) = "U"
  sCell(22) = "V"
  sCell(23) = "W"
  sCell(24) = "X"
  sCell(25) = "Y"
  sCell(26) = "Z"
  sCell(27) = "AA"
  sCell(28) = "AB"
  sCell(29) = "AC"
  sCell(30) = "AD"
  sCell(31) = "AE"
  sCell(32) = "AF"
  sCell(33) = "AG"
  sCell(34) = "AH"
  sCell(35) = "AI"
  sCell(36) = "AJ"
  sCell(37) = "AK"
  sCell(38) = "AL"
  sCell(39) = "AM"
  sCell(40) = "AN"
  sCell(41) = "AO"
  sCell(42) = "AP"
  sCell(43) = "AQ"
  sCell(44) = "AR"
  sCell(45) = "AS"
  sCell(46) = "AT"
  sCell(47) = "AU"
  sCell(48) = "AV"
  sCell(49) = "AW"
  sCell(50) = "AY"
    
  ' Verifica se foi digitada uma quantidade no Textbox Quantidade
  If tbxQtdeQuest.Value = "" Then
    MsgBox ("O campo Quantidade de questões é obrigatório!")
    tbxQtdeQuest.SetFocus
    Exit Sub
  End If
  
  ' Cria o frame
  Set fraQuestao = Me.Controls.Add("Forms.Frame.1")
  
  ' Propriedades do frame
  fraQuestao.Top = 138
  fraQuestao.Left = 6
  fraQuestao.Width = 312
  fraQuestao.Caption = "Questões"
                 
  ' Scrollbar
  fraQuestao.ScrollBars = fmScrollBarsVertical
  fraQuestao.ScrollHeight = fraQuestao.InsideHeight * 20
  fraQuestao.ScrollWidth = fraQuestao.InsideWidth * 20
  
  ' Pega o valor digitado no campo Quantidade
  vQtde = tbxQtdeQuest.Value
    
  ' Cria os campos de acordo com a quantidade no campo quantidade
  For i = 3 To vQtde + 2
               
    ' Cria os labels de acordo com o índice
    Set TLabell(i) = fraQuestao.Controls.Add("Forms.Label.1", "lblQuestao" & i)
    
    ' Cria os combobox de acordo com o índice
    Set TCombobox(i) = fraQuestao.Controls.Add("Forms.Combobox.1", "cbxQuestao" & i)
                   
    ' Verificar como limpar o Combobox [VERIFICAR AQUI]
    TCombobox(i).ListIndex = -1
    TCombobox(i).Clear
    TCombobox(i).Value = ""
                        
    ' Propriedades do Label
    ' Fonte
    TLabell(i).Font.Bold = True
    TLabell(i).Font.Size = 12
    
    ' Altura e posição
    TLabell(i).Top = intTopL + 6
    TLabell(i).Left = 6
    TLabell(i).Height = 13
    TLabell(i).Width = 280
    
    ' Preenche o caption de acordo com cada primeira linha da coluna
    TLabell(i).Caption = Worksheets("Dados").Cells(1, i).Value

    ' Propriedades do Combobox
    
    ' Altura e posição
    TCombobox(i).Left = 6
    TCombobox(i).Top = intTopC + 24
    TCombobox(i).Height = 15
    TCombobox(i).Width = 280
    
    ' Inicia pela segunda linha, pois a primeira é para o Label
    linha = 2
    
    ' Realiza o controle de linhas que não estão em branco por coluna
    Do Until Worksheets("Dados").Range(sCell(i) & linha).Value = ""
      TCombobox(i).AddItem Worksheets("Dados").Range(sCell(i) & linha).Value
      linha = linha + 1
    Loop

    ' Atualiza o topo
    intTopL = intTopL + 38
    intTopC = intTopC + 38
    
  Next i
  
End Sub

Segue o código completo do botão Salvar

Private Sub btnSalvar_Click()

  ' Cria a variável linha
  Dim linhaVazia As Long
  
  ' Cria a variável de controle do loop
  Dim i As Integer
  
  ' Verifica o total de Combobox
  Dim vQtde As Integer
  
  ' Controle de linha para ID
  Dim lUltima As Long
  
  ' Confere se o campo Nome foi preenchido
  If tbxNome.Value = "" Then
    MsgBox ("O campo nome é obrigatório")
    tbxNome.SetFocus
    Exit Sub
  End If

  ' Deixa visível o formulário Respostas
  ThisWorkbook.Sheets("Respostas").Visible = xlSheetVisible
  
  ' Seleciona a aba "Respostas"
  Sheets("Respostas").Select
  
  ' Conta quantas informações foram inseridas
  linhaVazia = WorksheetFunction.CountA(Range("A:A")) + 1
  
  If IsNumeric(Sheets("Respostas").Cells(linhaVazia - 1, 1).Value) Then
    lUltima = Sheets("Respostas").Cells(linhaVazia - 1, 1).Value + 1
  Else
    lUltima = 1
  End If
  
  ' Insere a informação para o ID
  Cells(linhaVazia, 1).Value = lUltima
  
  ' Insere informações para a aba Respostas
  Cells(linhaVazia, 2).Value = tbxNome.Value
  
  vQtde = tbxQtdeQuest.Value
  
  ' Cria os campos de acordo com o valor do campo Quantidade
  For i = 3 To vQtde + 2
    ' Adiciona o valor para a primeira coluna (títulos)
    Cells(1, i).Value = frmQuestao.Controls("lblQuestao" & i).Caption
    
    ' Adiciona o valor para as demais colunas (dados)
    Cells(linhaVazia, i).Value = frmQuestao.Controls("cbxQuestao" & i).Value
  Next
    
  ' Mostra mensagem informando que os dados foram inseridos com sucesso.
  MsgBox ("Informação inserida com sucesso")
  
  ' Volta para a aba MENU
  Sheets("MENU").Select
  
  ' Esconde as outras planilhas
  ThisWorkbook.Sheets("Dados").Visible = xlSheetHidden
  ThisWorkbook.Sheets("Respostas").Visible = xlSheetHidden
    
End Sub

Em anexo, segue a planilha que estou fazendo.

A minha dúvida é que não está alterando, em uma segunda vez, os registros na hora de salvar na tela Cadastrar.

Observação: A versão que estou usando é 2013, mas será executado no 2007.

 
Postado : 09/02/2015 6:22 am