Usuário com melhor resposta
Trabalhando com um ComboBox e vários CheckBox

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
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
Todas as Respostas
-
-
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
-
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
- Editado Felipe Costa GualbertoMVP, Moderator segunda-feira, 13 de janeiro de 2014 23:26 8 caixas, e não 10
-
-
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
-
-