VBA - Artigo 030 - Usando formulários com classe – parte 2: formulário


Usando formulários com classe – parte 2: formulário

No artigo anterior vimos a primeira parte do projeto de criar um formulário com uma classe. Deixamos a classe "praticamente" pronta, fazendo as funcionalidades planejadas (entre aspas, veremos o motivo mais adiante). Neste artigo iremos fazer o formulário e usar a classe criada para escrever na planilha. Desenhei o seguinte formulário:


Vemos aqui todas as propriedades do funcionário que temos na planilha: Registro, Nome do funcionário, Data de nascimento, CPF, Cargo e Salário. Temos cinco botões: Cadastrar, Alterar, Desligar, Sair e Pesquisar nome, que é o botão pequeno ao lado do campo Nome do funcionário. Há um botão Recontratar oculto embaixo do Desligar. Temos ainda duas caixas de listagem: Nome do funcionário e Cargo. Aqui tem o formulário para baixar, caso não queira desenhar um novo. Há dois arquivos dentro, um .frm e um .frx. Importe o .frm pelo editor de VBA, o .frx deve estar na mesma pasta, senão acontece um erro e não importa.

De cara vemos duas alterações de escopo: a classe não tem uma função de pesquisar funcionários pelo nome e nem uma de geração de lista com os nomes dos funcionários. Devemos fazer uma rotina no formulário para fazer a pesquisa? Negativo, lembre-se da imagem de como deve ser feito:



O formulário deve se comunicar exclusivamente com a classe, que por sua vez irá fazer a comunicação com a planilha. Desta forma, sabemos que precisaremos criar mais duas funções na classe: uma para efetuar a pesquisa pelo nome, retornando verdadeiro quando encontrado (e os dados para a classe) e falso quando não encontrado, outra para gerar uma lista com os nomes dos funcionários para popular a caixa de listagem de funcionários.

Vemos também que precisaremos de gerar a lista de cargos. Em primeiro lugar, vamos criar uma planilha chamada Listas com o nome de código PlListas e colocar os dados de uma lista hipotética de cargos:


Vamos fazer uma rotina para carregar esses dados no formulário? Sem chances, vamos usar classe, que é o foco deste projeto. Vamos criar funções na classe clsFuncionario para isso? De jeito nenhum, a classe clsFuncionario serve apenas para tratar de dados relacionados a um funcionário, não deve ser usada para outras finalidades. Devemos criar uma nova classe para lidar com listas e chamaremos de clsCargo. Como essas listas serão de uma complexidade maior, vamos deixá-las por último.

Primeiramente, vamos definir alguns requisitos para este formulário:

1) O bloco com a mensagem será removido quando não houver mensagem (o formulário será mais curto). Quando houver mensagem, o formulário será estendido para exibir a mensagem. Quando for uma mensagem simples (como "Funcionário cadastrado"), o texto deverá ser preto, quando for um alerta (como uma inconsistência na entrada), o texto deverá ser vermelho;

2) Os botões Alterar e Desligar só estarão ativos quando um funcionário existente for carregado via pesquisa, desativando o botão Cadastrar nesta situação;

3) Após o cadastro ou a alteração de um funcionário o formulário deve ser limpo;

4) Os campos Registro, Data de nascimento, CPF e Salário só devem permitir a entrada de números, bloqueando a digitação de quaisquer outros caracteres;

5) O botão Recontratar deve aparecer somente quando um funcionário já desligado for carregado no formulário, sendo que neste caso o botão Desligar deve ficar invisível;

6) As caixas de listagem permitirão tanto a seleção de item da lista como a escrita para poder adicionar.

Vamos começar pela mensagem de texto na parte debaixo do formulário. O meu tem altura de 180 com a mensagem e ficará com 155 sem a mensagem. Podemos definir esses valores como constantes no topo do módulo do formulário, permitindo que esses números fiquem em apenas um lugar no código, facilitando futuras manutenções:

Option Explicit
Private Const FormularioNormal      As Integer = 155
Private Const FormularioEstendido   As Integer = 180

Agora vamos pensar na sub-rotina. Como vamos definir os parâmetros? Sabemos que terá uma mensagem e que ela pode ser comum ou de alerta. Vamos definir um como Mensagem no formato string e o outro como Alerta, com um valor booleano, sendo alerta como verdadeiro e mensagem comum como falso. Podemos inclusive definir este parâmetro como opcional, deixando falso como padrão. Se a mensagem vier em branco, significa que a mensagem deve ser apagada e o formulário reduzido, caso contrário a mensagem deve aparecer e o formulário deve ser estendido. Compreendido o funcionamento, segue o código:

Private Sub Mensagem(Mensagem As String, Optional Alerta As Boolean = False)
    If Mensagem = "" Then
        Me.lblMensagem = ""
        Me.Height = FormularioNormal
    Else
        Me.lblMensagem = Mensagem
        Me.Height = FormularioEstendido
    End If
    If Alerta = True Then
        Me.lblMensagem.ForeColor = vbRed
    Else
        Me.lblMensagem.ForeColor = vbBlack
    End If
End Sub

O uso do Me aqui serve para referenciar o próprio formulário, garantindo que os nomes das propriedades sejam dele próprio. Isto é útil quando você possui vários formulários e de repente confunde um nome e coloca um objeto de outro formulário. Não vai acusar erro e vai levar algum tempo para descobrir onde está o problema. Poderia usar frmFuncionarios, mas Me é bem mais curto.

Para saber se essa sub-rotina está funcionando perfeitamente, vamos editar o evento UserForm_Initialize e colocar uma das seguintes linhas de cada vez, para testar cada uma das situações:

Mensagem ""
Mensagem "Teste de mensagem"
Mensagem "Teste de alerta", True

A primeira deve abrir o formulário sem a área da mensagem, a segunda deve trazer uma mensagem em preto e a terceira uma mensagem em vermelho. Como pode ver, algo que parecia um problema complexo foi resolvido com uma rotina simples com dois parâmetros e dois IFs. Habitue-se a pensar em parâmetros quando estiver desenvolvendo suas rotinas e funções, eles facilitam o código e evitam ter de criar variáveis de módulo ou mesmo globais.

Vamos ao segundo requisito. Os botões Alterar e Desligar só estarão disponíveis quando algum funcionário for carregado via pesquisa e o botão Recontratar deve permanecer invisível (só aparecerá quando for carregado um funcionário desligado). Como ainda não desenvolvemos o código da pesquisa, o máximo que podemos fazer por enquanto é desabilitá-los na inicialização. Vamos editar o evento UserForm_Initialize, definindo o valor padrão da altura do formulário como FormularioNormal e o status inicial de cada botão. Podemos aproveitar e definir o evento do botão Sair, que é bem simples:

Private Sub UserForm_Initialize()
    Me.Height = FormularioNormal
    Me.btnCadastrar.Enabled = True
    Me.btnAlterar.Enabled = False
    Me.btnDesligar.Enabled = False
    Me.btnRecontratar.Visible = False
End Sub
Private Sub btnSair_Click()
    Unload Me
End Sub

Seguindo adiante, temos um botão para Limpar o formulário. Como também precisamos limpar após o cadastro ou a alteração de um funcionário, talvez seja mais fácil nesses casos emular o clique nesse botão. Mas tem um porém: o botão Limpar também removerá a mensagem, chamando a sub-rotina mensagem com texto em branco. Como os botões Adicionar, Alterar, Desligar e Recontratar deverão exibir mensagens de confirmação, então é melhor evitar executar a sub-rotina Mensagem duas vezes. Assim, é melhor separar parte da limpeza em uma nova sub-rotina e fazer todos os botões chamarem essa rotina, para depois chamar Mensagem da forma apropriada para cada caso.

Essa limpeza também deve deixar os botões nas mesmas condições do início do formulário, ou seja, garantir que o botão Cadastrar esteja habilitado e os botões Alterar e Desligar estejam desabilitados. Não podemos esquecer de manter o botão Desligar visível e o botão Recontratar invisível, já prevendo esta situação acontecer. Também podemos definir que o cursor vá para o campo Registro. Vamos ao código desse botão:

Private Sub LimparFormulario()
    Me.txtRegistro.Text = ""
    Me.cmbNome.Text = ""
    Me.txtDataNascimento.Text = ""
    Me.txtCPF.Text = ""
    Me.cmbCargo.Text = ""
    Me.txtSalario.Text = ""
    Me.btnCadastrar.Enabled = True
    Me.btnAlterar.Enabled = False
    Me.btnDesligar.Enabled = False
    Me.btnDesligar.Visible = True
    Me.btnRecontratar.Visible = False
    Me.txtRegistro.SetFocus
End Sub
Private Sub btnLimpar_Click()
    LimparFormulario
    Mensagem ""
End Sub

Vamos ao quarto item. Um ponto importante é restringir a quantidade de caracteres que cada um desses campos irá receber. Se não houver restrição, o campo Registro, por exemplo, pode receber um número muito grande e causar estouro na variável. Podemos definir um limite de 6 dígitos para esse campo. A data pode receber automaticamente as barras, o CPF pode receber os pontos e o traço, enquanto o salário pode receber o sinal de moeda e vírgula. Assim, a data terá um limite de 10 dígitos (incluindo as barras), o CPF terá 14 dígitos (inclui os pontos e o traço) e o salário terá um limite de 13 dígitos (incluindo moeda, separadores de milhar e vírgula). Podemos definir as propriedades MaxLength de cada campo no próprio formulário, mas também podemos definir no código, ficando mais fácil de consultar no futuro quando for fazer alguma manutenção. O melhor lugar é na inicialização do formulário. Inclua as linhas abaixo em UserForm_Initialize:

    Me.txtRegistro.MaxLength = 6
    Me.txtDataNascimento.MaxLength = 10
    Me.txtCPF.MaxLength = 14             
    Me.txtSalario.MaxLength = 13

Se você leu meu artigo sobre tratamento de entradas de formulário deve saber fazer as restrições de entrada para alguns campos. O evento KeyPress intercepta a digitação no campo, permitindo que a gente permita só alguns caracteres, além de formatar o campo conforme vai digitando. O campo Registro só precisará de restringir a valores numéricos, os demais precisarão de formatação. Você pode tentar fazer os códigos desses eventos como exercício usando o artigo citado acima como referência antes de usar o código abaixo:

Private Sub txtRegistro_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case Asc("0") To Asc("9")
        Case Else
            KeyAscii = 0
    End Select
End Sub
Private Sub txtDataNascimento_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case Asc("0") To Asc("9")
            If Me.txtDataNascimento.SelStart = 2 Or Me.txtDataNascimento.SelStart = 5 _
                Then
                Me.txtDataNascimento.SelText = "/"
            End If
        Case Else
            KeyAscii = 0
    End Select
End Sub
Private Sub txtCPF_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case Asc("0") To Asc("9")
            If Me.txtCPF.SelStart = 3 Or Me.txtCPF.SelStart = 7 _
                Then
                Me.txtCPF.SelText = "."
            ElseIf Me.txtCPF.SelStart = 11 Then
                Me.txtCPF.SelText = "-"
            End If
        Case Else
            KeyAscii = 0
    End Select
End Sub
Private Sub txtSalario_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case Asc("0") To Asc("9")
            If Me.txtSalario.SelStart = 0 Then
                Me.txtSalario.SelText = "R$ "
            End If
        Case Asc(",")
            If InStr(1, Me.txtSalario.Text, ",") Then
                KeyAscii = 0
            End If
        Case Else
            KeyAscii = 0
    End Select
End Sub

Já o evento Exit ocorre quando sai do campo. É aqui que vamos levar o valor à propriedade da classe para fazer a validação do dado. Portanto, vamos criar a classe antes. Na área de declarações do módulo do formulário, junto com as constantes declaradas, defina a classe:

Private Funcionario As clsFuncionario

Desta forma o objeto está disponível para o módulo todo, ou seja, existirá enquanto o formulário estiver aberto. Na inicialização do formulário (em UserForm_Initialize), crie o objeto Funcionario:

Set Funcionario = New clsFuncionario

Isto criará o objeto junto com o formulário. Por fim, no final da rotina de limpeza do formulário (LimparFormulario), vamos destruir o objeto e criá-lo novamente:

Set Funcionario = Nothing
Set Funcionario = New clsFuncionario

Poderíamos limpar propriedade por propriedade, mas esta forma é mais prática. Isto serve para eliminarmos quaisquer dados existentes no objeto que possam ser usados indevidamente em um outro funcionário.

Vamos então ao evento Exit do campo Registro. Nada mais prático para o usuário do que efetuar a pesquisa pelo número logo que sair do campo, certo? Então devemos utilizar aqui a função Pesquisar do objeto Funcionario. Lembre-se de como foi criada? Se o número for localizado retornará verdadeiro e os dados serão carregados, se não for encontrado retornará falso. Portanto, se o número existir teremos os dados, bastando exibi-los no formulário, desabilitar o botão Cadastrar e habilitar os botões Alterar e Desligar. Podemos também exibir mensagem informando se encontrou ou não e também se o funcionário está desligado da empresa.  Segue o código:

Private Sub txtRegistro_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Me.txtRegistro.Text <> "" And IsNumeric(Me.txtRegistro.Text) Then
        If Funcionario.Pesquisar(CLng(Me.txtRegistro.Text)) = True Then
            PreencherFormulario
        Else
            Mensagem "Funcionário " & Funcionario.Registro & " não cadastrado"

        End If
    End If
End Sub
Private Sub PreencherFormulario
    Me.txtRegistro.Text = Funcionario.Registro
    Me.cmbNome.Text = Funcionario.Nome
    Me.txtDataNascimento.Text = Funcionario.DataNascimento
    Me.txtCPF.Text = Left$(Funcionario.CPF, 3) & "." & Mid$(Funcionario.CPF, 4, 3) & _
        "." Mid$(Funcionario.CPF, 7, 3) & "-" & Right$(Funcionario.CPF, 2)
    Me.cmbCargo.Text = Funcionario.Cargo
    Me.txtSalario.Text = Format(Funcionario.Salario, "R$ ###,##0.00")
    Me.btnCadastrar.Enabled = False
    Me.btnAlterar.Enabled = True
    Me.btnDesligar.Enabled = True
    If Funcionario.Ativo = True Then
        Mensagem "Funcionário " & Funcionario.Registro & " localizado"
    Else
        Me.btnDesligar.Visible = False
        Me.btnRecontratar.Visible = True
        Mensagem "Funcionário " & Funcionario.Registro & " foi desligado"
    End If
End Sub

Se você cadastrou alguns funcionários quando testou a classe, pode usar alguns números para testar esse evento. Se não tem ninguém cadastrado, coloque alguns na planilha e teste. Veja como os dados aparecem no formulário logo após sair do campo Registro.

Os botões Desligar e Recontratar têm um funcionamento simples. Eles disparam funções do objeto Funcionario (Desativar e Ativar, respectivamente) e exibem a mensagem. Como desligamento e recontratação são situações críticas, é melhor enviar uma mensagem de alerta para o usuário antes, para garantir que o clique não foi sem querer. Segue o código:

Private Sub btnDesligar_Click()
    Dim Resposta As Integer
    Resposta = MsgBox("Esta ação marcará o funcionário " & Funcionario.Nome & _
        " como desligado da empresa." & vbCrLf & "Tem certeza?", vbExclamation + _
        vbYesNo, "Atenção! Demissão de funcionário")
    If Resposta = vbYes Then
        Funcionario.Desativar
        Mensagem "Funcionario " & Funcionario.Registro & " desligado"
        LimparFormulario
    End If
End Sub
Private Sub btnRecontratar_Click()
    Dim Resposta As Integer
    Resposta = MsgBox("Esta ação reativará o funcionário " & Funcionario.Nome & _
        " no quadro de funcionários." & vbCrLf & "Tem certeza?", vbExclamation + _
        vbYesNo, "Atenção! Recontratação de funcionário")
    If Resposta = vbYes Then
        Funcionario.Ativar
        Mensagem "Funcionario " & Funcionario.Registro & " recontratado"
        LimparFormulario
    End If
End Sub

Você pode testar esses botões, desligando e recontratando os funcionários diversas vezes. Clique no botão Não para ver que nada acontece e os dados permanecem no formulário.

No momento falta validar os dados dos campos Data de nascimento, CPF e Salário. É preciso lembrar que ao inserir os dados é aplicada uma máscara, ou seja, acrescenta barras, pontos, traço e representação de moeda. Precisamos certificar de que a máscara está correta, ou seja, o usuário não removeu nenhum número após o surgimento da máscara. Além disso, precisamos checar se o dado é válido, emitindo a mensagem de alerta. Também é uma boa ideia alterar o fundo do campo para deixar sinalizado que o valor não é válido. Inclusive isso facilitará a codificação dos botões Cadastrar e Alterar, pois bastará checar se os campos não estão vazios e que a cor deles sinaliza que o dado é válido. Vamos ao evento para o campo Data de nascimento:

Private Sub txtDataNascimento_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim DataNumero As String
    DataNumero = Replace(txtDataNascimento.Text, "/", "")
    If DataNumero = "" Then
        Me.txtDataNascimento.Text = ""
        Mensagem ""
        Exit Sub
    End If
    If Len(DataNumero) = 8 Then
        Me.txtDataNascimento.Text = Left$(DataNumero, 2) & "/" & Mid$(DataNumero, 3, 2) _
        & "/" & Right$(DataNumero, 4)
    End If
    If IsDate(Me.txtDataNascimento.Text) And Len(DataNumero) = 8 Then
        Funcionario.DataNascimento = CDate(Me.txtDataNascimento.Text)
        Me.txtDataNascimento.BackColor = vbWindowBackground
        Mensagem ""
    Else
        Me.txtDataNascimento.BackColor = RGB(255, 153, 102)
        Mensagem "Data de nascimento informada inválida", True
    End If
End Sub

Aqui foi criada uma variável DataNumero, que recebe o conteúdo do campo e remove as barras. Em seguida é verificado se o valor está em branco, neste caso define o valor do campo como vazio (caso o usuário apague os números e só deixe as barras), elimina uma eventual mensagem que esteja sendo exibida, garante a cor de fundo original e sai da sub-rotina. Em seguida, verifica se o resultado tem 8 dígitos e reconstrói a data. Por fim, verifica se a data é válida e novalmente verifica se DataNumero tem 8 dígitos. Se ambas as condições forem verdadeiras, armazena a data no objeto Funcionario e garante a cor de fundo original, para mostrar que o dado é válido e elimina a mensagem, se houver. Se alguma das condições não for verdadeira, o fundo do campo é alterado para uma tonalidade avermelhada, sinalizando que o dado é inválido e uma mensagem de alerta é exibida.

Para os campos CPF e Salário, há algumas diferenças sutis. O CPF pode ter menos de 11 dígitos (14 com os pontos e traço) e o usuário sair do campo. Neste caso deve acrescentar zeros à esquerda e reconstruir a máscara. O valor numérico com 11 dígitos então será enviado para o objeto Funcionario. Lembrando como a classe foi projetada: se o CPF for válido, o valor é armazenado normalmente e a propriedade Inconsistente permanecerá com valor falso; se o CPF for inválido (o DAC não conferir), o valor não é armazenado e Inconsistente se torna verdadeiro. Vejamos o código:

Private Sub txtCPF_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim CPFNumero As String
    CPFNumero = Replace(Replace(txtCPF.Text, ".", ""), "-", "")
    If CPFNumero = "" Then
        Me.txtCPF.Text = ""
        Exit Sub
    End If
    If Len(CPFNumero) < 11 Then
        CPFNumero = String(11 - Len(CPFNumero), "0") & CPFNumero
    End If
    Me.txtCPF.Text = Left$(CPFNumero, 3) & "." & Mid$(CPFNumero, 4, 3) & "." & _
        Mid$(CPFNumero, 7, 3) & "-" & Right$(CPFNumero, 2)
    Funcionario.CPF = CPFNumero
    If Funcionario.Inconsistencia = False Then
        Me.txtCPF.BackColor = vbWindowBackground
        Mensagem ""
    Else
        Me.txtCPF.BackColor = RGB(255, 153, 102)
        Mensagem "CPF informado inválido", True
    End If
End Sub

O campo Salário só permite a entrada de números e uma única vírgula. É preciso lembrar que a propriedade Salario no objeto Funcionario está em formato moeda, ou seja, permite até 4 casas decimais. É preciso remover eventuais casas decimais além do permitido. O código abaixo faz todo o tratamento necessário:

Private Sub txtSalario_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim SalarioNumero As String
    Dim PosicaoVirgula As Integer
    Dim CasasDecimais As Integer
    SalarioNumero = Trim(Replace(Replace(Me.txtSalario.Text, "R$ ", ""), ".", ""))
    If SalarioNumero = "" Then
        Me.txtSalario.BackColor = vbWindowBackground
        Mensagem ""
        Exit Sub
    End If
    PosicaoVirgula = InStr(1, SalarioNumero, ",")
    If PosicaoVirgula > 1 Then
        CasasDecimais = Len(SalarioNumero) - PosicaoVirgula
        If CasasDecimais > 2 Then
            SalarioNumero = Left$(SalarioNumero, Len(SalarioNumero) - _
            (CasasDecimais - 2))
        End If
    End If
    If SalarioNumero <> "" And IsNumeric(SalarioNumero) Then
        Me.txtSalario.Text = Format(SalarioNumero, "R$ ###,##0.00")
        Funcionario.Salario = CCur(SalarioNumero)
        If Funcionario.Inconsistencia = False Then
            Me.txtSalario.BackColor = vbWindowBackground
            Mensagem ""
        Else
            Me.txtSalario.BackColor = RGB(255, 153, 102)
            Mensagem "Salário informado inválido", True
        End If
    Else
        Me.txtSalario.BackColor = RGB(255, 153, 102)
        Mensagem "Salário informado inválido", True
    End If
End Sub

Vamos então aos botões Cadastrar e Alterar. Antes de efetivar qualquer alteração na base é preciso certificar que os dados estão corretos e consistentes. A inconsistência pode ser verificada se o campo está com cor diferente de vbWindowBackground (cor branca padrão do fundo da caixa de texto). Fora isso precisamos verificar se há dado, ou seja, se o campo não está vazio. Como essas validações são necessárias tanto para Cadastrar como para Alterar, podemos fazer uma função booleana que devolverá verdadeiro quando os dados estão em ordem e falso se houver algum campo em branco ou inconsistente:

Private Function ValidarDados() As Boolean
    If Me.txtRegistro.Text = "" Or Me.txtRegistro.BackColor <> vbWindowBackground Then
        Me.txtRegistro.SetFocus
        ValidarDados = False
        Exit Function
    End If
    If Me.cmbNome.Text = "" Or Me.cmbNome.BackColor <> vbWindowBackground Then
        Me.cmbNome.SetFocus
        ValidarDados = False
        Exit Function
    End If
    If Me.txtDataNascimento.Text = "" Or Me.txtDataNascimento.BackColor <> _
        vbWindowBackground Then
        Me.txtDataNascimento.SetFocus
        ValidarDados = False
        Exit Function
    End If
    If Me.txtCPF.Text = "" Or Me.txtCPF.BackColor <> vbWindowBackground Then
        Me.txtCPF.SetFocus
        ValidarDados = False
        Exit Function
    End If
    If Me.cmbCargo.Text = "" Or Me.cmbCargo.BackColor <> vbWindowBackground Then
        Me.cmbCargo.SetFocus
        ValidarDados = False
        Exit Function
    End If
    If Me.txtSalario.Text = "" Or Me.txtSalario.BackColor <> vbWindowBackground Then
        Me.txtSalario.SetFocus
        ValidarDados = False
        Exit Function
    End If
    ValidarDados = True
End Function

Feito isso, os botões Cadastrar e Alterar devem checar se ValidarDados retorna verdadeiro, executando então os métodos Adicionar e Alterar, respectivamente, exibir a mensagem informando do fato e limpar o formulário. Se retornar falso, nada acontecerá. O código é bem simples:

Private Sub btnCadastrar_Click()
    If ValidarDados = True Then
        Funcionario.Adicionar
        Mensagem "Funcionário " & Funcionario.Registro & " cadastrado"
        LimparFormulario
    End If
End Sub
Private Sub btnAlterar_Click()
    If ValidarDados = True Then
        Funcionario.Alterar
        Mensagem "Funcionário " & Funcionario.Registro & " alterado"
        LimparFormulario
    End If
End Sub

Está faltando o tratamento das caixas de listagem Nome do funcionário e Cargo, bem como as rotinas de geração das listas e o botão Pesquisar nome. Como este artigo está bem extenso, vamos deixar para o próximo.

Caso tenha dúvidas sobre o artigo ou queira fazer comentários e sugestões, utilize a seção de comentários abaixo. Até o próximo artigo!

Pedro Martins



Pós-graduando em Business Intelligence e Big Data pela Faculdade Impacta de Tecnologia. Formado em Tecnologia em Eletrônica Digital com Ênfase em Microprocessadores





Postagem Anterior Próxima Postagem