Prezados, boa tarde.
Estou com um formulário para cadastro de produções diárias feito pelo VBA. Ele é preenchido diariamente por 12 pessoas, às vezes simultaneamente. Entretanto, acontece de às vezes um cadastro sobrepor o outro. Exemplo, as 12 pessoas cadastram a produção, mas ficam registradas apenas 9. Poderiam me auxiliar?
OBS.: a planilha é bloqueada para edição, eles podem apenas cadastrar a produção, clicando no botão que criei pela guia Desenvolvedor (controle ActiveX).
Aqui está o código:
Private Sub CBSalvar_Click()
On Error GoTo Erro
If TData = "" Or THora = "" Or TNome = "" Or TAtividade = "" Or TRecebido = "" Or TProdução = "" Or TPendência = "" Or TMotivo = "" Then
MsgBox "Precisa preencher todos os campos", vbCritical, "ERRO"
Exit Sub
End If
Dim Data As Date
Data = TData.Value
Dim Linha As Double
Linha = 1
With Planilha2
Do
Linha = Linha + 1
Loop Until .Cells(Linha, 2).Value = ""
.Cells(Linha, 2).Value = TData
.Cells(Linha, 3).Value = THora
.Cells(Linha, 4).Value = TNome.Text
.Cells(Linha, 5).Value = TAtividade.Text
.Cells(Linha, 6).Value = TRecebido.Text
.Cells(Linha, 7).Value = TProdução.Text
.Cells(Linha, 8).Value = TPendência.Text
.Cells(Linha, 9).Value = TMotivo.Text
.Cells(Linha, 10).Value = TPrazo.Text
Call Limpar
End With
MsgBox "Produção Salva com sucesso", vbInformation, "SALVAR"
Exit Sub
Erro:
MsgBox "Erro!", vbCritical, "ERRO!"
End Sub
Private Sub UserForm_Initialize()
TData = VBA.Date
THora = VBA.Time
End Sub
Sub Limpar()
TData = ""
TNome = ""
TAtividade = ""
TRecebido = ""
TProdução = ""
TPendência = ""
TMotivo = ""
End Sub
Parece que o problema que você está enfrentando é que às vezes os registros de produção estão sendo sobrescritos por outros registros quando várias pessoas estão cadastrando simultaneamente. Esse problema ocorre porque o código não está lidando adequadamente com a busca da próxima linha vazia para inserir os dados.
Uma solução para evitar que os registros sejam sobrepostos é utilizar uma variável para armazenar o próximo número de linha disponível na planilha. Dessa forma, cada pessoa que preencher o formulário irá encontrar uma linha vazia e evitará a sobreposição.
Tente fazer assim:
Private Sub CBSalvar_Click()
On Error GoTo Erro
If TData = "" Or THora = "" Or TNome = "" Or TAtividade = "" Or TRecebido = "" Or TProdução = "" Or TPendência = "" Or TMotivo = "" Then
MsgBox "Precisa preencher todos os campos", vbCritical, "ERRO"
Exit Sub
End If
Dim Data As Date
Data = TData.Value
Dim Linha As Double
Dim Planilha As Worksheet
Set Planilha = ThisWorkbook.Worksheets("Planilha2") ' Substitua "Planilha2" pelo nome correto da planilha
Linha = Planilha.Cells(Planilha.Rows.Count, 2).End(xlUp).Row + 1
With Planilha
.Cells(Linha, 2).Value = TData
.Cells(Linha, 3).Value = THora
.Cells(Linha, 4).Value = TNome.Text
.Cells(Linha, 5).Value = TAtividade.Text
.Cells(Linha, 6).Value = TRecebido.Text
.Cells(Linha, 7).Value = TProdução.Text
.Cells(Linha, 8).Value = TPendência.Text
.Cells(Linha, 9).Value = TMotivo.Text
.Cells(Linha, 10).Value = TPrazo.Text
End With
Call Limpar
MsgBox "Produção Salva com sucesso", vbInformation, "SALVAR"
Exit Sub
Erro:
MsgBox "Erro!", vbCritical, "ERRO!"
End Sub
prezado aluno...acredito essa dúvida ser referente à programação....abraços