Notifications
Clear all

UserForm aberto em duas maquinas ao mesmo tempo

3 Posts
3 Usuários
0 Reactions
1,212 Visualizações
(@eliponto)
Posts: 12
Active Member
Topic starter
 

Pessoal, bom dia!

Tenho um UserForm que inclui os dados direto em uma planilha.
Logo quando abro o formulário de cadastro, eu criei uma regra para ele já me dar o ID de lançamento (na imagem abaixo é o 6514).

Até aí tudo bem. O problema é que eu queria que a empresa toda utilizasse o formulário ao mesmo tempo.
Já cheguei a compartilhar a pasta de trabalho, porém, na hora de duas pessoas abrirem o formulário ao mesmo tempo, ele dá o mesmo número de ID para ambos (pois na coluna o último seria o 6513), e ele mantém os dados apenas da última pessoa que utilizou esse ID (ele sobrepõe o da primeira pessoa).

E se eu deixar para apenas uma pessoa abrir por vez fica um pouco inviável, somos em 80.

Qual seria a melhor forma de fazer com que desse certo?
Penso que quando a pessoa abrisse o formulário, a macro já colocaria o número direto na planilha. O problema seria se a pessoa saísse sem salvar, não posso ficar com a linha em branco porque dará problema nos relatórios que eu geraria depois.

Segue parte do código para quem puder me ajudar:

'Sub ao clicar no botão de cadastrar

Private Sub cmdCadastrar_Click()

Sheets("BD").Select

Dim linha As Integer
If Me.cboCodigo = "" Then
    MsgBox "Favor selecionar o código!", vbCritical, _
        "Cadastro inválido!"
    Me.cboCodigo.SetFocus
    Exit Sub
End If
If Me.txtDescricao = "" Then
    MsgBox "Preencha a descrição!", vbCritical, _
        "Cadastro inválido!"
    Me.txtDescricao.SetFocus
    Exit Sub
End If
If Me.txtData = "" Then
    MsgBox "Preencha a data!", vbCritical, _
        "Cadastro inválido!"
    Me.txtData.SetFocus
    Exit Sub
End If
If Me.cboColaborador = "" Then
    MsgBox "Selecione o colaborador correto!", vbCritical, _
        "Cadastro inválido!"
    Me.cboColaborador.SetFocus
    Exit Sub
End If
If Me.optSim = False And Me.optNao = False Then
        MsgBox "Por favor, informe se a cópia deverá ser cobrada", vbCritical, _
            "Cadastro inválido!"
        Exit Sub
End If
If Not IsNumeric(Me.txtQuantidade) = True Then
    MsgBox "Na quantidade informe um número válido!", _
        vbCritical, "Cadastro inválido!"
    Me.txtQuantidade.SetFocus
    Exit Sub
End If

linha = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(linha, 1) = Format(CInt(linha - 1), Number)
Cells(linha, 2) = Format(Me.cboCodigo, Number)
Cells(linha, 3) = Me.txtDescricao
Cells(linha, 4) = Format(Me.txtQuantidade, Number)
Cells(linha, 5) = Me.lblColab
Cells(linha, 6) = Me.txtData

If Me.optSim = True Then
    Cells(linha, 7) = "sim"
Else
    Cells(linha, 7) = "nao"
End If

Cells(linha, 8) = Format(Now(), "DD/MM/YY HH:MM")
Cells(linha, 9) = Me.cboColaborador
Cells(linha, 10) = UsuarioRede

Columns.AutoFit
MsgBox "Cópia(s) inclusa(s)!", vbInformation, _
            "LANÇADOR DE CÓPIAS ZANGARI V. 1.0"
'Me.txtDescricao = "" DESATIVADO PARA MANTER A ÚLTIMA DESCRIÇÃO
Me.txtQuantidade = ""
Me.cboCodigo = ""
Me.cboCodigo.SetFocus
Me.lblId = Me.lblId + 1

ActiveWorkbook.Save

End Sub

Private Sub cmdSair_Click()
Sheets("HOME").Select
    ActiveWorkbook.Save
    Unload Me
End Sub

Private Sub UserForm_INITIALIZE()

Sheets("BD").Select

    Dim linha As Integer, ultimoId As Integer
    linha = Cells(Rows.Count, 1).End(xlUp).Row
    If linha = 1 Then
        ultimoId = 0
    Else
        ultimoId = Cells(linha, 1)
    End If
    Me.lblId.Caption = ultimoId + 1

Me.txtData = Format(Now(), "DD/MM/YYYY")

lin = 2
Do Until Sheets("Condos").Cells(lin, 1) = ""
cboCodigo.AddItem Sheets("Condos").Cells(lin, 1)
lin = lin + 1
Loop

lin = 2
Do Until Sheets("Colaboradores").Cells(lin, 1) = ""
cboColaborador.AddItem Sheets("Colaboradores").Cells(lin, 1)
lin = lin + 1
Loop

'Me.cboCodigo.RowSource = "Condos!a2:a" & Cells(Rows.Count, 1).End(xlUp).Row

lblCondo = ""
lblColab = ""

'HideTitleBar = Esconder a barra de título
  HideTitleBar Me
    With Me
.StartUpPosition = 0
.Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width)
.Top = Application.Top + (0.5 * Application.Height) - (0.5 * .Height)
End With

End Sub

Obrigado!

 
Postado : 01/11/2016 7:02 am
Trindade
(@trindade)
Posts: 278
Reputable Member
 

Bom dia, eliponto.

Os tópicos que encontrei na internet sobre compartilhar aplicações que contem VBA nenhum obteve o resultado esperado, convenhamos essa funcionalidade de Compartilhar Pasta de Trabalho serve para ferrar com aplicação mesmo sem VBA, mas ...

Uma ideia seria você gravar o ID de lançamento ao abrir seu UserForm em sua base de dados.
Criar uma regra no evento Terminate do UserForm que antes de fechar verificasse se todos os campos e/ou definir quais campos poderão ficar vazios para excluir esse registro que não foi utilizado por aquela sessão aberta.

Creio que a galera do forum tenha soluções melhores.

Se a resposta foi útil! Clique na mãozinha ao lado do botão Citar.
Sua dúvida foi respondida? Marque como RESOLVIDO em seus tópicos, usando o botão com marca verde.

 
Postado : 01/11/2016 7:21 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!!

Eu não acho o excel muito bom para isso....

Não sei como está toda estrutura de seu projeto, mas vai depender de alguns detalhas, já usou o metodo ActiveWorkbook.AcceptAllChanges?
https://msdn.microsoft.com/pt-br/librar ... 35613.aspx

Use um Front e Back end, Arquivos (Userform) e Arquivos(Base de dados)
Ou crie multiplas instâncias de um Userform.

Dim newInstanceOfMe As Object 
 
Set newInstanceOfMe = UserForms.Add(Me.Name) 
 
newInstanceOfMe.Show 
 
Unload newInstanceOfMe 
Set newInstanceOfMe = Nothing 

Em fim, é complicado, eu espero que alguém possa ajuda-lo.

Att

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 01/11/2016 7:35 am