none
Trabalhando com um ComboBox e vários CheckBox RRS feed

  • Pergunta

  • Para auxiliar o preenchimento de uma tabela no excel pretende utilizar um um formulário. Essa tabela se destina a marcar com a letra "f" o dia em que o funcionário faltou. No formulário tenho um combobox, o qual lista os dias do mês, e vários checkbox referindo-se aos nomes dos funcionários. O objetivo do formulário é marcar no checkbox correspondente a determinado funcionário, se ele faltou ou não no dia marcado no combobox. (True = Faltou, letra "f" na planilha) (False = Não faltou, fica em branco na planilha). Tenho uma imagem para ajudar na explicação.


    • Editado Risomar quinta-feira, 9 de janeiro de 2014 17:21 Faltou a iamgem
    quinta-feira, 9 de janeiro de 2014 17:20

Respostas

  • Para usar o código a seguir, crie um formulário com 8 caixas de seleção (CheckBox1 a CheckBox8), uma caixa de combinação chamada ComboBox1 e uma barra de rolagem chamada ScrollBar1.
    Altere os valores das constantes, se desejar. Tentei manter fiel à estrutura do seu problema.

    Option Explicit
    
    'Número de caixas de seleção do formulário:
    Const mclngCheckboxes As Long = 8
    
    Const mcstrWorksheet As String = "Plan1"
    
    Const mclngColDatas As Long = 3
    Const mclngRowDatas As Long = 1
    
    Const mclngColNomes As Long = 2
    Const mclngRowNomes As Long = 2
    
    Const cstrFalta As String = "f"
    
    Dim mobjWorksheet As Excel.Worksheet
    
    Private Sub UserForm_Initialize()
      Dim lngLast As Long
      Dim var As Variant
      
      Set mobjWorksheet = ThisWorkbook.Worksheets(mcstrWorksheet)
      With mobjWorksheet
        'Configurar barra de rolagem:
        Me.ScrollBar1.Min = mclngRowNomes
        Me.ScrollBar1.Max = .Cells(.Rows.Count, mclngColNomes).End(xlUp).Row - mclngCheckboxes + 1
        Me.ScrollBar1.LargeChange = mclngCheckboxes
        
        Me.ComboBox1.Style = fmStyleDropDownList
        lngLast = .Cells(mclngRowDatas, .Columns.Count).End(xlToLeft).Column
        var = .Cells(mclngRowDatas, mclngColDatas).Resize(, lngLast - mclngColDatas + 1).Value
        var = WorksheetFunction.Transpose(var)
        Me.ComboBox1.List = var
      End With
    
      Me.ComboBox1.ListIndex = 0
    End Sub
    
    Private Sub fncUpdateCheckBoxes()
      Dim lng As Long
      Dim lngRow As Long
      Dim lngCol As Long
      Dim cbo As MSForms.CheckBox
      
      With mobjWorksheet
        For lng = 1 To mclngCheckboxes
          Set cbo = Me.Controls("CheckBox" & lng)
          lngRow = Me.ScrollBar1.Value + lng - 1
          cbo.Caption = .Cells(lngRow, mclngColNomes).Value
          cbo.Tag = lngRow
          If .Cells(lngRow, fncGetCol).Value = cstrFalta Then
            cbo.Value = True
          Else
            cbo.Value = False
          End If
        Next lng
      End With
    End Sub
    
    Private Sub fncUpdateWorksheet(ckb As MSForms.CheckBox)
      Dim lngRow As Long
      Dim strValue As String
      
      lngRow = ckb.Tag
      If ckb.Value = True Then strValue = cstrFalta
      mobjWorksheet.Cells(lngRow, fncGetCol).Value = strValue
    End Sub
    
    Private Function fncGetCol() As Long
      fncGetCol = Me.ComboBox1.ListIndex + mclngColDatas
    End Function
    
    
    'Eventos que disparam a atualização de caixas de seleção:
    Private Sub ComboBox1_Change(): fncUpdateCheckBoxes: End Sub
    Private Sub ScrollBar1_Change(): fncUpdateCheckBoxes: End Sub
    
    'Eventos que disparam a atualização de dados na planilha:
    Private Sub CheckBox1_Click(): fncUpdateWorksheet Me.CheckBox1: End Sub
    Private Sub CheckBox2_Click(): fncUpdateWorksheet Me.CheckBox2: End Sub
    Private Sub CheckBox3_Click(): fncUpdateWorksheet Me.CheckBox3: End Sub
    Private Sub CheckBox4_Click(): fncUpdateWorksheet Me.CheckBox4: End Sub
    Private Sub CheckBox5_Click(): fncUpdateWorksheet Me.CheckBox5: End Sub
    Private Sub CheckBox6_Click(): fncUpdateWorksheet Me.CheckBox6: End Sub
    Private Sub CheckBox7_Click(): fncUpdateWorksheet Me.CheckBox7: End Sub
    Private Sub CheckBox8_Click(): fncUpdateWorksheet Me.CheckBox8: End Sub


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

    • Marcado como Resposta Risomar terça-feira, 14 de janeiro de 2014 00:43
    segunda-feira, 13 de janeiro de 2014 22:22
    Moderador

Todas as Respostas

  • Antes de eu sugerir um código, gostaria de entender sua pretensão. Você vai criar várias caixas de seleção (CheckBox) no formulário? O formulário ficará muito grande, não?

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

    quinta-feira, 9 de janeiro de 2014 21:54
    Moderador
  • De certa maneira, sim, vai ficar um pouco grande. São 30 checkbox's. Mas infelizmente se faz necessário pois, se torna mais ágil a ação de identificar o funcionário e de forma imediata informar a sua "falta" no dia selecionado no combobox. Lembrando que todos eles (funcionários) se encontraram dispostos em ordem alfabética e espero que poucos (ou nenhum) faltem no dia em que for apurado sua presença/ausência. No entanto, se vc tiver uma idéia melhor, fico agradecido, em verificar essa nova possibilidade para inserção das informações desejadas.

    Risomar Madureira

    risomarmb@hotmail.com

    sexta-feira, 10 de janeiro de 2014 10:13
  • Risomar,

    Eu fiz um código de exemplo que possui 8 caixas de seleção e uma barra de rolagem, mas está em outro computador. Na segunda-feira à noite eu posto aqui.


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


    sábado, 11 de janeiro de 2014 15:20
    Moderador
  • Tudo bem. Aguardo e muito obrigado. Precisando de alguma coisa é só falar.
    sábado, 11 de janeiro de 2014 22:20
  • Para usar o código a seguir, crie um formulário com 8 caixas de seleção (CheckBox1 a CheckBox8), uma caixa de combinação chamada ComboBox1 e uma barra de rolagem chamada ScrollBar1.
    Altere os valores das constantes, se desejar. Tentei manter fiel à estrutura do seu problema.

    Option Explicit
    
    'Número de caixas de seleção do formulário:
    Const mclngCheckboxes As Long = 8
    
    Const mcstrWorksheet As String = "Plan1"
    
    Const mclngColDatas As Long = 3
    Const mclngRowDatas As Long = 1
    
    Const mclngColNomes As Long = 2
    Const mclngRowNomes As Long = 2
    
    Const cstrFalta As String = "f"
    
    Dim mobjWorksheet As Excel.Worksheet
    
    Private Sub UserForm_Initialize()
      Dim lngLast As Long
      Dim var As Variant
      
      Set mobjWorksheet = ThisWorkbook.Worksheets(mcstrWorksheet)
      With mobjWorksheet
        'Configurar barra de rolagem:
        Me.ScrollBar1.Min = mclngRowNomes
        Me.ScrollBar1.Max = .Cells(.Rows.Count, mclngColNomes).End(xlUp).Row - mclngCheckboxes + 1
        Me.ScrollBar1.LargeChange = mclngCheckboxes
        
        Me.ComboBox1.Style = fmStyleDropDownList
        lngLast = .Cells(mclngRowDatas, .Columns.Count).End(xlToLeft).Column
        var = .Cells(mclngRowDatas, mclngColDatas).Resize(, lngLast - mclngColDatas + 1).Value
        var = WorksheetFunction.Transpose(var)
        Me.ComboBox1.List = var
      End With
    
      Me.ComboBox1.ListIndex = 0
    End Sub
    
    Private Sub fncUpdateCheckBoxes()
      Dim lng As Long
      Dim lngRow As Long
      Dim lngCol As Long
      Dim cbo As MSForms.CheckBox
      
      With mobjWorksheet
        For lng = 1 To mclngCheckboxes
          Set cbo = Me.Controls("CheckBox" & lng)
          lngRow = Me.ScrollBar1.Value + lng - 1
          cbo.Caption = .Cells(lngRow, mclngColNomes).Value
          cbo.Tag = lngRow
          If .Cells(lngRow, fncGetCol).Value = cstrFalta Then
            cbo.Value = True
          Else
            cbo.Value = False
          End If
        Next lng
      End With
    End Sub
    
    Private Sub fncUpdateWorksheet(ckb As MSForms.CheckBox)
      Dim lngRow As Long
      Dim strValue As String
      
      lngRow = ckb.Tag
      If ckb.Value = True Then strValue = cstrFalta
      mobjWorksheet.Cells(lngRow, fncGetCol).Value = strValue
    End Sub
    
    Private Function fncGetCol() As Long
      fncGetCol = Me.ComboBox1.ListIndex + mclngColDatas
    End Function
    
    
    'Eventos que disparam a atualização de caixas de seleção:
    Private Sub ComboBox1_Change(): fncUpdateCheckBoxes: End Sub
    Private Sub ScrollBar1_Change(): fncUpdateCheckBoxes: End Sub
    
    'Eventos que disparam a atualização de dados na planilha:
    Private Sub CheckBox1_Click(): fncUpdateWorksheet Me.CheckBox1: End Sub
    Private Sub CheckBox2_Click(): fncUpdateWorksheet Me.CheckBox2: End Sub
    Private Sub CheckBox3_Click(): fncUpdateWorksheet Me.CheckBox3: End Sub
    Private Sub CheckBox4_Click(): fncUpdateWorksheet Me.CheckBox4: End Sub
    Private Sub CheckBox5_Click(): fncUpdateWorksheet Me.CheckBox5: End Sub
    Private Sub CheckBox6_Click(): fncUpdateWorksheet Me.CheckBox6: End Sub
    Private Sub CheckBox7_Click(): fncUpdateWorksheet Me.CheckBox7: End Sub
    Private Sub CheckBox8_Click(): fncUpdateWorksheet Me.CheckBox8: End Sub


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

    • Marcado como Resposta Risomar terça-feira, 14 de janeiro de 2014 00:43
    segunda-feira, 13 de janeiro de 2014 22:22
    Moderador
  • Irei experimentar o código aqui no projeto. Mais tarde posto o resultado.

    Aguarde!

    Boa Noite!

    segunda-feira, 13 de janeiro de 2014 22:50
  • Valeu, amigo...

    Era exatamente o que eu queria.

    Muito Obrigado!

    terça-feira, 14 de janeiro de 2014 00:44