Para resolver o seu problema usando VBA no Excel, você pode criar um sistema que armazena os dados de frequência em uma planilha separada e utiliza macros para preencher automaticamente a planilha de calendário com as informações corretas ao mudar de setor, ano ou mês. Abaixo está um esboço de como você poderia estruturar isso:
Setor
, Ano
, Mês
, Funcionário
, Dia
, Período
, Código
.Cada linha corresponderá a uma entrada única de frequência para cada funcionário, dia e período.
Usando VBA:
Salvar Dados: Crie uma macro que, ao mudar o setor, ano ou mês, salva todas as informações atuais do calendário na planilha "Data".
Carregar Dados: Crie uma macro que, ao mudar o setor, ano ou mês, carrega as informações da planilha "Data" de volta para o seu calendário.
Exemplo de Código VBA:
Sub SaveData()
Dim wsData As Worksheet
Dim wsCalendar As Worksheet
Dim lastRow As Long
Dim setor As String
Dim ano As Long
Dim mes As Long
Dim nomeFuncionario As String
Dim dia As Integer
Dim periodo As String
Dim codigo As String
' Defina as suas planilhas
Set wsData = ThisWorkbook.Sheets("Data")
Set wsCalendar = ThisWorkbook.Sheets("Calendar") ' Mude para o nome real da sua planilha
' Limpa os dados antigos para o setor, ano e mês selecionados
setor = wsCalendar.Range("Setor").Value
ano = wsCalendar.Range("Ano").Value
mes = wsCalendar.Range("Mes").Value
With wsData
.Rows("2:" & .Rows.Count).ClearContents
End With
lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row + 1
' Loop através do calendário para salvar os dados
' Ajuste esses números para corresponder às suas configurações de planilha
For dia = 1 To 31
For Each cell In wsCalendar.Range("A1:A10") ' Ajuste o range
nomeFuncionario = cell.Offset(0, 0).Value
periodo = cell.Offset(0, 1).Value
codigo = cell.Offset(0, 2).Value
' Salva apenas se houver um código válido
If codigo <> "" Then
With wsData
.Cells(lastRow, 1).Value = setor
.Cells(lastRow, 2).Value = ano
.Cells(lastRow, 3).Value = mes
.Cells(lastRow, 4).Value = nomeFuncionario
.Cells(lastRow, 5).Value = dia
.Cells(lastRow, 6).Value = periodo
.Cells(lastRow, 7).Value = codigo
lastRow = lastRow + 1
End With
End If
Next cell
Next dia
End Sub
Sub LoadData()
Dim wsData As Worksheet
Dim wsCalendar As Worksheet
Dim setor As String
Dim ano As Long
Dim mes As Long
Dim row As Long
Dim lastRow As Long
' Defina as suas planilhas
Set wsData = ThisWorkbook.Sheets("Data")
Set wsCalendar = ThisWorkbook.Sheets("Calendar") ' Mude para o nome real da sua planilha
setor = wsCalendar.Range("Setor").Value
ano = wsCalendar.Range("Ano").Value
mes = wsCalendar.Range("Mes").Value
' Limpa o calendário atual
wsCalendar.Range("CalendarRange").ClearContents ' Mude para o intervalo real
lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
' Loop através dos dados armazenados para carregar as informações
For row = 2 To lastRow
With wsData
If .Cells(row, 1).Value = setor And _
.Cells(row, 2).Value = ano And _
.Cells(row, 3).Value = mes Then
' Carregue as informações de volta para a planilha de calendário
' Ajuste de acordo com a estrutura da sua planilha
End If
End With
Next row
End Sub
Essas macros podem ser chamadas automaticamente ao mudar de setor, ano ou mês usando eventos como Worksheet_Change
ou botões dedicados.
Notas Adicionais:
Com esses passos, suas informações de frequência devem ser armazenadas e recuperadas conforme necessário, mantendo a integridade dos dados ao mudar de setor, ano ou mês.
Washington,
Nesse caso é melhor você solicitar uma aula.