vba - cadastrando clientes e enviando emails2
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