vba - cadastrando clientes e enviando emails2

Upload: nssbaixar

Post on 25-Feb-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    1/11

    VBA - Cadastro de Clientes com envio deEmail no Excel - II

    Na primeira parte deste artigoeu deixei tudo pronto para que nesta segunda parte pudessepartir para a definio do cdigo VBA da aplicao.

    E assim ser feito...

    Vamos abrir o Microsoft Excel !!"e em seguida abrir o arqui#o que criamos na primeiraparte c$amado% CadastroClientes

    Estando na planil$a aberta pressione Alt+F11 ou clique na opo Visual Basic no menu daplanil$a para abrir o Editor Visual Basic;

    Quando a janela do Editor Visual Basicestiver aberta expanda o item Formulrio e clique no formulriofrmCadastroClientespara exibir o formulrio conforme a figura abaixo:

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    2/11

    Antes de definir qualquer cdigo no formulrio temos que logo no incio do mesmo declarar as variveis

    que iremos usar no formulrio. Dessa forma no incio do cdigo do formulrio digite o cdigo que declara

    essas variveis conforme abaixo:

    Option Explicit

    'define constantes para controlar as colunas de

    dados

    Const colCodigo As Integer = 1

    Const colNome As Integer = 2

    Const colEndereco As Integer = 3

    Const colCidade As Integer = 4

    Const colEstado As Integer = 5

    Const colCep As Integer = 6

    Const colTelefone As Integer = 7

    Const colEmail As Integer = 8

    Const indiceMinimo As Byte = 2

    'define variavies para controlar aPrivate alterar As Boolean

    Private novo As Boolean

    Private excluir As Boolean

    'define as constantes para as cores do textbox

    Const corDesabilitaTextBox As Long =

    -2147483633

    Const corHabilitaTextBox As Long =

    -2147483643

    'define a planilha usada e o indice do registro

    Private wsCadastroClientes As WorksheetPrivate indiceRegistro As Long

    Antes de partirmos para a definio do cdigo dos eventos dos botes temos que definir o cdigo que

    usaremos quando o formulrio for aberto. Quando o formulrio aberto ocorre o evento Initialize() do

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    3/11

    formulrio e nele inclumos o seguinte cdigo:

    Private Sub UserForm_Initialize()

    novo = False

    alterar = False

    excluir = False

    Set wsCadastroClientes =

    ThisWorkbook.Worksheets("Clientes") Call HabilitaBotoesAlteracao

    Call carregaDados

    Call DesabilitaControles

    End Sub

    A seguir vou mostrar as 4 rotinas usadas na carga do formulrio:HabilitaBotoesAlteracao,carregaDados e DesabilitaControles e HabilitaControles:

    1- HabilitaBotoesAlteracao -Esta rotina apenas desabilita o botes Alterar, Excluir, Novo, OK eCancelar;

    Private Sub

    HabilitaBotoesAlteracao()

    'habilita os botes de

    alterao

    cmdAlterar.Enabled =

    True

    cmdExcluir.Enabled =

    True

    cmdNovo.Enabled = True

    cmdOk.Enabled = False

    cmdCancelar.Enabled =

    False

    End Sub

    2- carregaDados() - Carrega os dados o registro atual exibindo-os nos controles TextBox;

    Private Sub CarregaRegistro()

    'carrega os dados do primeiro registro

    With wsCadastroClientes

    If Not IsEmpty(.Cells(indiceRegistro, colNome))

    Then

    Me.txtCodigo.Text = .Cells(indiceRegistro,

    colCodigo).Value

    Me.txtNome.Text = .Cells(indiceRegistro,

    colNome).Value

    Me.txtEndereco.Text = .Cells(indiceRegistro,

    colEndereco).Value

    Me.txtCidade.Text = .Cells(indiceRegistro,

    colCidade).Value

    Me.txtEstado.Text = .Cells(indiceRegistro,

    colEstado).Value

    Me.txtCep.Text = .Cells(indiceRegistro,

    colCep).Value Me.txtTelefone.Text = .Cells(indiceRegistro,

    colTelefone).Value

    Me.txtEmail.Text = .Cells(indiceRegistro,

    colEmail).Value

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    4/11

    End If

    End With

    Call AtualizaRegistroAtual

    End Sub

    3- DesabilitaControles - Desabilita os controles TextBox e altera a cor de cada um deles;

    Private Sub DesabilitaControles()

    Me.txtNome.Locked = True

    Me.txtEndereco.Locked = True

    Me.txtCidade.Locked = True

    Me.txtEstado.Locked = True

    Me.txtCep.Locked = True

    Me.txtTelefone.Locked = True

    Me.txtEmail.Locked = True

    'altera a cor dos controles

    Me.txtNome.BackColor =

    corDesabilitaTextBox

    Me.txtEndereco.BackColor =

    corDesabilitaTextBox

    Me.txtCidade.BackColor =corDesabilitaTextBox

    Me.txtEstado.BackColor =

    corDesabilitaTextBox

    Me.txtCep.BackColor =

    corDesabilitaTextBox

    Me.txtTelefone.BackColor =

    corDesabilitaTextBox

    Me.txtEmail.BackColor =

    corDesabilitaTextBox

    End Sub

    4- HabilitaControles() : Reabilita os controles TextBox e as cores;

    Private Sub HabilitaControles()

    Me.txtNome.Locked = False

    Me.txtEndereco.Locked = False

    Me.txtCidade.Locked = False

    Me.txtEstado.Locked = False

    Me.txtCep.Locked = False

    Me.txtTelefone.Locked = False

    Me.txtEmail.Locked = False

    'altera a cor dos controles

    Me.txtNome.BackColor = corHabilitaTextBox

    Me.txtEndereco.BackColor = corHabilitaTextBox

    Me.txtCidade.BackColor = corHabilitaTextBox

    Me.txtEstado.BackColor = corHabilitaTextBox

    Me.txtCep.BackColor = corHabilitaTextBox

    Me.txtTelefone.BackColor = corHabilitaTextBox

    Me.txtEmail.BackColor = corHabilitaTextBox

    End Sub

    Aps isso agora vamos usar o evento Clickde cada um dos Botes de comando existentes no formulriopara realizar as operaes que desejamos que seja executada na planilha.

    Basta clicar duas vezes sobre o boto desejado para que a janela de cdigo seja aberta com o evento

    pronto para receber o cdigo. Faremos este procedimento para cada uma dos 10 botes de comandoiniciando com o boto Novoe deixando por ltimo o boto Enviar Email;

    1- Cdigo dos botes que realiza as operaes de manuteno de dados:

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    5/11

    1- Boto Novo - defina a varivel novo como True, limpa e habilita os controles e desabilita os controlesdas operaes CRUD;

    Private Sub cmdNovo_Click()

    novo = True

    excluir = False

    alterar = False

    Call LimpaControles Call HabilitaControles

    Call DesabilitaBotoesAlteracao

    'd o foco ao primeiro controle de dados

    txtNome.SetFocus

    End Sub

    2- Boto Alterar: Define a varivel alterar como True e verifica se o cdigo do cliente foi informado,

    definindo o foco na caixa de texto Nome:

    Private Sub cmdAlterar_Click()

    alterar = True

    If txtCodigo.Text vbNullString And

    txtCodigo.Text "" Then

    Call HabilitaControles

    Call DesabilitaBotoesAlteracao

    'd o foco ao primeiro controle de dados

    txtNome.SetFocus

    Else

    lblMensagem.Caption = "No h registro a

    ser alterado" End If

    End Sub

    3- Boto Excluir - Define a varivel excluir como True , verifica se o cdigo do cliente foi informado e

    desabilita os botes de alterao:

    Private Sub cmdExcluir_Click()

    excluir = True

    If txtCodigo.Text vbNullString And txtCodigo.Text ""

    Then

    Call DesabilitaBotoesAlteracao

    lblMensagem.Caption = "Voc confirma a excluso deste

    registro. (Para excluir clique no boto OK.) "

    Else

    lblMensagem.Caption = "No existe registro a ser excludo"

    End If

    End Sub

    4- Boto OK - Este cdigo ir realizar as operaes conforme o valor da varivel alterar, nome e excluir:

    Private Sub cmdOk_Click()

    'valida campos do formulrio

    If ValidaCamposFormulario = False Then

    Exit Sub

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    6/11

    End If

    Dim proximoId As Long

    'Alterar registros

    If alterar = True Then

    Call SalvaRegistro(CLng(txtCodigo.Text), indiceRegistro)

    lblMensagem.Caption = "O Registro alterado com sucesso."

    alterar = False

    End If

    'Novo registro

    If novo = True Then

    proximoId = ObterProximoId

    'pega a prxima linha

    Dim proximoIndice As Long

    proximoIndice = wsCadastroClientes.UsedRange.Rows.Count + 1

    Call SalvaRegistro(proximoId, proximoIndice)

    txtCodigo = proximoId

    lblMensagem.Caption = "Novo registro salvo com sucesso."

    novo = False

    End If

    'Excluir um registro

    If excluir = True Then

    Dim resultado As VbMsgBoxResult

    resultado = MsgBox("Deseja excluir o registro n " & txtCodigo.Text & " ?",

    vbYesNo, "Confirmao")

    If resultado = vbYes Then

    wsCadastroClientes.Range(wsCadastroClientes.Cells(indiceRegistro,

    colCodigo), wsCadastroClientes.Cells(indiceRegistro,

    colCodigo)).EntireRow.Delete

    Call carregaDados

    lblMensagem.Caption = "O Registro escolhido foi excludo com sucesso."

    End If

    excluir = False

    End If

    Call HabilitaBotoesAlteracao

    Call DesabilitaControles

    End Sub

    5- Boto Cancelar- Cancela uma operao em andamento.

    Private Sub cmdCancelar_Click()

    cmdOk.Enabled = False

    cmdCancelar.Enabled = False

    Call DesabilitaControles

    Call carregaDados

    Call HabilitaBotoesAlteracao

    End Sub

    As operaes de cada um dos botes acima descritos usam as seguintes rotinas para realizar as tarefas

    pertinentes:

    1- SalvaRegistro() - Salva as informaes na planilha Excel:

    Private Sub SalvaRegistro(ByVal id As Long, ByVal

    indice As Long)

    With wsCadastroClientes

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    7/11

    .Cells(indice, colCodigo).Value = id

    .Cells(indice, colNome).Value = Me.txtNome.Text

    .Cells(indice, colEndereco).Value =

    Me.txtEndereco.Text

    .Cells(indice, colCidade).Value =

    Me.txtCidade.Text

    .Cells(indice, colEstado).Value =

    Me.txtEstado.Text

    .Cells(indice, colCep).Value = Me.txtCep.Text

    .Cells(indice, colTelefone).Value =Me.txtTelefone.Text

    .Cells(indice, colEmail).Value = Me.txtEmail.Text

    End With

    Call AtualizaRegistroAtual

    End Sub

    2- ObterProximoId- Obtm a prxima posio do registro na planilha:

    Private Function ObterProximoId() As Long

    Dim rangeIds As Range

    'pega o range que se refere a toda a coluna do cdigo (id) Set rangeIds = wsCadastroClientes.Range(wsCadastroClientes.Cells(indiceMinimo, colCodigo),

    wsCadastroClientes.Cells(wsCadastroClientes.UsedRange.Rows.Count, colCodigo))

    ObterProximoId = WorksheetFunction.Max(rangeIds) + 1

    End Function

    3- AtualizaRegistroAtual- Atualiza a informao do registro atual exibindo a posio atual do registrona Label do formulrio:

    Private Sub AtualizaRegistroAtual()

    lblRegistro.Caption = indiceRegistro - 1 & " de " &

    wsCadastroClientes.UsedRange.Rows.Count - 1End Sub

    2- Cdigo dos botes que permitem a navegao pelos dados da planilha

    1- 1 Then

    Call CarregaRegistro

    End If

    End Sub

    2- < - Registro Anterior - Limpa a mensagem e verifica o ndice do registro posicionando-o no registro

    anterior;

    Private Sub cmdAnterior_Click()

    If indiceRegistro > indiceMinimo

    Then indiceRegistro = indiceRegistro - 1

    End If

    If indiceRegistro > 1 Then

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    8/11

    Call CarregaRegistro

    End If

    End Sub

    3- >- Prximo Registro - Limpa a mensagem e verifica se o ndice do registro e menor que o total delinhas; posicionando-o no prximo registro;

    Private Sub cmdProximo_Click() Call limpaMensagem

    If indiceRegistro 1 Then

    Call CarregaRegistro

    End If

    End Sub

    4- >> - ltimo Registro - Limpa a mensagem e atribui o total de registro ao ndice indo para ltimoregistro:

    Private Sub cmdUltimo_Click()

    Call limpaMensagem

    indiceRegistro =

    wsCadastroClientes.UsedRange.Rows.Count

    If indiceRegistro > 1 Then

    Call CarregaRegistro

    End If

    End Sub

    3- Cdigo do boto Enviar Email

    Private Sub cmdEnviaEmail_Click()

    Dim aplicacaoOutlook As Object

    Dim OutLookMail As Object

    Dim cell As Range

    Application.ScreenUpdating = False

    Set aplicacaoOutlook =

    CreateObject("Outlook.Application")

    On Error GoTo limpa

    Set OutMail = aplicacaoOutlook.CreateItem(0)

    On Error Resume Next

    With OutLookMail .Subject = "Aviso"

    .Body = "Caro " & txtNome.Text _

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    9/11

    & vbNewLine & vbNewLine & _

    "Entre em contato com nosso servio de cobrana "& _

    "para tratar assunto de seu interesse com urgncia"

    'Podemos enviar um anexo

    .Attachments.Add ("c:\dados\carta.txt")

    .Send

    End With

    On Error GoTo 0 Set OutLookMail = Nothing

    MsgBox ("Email enviado com sucesso..."& " para

    "&txtEmail.Text)

    limpa:

    Set aplicacaoOutlook = Nothing

    Application.ScreenUpdating = True

    End Sub

    A rotina para enviar um email usa oMicrosoft OutLookcriando uma instncia deste objeto e montandoe enviando um email.

    4- Rotinas de validao de dados usadas no formulrio

    - ValidaCamposFormulario() - Valida os campos do formulrio antes de gravar;

    Private Function ValidaCamposFormulario() As Boolean

    If Me.txtNome.Value = "" Then

    Me.txtNome.SetFocus

    MsgBox " 'Nome' um campo obrigatrio. ", vbOKOnly, " CampoObrigatrio "

    ValidaCamposFormulario = False

    Exit Function

    ElseIf Me.txtEndereco.Value = "" Then

    Me.txtEndereco.SetFocus

    MsgBox " 'Endereo' um campo obrigatrio.", vbOKOnly, " Campo

    Obrigatrio "

    ValidaCamposFormulario = False

    Exit Function

    ElseIf Me.txtCidade.Value = "" Then

    Me.txtCidade.SetFocus

    MsgBox "'Cidade' um campo obrigatrio. ", vbOKOnly, " Campo

    Obrigatrio "

    ValidaCamposFormulario = False

    Exit Function

    ElseIf Me.txtEstado.Value = "" Then

    Me.txtCidade.SetFocus

    MsgBox "'Estado' um campo obrigatrio. ", vbOKOnly, " Campo

    Obrigatrio "

    ValidaCamposFormulario = False

    Exit Function

    ElseIf Me.txtCep.Value = "" Then

    Me.txtCep.SetFocus

    MsgBox " 'Cep' um campo obrigatrio. ", vbOKOnly, " Campo

    Obrigatrio " ValidaCamposFormulario = False

    Exit Function

    ElseIf Me.txtTelefone.Value = "" Then

    Me.txtTelefone.SetFocus

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    10/11

    MsgBox "'Telefone' um campo obrigatrio.", vbOKOnly, " Campo

    Obrigatrio "

    ValidaCamposFormulario = False

    Exit Function

    ElseIf Me.txtEmail.Value = "" Then

    Me.txtEmail.SetFocus

    MsgBox "'Email' um campo obrigatrio.", vbOKOnly, " Campo

    Obrigatrio "

    ValidaCamposFormulario = False

    Exit FunctionEnd If

    ValidaCamposFormulario = True

    End Function

    Validao do Email informado no campo Emailusando uma expresso regular:

    Private Sub txtEmail_Exit(ByVal Cancel As

    MSForms.ReturnBoolean)

    With CreateObject("vbscript.regexp")

    .Pattern = "^[\w-\.]+@([\w-]+\.)+[A-Za-z]{2,3}$" If Not .test(txtEmail.Value) Then

    MsgBox "Email invlido."

    Cancel = True

    End If

    End With

    End Sub

    Ao executarmos o projeto abrindo a planilha Excel ao clicarmos no boto para enviar um email para ocliente selecionado iremos obter:

    Simples, simples assim...

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm

    de 11 14/05/2015 12:51

  • 7/25/2019 VBA - Cadastrando Clientes e Enviando Emails2

    11/11

    Pegue o projeto completo aqui: CadastroClientesVBAExcel.zip

    Eu sei & apenas Visual Basic for Applications (VBA)' mas eu gosto...

    (efer)ncias%

    VBA * +adastro de +lientes ,Excel-VB .NE * /ncluindo uma tabela do 0ord em um 1ata2ridVie34eo VBA do 4ite

    5os& +arlos Macoratti

    A - Cadastrando clientes e enviando emails http://www.macoratti.net/10/11/vba_ccli2.htm