Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

Excel: Lista de Contactos - Parte I

O Microsoft Excel não é uma base de dados mas sim, como todos sabem, uma folha de cálculo. No entanto, e por ser bastante versátil e simples de trabalhar, há quem o utilize para tal. Não é aconselhável, pois existem outras formas de gerir dados, mas quando se trata de pouca informação e/ou informação que utilize muitos cálculos e gráficos, então porque não?

Para mostrar como criar uma gestão de dados em Excel, este artigo irá mostrar a criação de uma lista de contactos. É um exemplo simples, que será dividido em alguns artigos, irá mostrar a criação de um formulário para inserção de novos contactos. Nos próximos artigos deste exemplo, será mostrado como criar listagens, modificar dados, personalizar a folha, etc.

Neste artigo inicial podem-se ver alguns pontos de interesse: criação de funções, criação de sub rotinas ou rotinas auxiliares, ciclo nos controlos do userform, validação de dados, etc.

Para seja mais fácil a análise do código e como está a funcionar, será adicionado um exemplo no final do artigo.

Nesta folha de cálculo existem duas Worksheets: Principal e Registos. A Principal é onde serão colocado os botões de comando (para chamar os userforms), e a Registos onde serão guardados os dados. Foi ainda inserido um Userform. No userform, onde está o código principal, o código utilizado é o seguinte:

Option Explicit

' Função que verifica se o campo é válido e retorna o resultado da validação
Private Function ValidaContacto(ByVal Contacto As String, ByVal NomeCampo As String) As Boolean

    ' Verifica se o número de caracteres é diferente de 9 e não está vazio
    If Len(Contacto) <> 9 And Len(Contacto) <> 0 Then
        MsgBox "O campo " & NomeCampo & " não é válido.", vbExclamation
        ValidaContacto = False
        Exit Function
    End If

    ' Verifica se o campo é numérico e não está vazio
    If Not IsNumeric(Contacto) And Len(Contacto) <> 0 Then
        MsgBox "O campo " & NomeCampo & " não é numérico.", vbExclamation
        ValidaContacto = False
        Exit Function
    End If

    ' Caso não existam erros a função retorna um valor verdadeiro
    ValidaContacto = True

End Function

         

' Subrotina que limpa o formulário
Sub LimpaFormulario()
    Dim c As Control

    ' Faz um ciclo em todos os controls
    For Each c In Me.Controls

        ' Se o controlo for um TextBox
        ' limpa o texto do controlo
        If TypeOf c Is MSForms.TextBox Then
            c.Text = ""
        End If

    Next

    ' Coloca seleccionada a primeira opção
    OptionButton1.Value = True
    OptionButton2.Value = False
    OptionButton3.Value = False         

End Sub

         

' Insere o registo
Private Sub btnInserir_Click()

    ' Verifica se o campo nome está preenchido. Como este campo é de
    ‘ preenchimento obrigatório, não será utilizada a função ValidaContacto()
    If Len(txtNome.Text) = 0 Then
        MsgBox "O campo NOME é de preenchimento obrigatório.", vbExclamation
        Exit Sub
    End If

    ' Valida todos os campos. Como estes campos têm validações
    ' comuns (numérico e nove dígitos) foi criada uma função
    ' auxiliar de modo a reduzir e optimizar o código.
    If Not ValidaContacto(txtTelefone.Text, "TELEFONE") Then Exit Sub
    If Not ValidaContacto(txtTelemovel.Text, "TELEMÓVEL") Then Exit Sub
    If Not ValidaContacto(txtTrabalho.Text, "TELF. TRABALHO") Then Exit Sub
    If Not ValidaContacto(txtFax.Text, "FAX") Then Exit Sub

    ' Confirma se utilizador quer mesmo inserir o registo
    If MsgBox("Deseja inserir este registo ?", vbQuestion + vbYesNo + vbDefaultButton2) = vbYes Then

        Dim strGrupo As String
        Dim ultimaLinha As Long
        Dim ws As Worksheet

        Set ws = Worksheets("Registos")

        ' Verifica qual a ultima linha preenchida
        ultimaLinha = ws.Cells(65536, 1).End(xlUp).Row + 1

        ' Preenche as células
        ws.Cells(ultimaLinha, 1).Value = txtNome.Text

        ' Verifica qual a opção seleccionada
        If OptionButton1.Value Then
            strGrupo = "Familia"
        ElseIf OptionButton2.Value Then
            strGrupo = "Amigos"
        ElseIf OptionButton3.Value Then
            strGrupo = "Trabalho"
        End If

        ws.Cells(ultimaLinha, 2).Value = strGrupo
        ws.Cells(ultimaLinha, 3).Value = txtTelefone.Text
        ws.Cells(ultimaLinha, 4).Value = txtTelemovel.Text
        ws.Cells(ultimaLinha, 5).Value = txtTrabalho.Text
        ws.Cells(ultimaLinha, 6).Value = txtFax.Text
        ws.Cells(ultimaLinha, 7).Value = txtObs.Text

        ' Limpa o formulário
        Call LimpaFormulario()

        ' Coloca o cursor no campo Nome, para ficar pronto
        ' para a inserção de novos contactos
        txtNome.SetFocus

    End If

End Sub         

' Fechar o formulário
Private Sub btnFechar_Click()
    Unload Me
End Sub

' Limpar o formulário
Private Sub btnLimpar_Click()
    Call LimpaFormulario()
End Sub 

Este exemplo utiliza algum código mas poderá ser ainda mais complexo. Poderá, por exemplo, ser validado no campo telemóvel se inicia por 91,93 ou 96, obrigar o preenchimento de mais campos, obrigar a um número mínimo de caracteres, etc. O objectivo é no entanto mostrar como funciona e a implementação de alguns conceitos gerais.

Exemplo do artigo: DOWNLOAD DO FICHEIRO

         

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

9 comentários:

josatose disse...

Boa tarde,

Agradeço este seu exemplo, pois está muito bem feito, para uma pessoa que não pesca nada de VB acho que está excelente.

Obrigado

JASantos

Jorge Paulino disse...

Obrigado José Santos ,

Espero sinceramente contribuir para que aprenda qualquer coisa de VB.

Em breve vou disponibilizar uma segunda parte deste artigo.

Cumprimentos
Jorge Paulino

Anónimo disse...

Olá, estou espantadíssimo com todo este conhecimento.
Sou um auto didata no excel, tudo o que sei aprendi por mérito próprio.
Sou militar e sou coordenador/formador do curso de ferramentas de apoio administrativo no módulo de excel aqui no quartel. gostava de passar a outro nível (visual basic), neste não consigo aprender por mim pois o software é em inglês.
haverá algum manual disponível na web para consulta e/ou download? para tentar aprender por mim...
obrigado pela atenção que me possa despender.
e parabéns por este blog

Jorge Paulino disse...

Olá Marco,

Também sou auto-didata na informática e o facto de saber programação é uma grande ajuda para o Excel.

Manuais ou páginas em Português de Excel na web não conheço, e foi um dos motivos que me levou a criar este blog (embora tenha apenas algumas coisas de VBA).

No entanto se quiser tentar aprender um pouco mais pode visitar e colocar questões num fórum onde sou moderador - www.portugal-a-programar.org - ou então comprar um livro em www.fca.pt (por exemplo).

E não esquecer de continuar a visitar este blog.

Um abraço
Jorge Paulino

PS: O email deste blog está no rodapé, se quiser algum esclarecimento adicional.

cantinho dos Pombinhos disse...

boa tarde gostava de saber se é possivel efectuar um formulário destes que preencha celulas especificas e não seguidas de uma folha de excel
obrigado
Paula Pombinho

Jorge Paulino disse...

Sim, claro!

Mas qual é a ideia ? Pode ser necessário procurar pela posição correcta, mas é bem possível.

Coloque a questão em www.portugal-a-programar.org, na secção de VBA.

Bruno disse...

Muito bom este tutorial... esclareceu varias duvidas minhas

Unknown disse...
Este comentário foi removido pelo autor.
Unknown disse...

Não estou a conseguir fazer o download do exemplo dá mensagem de servidor não encontrado é possível uma alternativa para que possa fazer o donload do mesmo muito obrigado pela atenção que possa dispensar a este pedido



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject
Google-Translate-ChineseGoogle-Translate-Portuguese to FrenchGoogle-Translate-Portuguese to GermanGoogle-Translate-Portuguese to ItalianGoogle-Translate-Portuguese to JapaneseGoogle-Translate-Portuguese to EnglishGoogle-Translate-Portuguese to RussianGoogle-Translate-Portuguese to Spanish

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico