Fórum de Excel e VBA – Guia do Excel

Controle de etapas de projetos em Excel e VBA
Controle de etapas de projetos em Excel e VBA
4 de agosto de 2012
Converter PDF para Excel
Converter PDF para Excel
7 de agosto de 2012

Fórum de Excel e VBA – Guia do Excel

Olá amigos do Guia do Excel,

  Muitas vezes dou respostas por e-mail para leitores do site, mas estas respostas poderiam ser compartilhadas, auxiliando no crescimento profissional de outros internautas.

  Para que estas respostas não se percam este fórum foi criado para principalmente manter o histórico das respostas dadas por mim e poder contar com a grande colaboração dos amigos que visitam este site para colaborar uns com os outros para termos estas respostas.

  Inicialmente foram criadas as seguintes categorias, mas vocês podem sugerir novas categorias e aos poucos vamos organizando o fórum.

  1.   Dúvidas de artigos do Guia do Excel
  2.    Fórmulas
  3.    Gráficos
  4.    Lógica de programação
  5.    VBA

   O Fórum é um espaço colaborativo aonde todos poderão levantar questões no fórum e auxiliar na solução de outras, para tanto basta se cadastrar gratuitamente e passar a utilizá-lo.

  Desta forma é com prazer que lançamos hoje o fórum do Guia do Excel, que assim como outros fóruns como os amigos do Planilhando, busca o compartilhamento do conhecimento e o crescimento de todos.

  Assim convido a todos os leitores a se cadastrarem e passarem a fazer parte do nosso fórum.

  Já aproveitando para pedir que todas as dúvidas sejam colocadas diretamente no Fórum, e não mais nos comentários ou por e-mail. Esta medida é para facilitar esta troca de conhecimento e permitir que todos possam colaborar com todos, como já citado acima.

  Para acessá-lo, você pode clicar no link abaixo ou nos menus do site Guia do Excel, logo ao lado do Home.

Acesse aqui o Fórum

Um abraço

Marcos Rieper

8 Comentários

  1. Eduardo disse:

    Estou com problemas na planilha, quando mando enviar o email ele fala que foi enviado com sucesso mais não foi… meu outlook é 2010. estas são as linhas de comando. POR FAVOR ME AJUDEM.

    Option Explicit
    ‘define constantes para controlar as colunas de dados
    Const colCodigo As Integer = 1
    Const colNome As Integer = 2
    Const colAcompanhante As Integer = 3
    Const colServiço As Integer = 4
    Const colPeriodo As Integer = 5
    Const colReservaepgtopor As Integer = 7
    Const colEmail As Integer = 8
    Const indiceMinimo As Byte = 2

    ‘define variavies para controlar a
    Private 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 Worksheet
    Private indiceRegistro As Long
    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 = “Não há registro a ser alterado”
    End If
    End Sub

    Private Sub cmdAnterior_Click()
    If indiceRegistro > indiceMinimo Then
    indiceRegistro = indiceRegistro – 1
    End If
    If indiceRegistro > 1 Then
    Call CarregaRegistro
    End If
    End Sub

    Private Sub cmdCancelar_Click()
    cmdOk.Enabled = False
    cmdCancelar.Enabled = False
    Call DesabilitaControles
    Call carregaDados
    Call HabilitaBotoesAlteracao
    End Sub

    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

    Private Sub cmdOk_Click()

    ‘valida campos do formulário
    If ValidaCamposFormulario = False Then
    Exit Sub
    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 próxima 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, “Confirmação”)

    If resultado = vbYes Then
    wsCadastroClientes.Range(wsCadastroClientes.Cells(indiceRegistro, colCodigo), wsCadastroClientes.Cells(indiceRegistro, colCodigo)).EntireRow.Delete
    Call carregaDados
    lblMensagem.Caption = “O Registro escolhido foi excluído com sucesso.”
    End If
    excluir = False
    End If

    Call HabilitaBotoesAlteracao
    Call DesabilitaControles
    End Sub
    Private Sub SalvaRegistro(ByVal id As Long, ByVal indice As Long)
    With wsCadastroClientes
    .Cells(indice, colCodigo).Value = id
    .Cells(indice, colNome).Value = Me.txtNome.Text
    .Cells(indice, colAcompanhante).Value = Me.txtAcompanhante.Text
    .Cells(indice, colServiço).Value = Me.txtServiço.Text
    .Cells(indice, colPeriodo).Value = Me.txtPeriodo.Text
    .Cells(indice, colReservaepgtopor).Value = Me.txtReservaepgtopor.Text
    .Cells(indice, colEmail).Value = Me.txtEmail.Text
    End With

    Call AtualizaRegistroAtual
    End Sub

    Private Function ObterProximoId() As Long
    Dim rangeIds As Range
    ‘pega o range que se refere a toda a coluna do código (id)
    Set rangeIds = wsCadastroClientes.Range(wsCadastroClientes.Cells(indiceMinimo, colCodigo), wsCadastroClientes.Cells(wsCadastroClientes.UsedRange.Rows.Count, colCodigo))
    ObterProximoId = WorksheetFunction.Max(rangeIds) + 1
    End Function

    Private Sub cmdPrimeiro_Click()
    Call limpaMensagem
    indiceRegistro = indiceMinimo
    If indiceRegistro > 1 Then
    Call CarregaRegistro
    End If
    End Sub

    Private Sub cmdProximo_Click()
    Call limpaMensagem
    If indiceRegistro 1 Then
    Call CarregaRegistro
    End If
    End Sub

    Private Sub cmdUltimo_Click()
    Call limpaMensagem
    indiceRegistro = wsCadastroClientes.UsedRange.Rows.Count
    If indiceRegistro > 1 Then
    Call CarregaRegistro
    End If
    End Sub

    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 OutLookMail = aplicacaoOutlook.CreateItem(0)
    On Error Resume Next
    With OutLookMail
    .Subject = “voucher”
    .Body = “Caro ” & txtNome.Text
    .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
    Private Sub cmdExcluir_Click()
    excluir = True
    If txtCodigo.Text vbNullString And txtCodigo.Text “” Then
    Call DesabilitaBotoesAlteracao
    lblMensagem.Caption = “Você confirma a exclusão deste registro. (Para excluir clique no botão OK.) ”
    Else
    lblMensagem.Caption = “Não existe registro a ser excluído”
    End If
    End Sub
    End Sub

    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 inválido.”
    Cancel = True
    End If
    End With

    End Sub
    Private Sub UserForm_Initialize()
    novo = False
    alterar = False
    excluir = False
    Set wsCadastroClientes = ThisWorkbook.Worksheets(“Clientes”)
    Call HabilitaBotoesAlteracao
    Call carregaDados
    Call DesabilitaControles
    End Sub
    Private Sub carregaDados()
    indiceRegistro = 2
    Call CarregaRegistro
    End Sub
    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.txtAcompanhante.Text = .Cells(indiceRegistro, colAcompanhante).Value
    Me.txtServiço.Text = .Cells(indiceRegistro, colServiço).Value
    Me.txtPeriodo.Text = .Cells(indiceRegistro, colPeriodo).Value
    Me.txtReservaepgtopor.Text = .Cells(indiceRegistro, colReservaepgtopor).Value
    Me.txtEmail.Text = .Cells(indiceRegistro, colEmail).Value
    End If
    End With

    Call AtualizaRegistroAtual
    End Sub
    Private Sub AtualizaRegistroAtual()
    lblRegistro.Caption = indiceRegistro – 1 & ” de ” & wsCadastroClientes.UsedRange.Rows.Count – 1
    ‘lblMensagem.Caption = “”
    End Sub
    Private Sub LimpaControles()
    Me.txtCodigo.Text = “”
    Me.txtNome.Text = “”
    Me.txtAcompanhante.Text = “”
    Me.txtServiço.Text = “”
    Me.txtPeriodo.Text = “”
    Me.txtReservaepgtopor.Text = “”
    Me.txtEmail.Text = “”
    End Sub

    Private Sub HabilitaControles()
    Me.txtNome.Locked = False
    Me.txtAcompanhante.Locked = False
    Me.txtServiço.Locked = False
    Me.txtPeriodo.Locked = False
    Me.txtReservaepgtopor.Locked = False
    Me.txtEmail.Locked = False
    ‘altera a cor dos controles
    Me.txtNome.BackColor = corHabilitaTextBox
    Me.txtAcompanhante.BackColor = corHabilitaTextBox
    Me.txtServiço.BackColor = corHabilitaTextBox
    Me.txtPeriodo.BackColor = corHabilitaTextBox
    Me.txtReservaepgtopor.BackColor = corHabilitaTextBox
    Me.txtEmail.BackColor = corHabilitaTextBox
    End Sub

    Private Sub DesabilitaControles()
    Me.txtNome.Locked = True
    Me.txtAcompanhante.Locked = True
    Me.txtServiço.Locked = True
    Me.txtPeriodo.Locked = True
    Me.txtReservaepgtopor.Locked = True
    Me.txtEmail.Locked = True
    ‘altera a cor dos controles
    Me.txtNome.BackColor = corDesabilitaTextBox
    Me.txtAcompanhante.BackColor = corDesabilitaTextBox
    Me.txtServiço.BackColor = corDesabilitaTextBox
    Me.txtPeriodo.BackColor = corDesabilitaTextBox
    Me.txtReservaepgtopor.BackColor = corDesabilitaTextBox
    Me.txtEmail.BackColor = corDesabilitaTextBox
    End Sub

    Private Sub HabilitaBotoesAlteracao()
    ‘habilita os botões de alteração
    cmdAlterar.Enabled = True
    cmdExcluir.Enabled = True
    cmdNovo.Enabled = True
    cmdOk.Enabled = False
    cmdCancelar.Enabled = False
    End Sub

    Private Sub DesabilitaBotoesAlteracao()
    ‘desabilita os botões de alteração
    cmdAlterar.Enabled = False
    cmdExcluir.Enabled = False
    cmdNovo.Enabled = False
    cmdOk.Enabled = True
    cmdCancelar.Enabled = True
    End Sub
    Private Sub cmdPesquisar_Click()
    frmPesquisarClientes.Show
    End Sub
    Private Function ValidaCamposFormulario() As Boolean

    If Me.txtNome.Value = “” Then
    Me.txtNome.SetFocus
    MsgBox ” ‘Nome’ é um campo obrigatório. “, vbOKOnly, ” Campo Obrigatório ”
    ValidaCamposFormulario = False
    Exit Function
    ElseIf Me.txtAcompanhante.Value = “” Then
    Me.txtAcompanhante.SetFocus
    MsgBox ” ‘Acompanhante’ é um campo obrigatório.”, vbOKOnly, ” Campo Obrigatório ”
    ValidaCamposFormulario = False
    Exit Function
    ElseIf Me.txtServiço.Value = “” Then
    Me.txtServiço.SetFocus
    MsgBox “‘Serviço’ é um campo obrigatório. “, vbOKOnly, ” Campo Obrigatório ”
    ValidaCamposFormulario = False
    Exit Function
    ElseIf Me.txtPeriodo.Value = “” Then
    Me.txtPeriodo.SetFocus
    MsgBox “‘Periodo’ é um campo obrigatório. “, vbOKOnly, ” Campo Obrigatório ”
    ValidaCamposFormulario = False
    Exit Function
    ElseIf Me.txtReservaepgtopor.Value = “” Then
    Me.txtReservaepgtopor.SetFocus
    MsgBox “‘Reservaepgtopor’ é um campo obrigatório.”, vbOKOnly, ” Campo Obrigatório ”
    ValidaCamposFormulario = False
    Exit Function
    ElseIf Me.txtEmail.Value = “” Then
    Me.txtEmail.SetFocus
    MsgBox “‘Email’ é um campo obrigatório.”, vbOKOnly, ” Campo Obrigatório ”
    ValidaCamposFormulario = False
    Exit Function
    End If
    ValidaCamposFormulario = True
    End Function
    Sub limpaMensagem()
    lblMensagem.Caption = “”
    End Sub

  2. Paulo Cesar disse:

    O fórum não está mais funcionando? Estou tentando acessar, mas a página não abre e é exibida a seguinte mensagem:

    “Desculpe, mas o acesso a esta área do site foi negado.

    Se o problema persistir, contate o desenvolvedor do site.
    Hospedado por KingHost
    Crie sua página ou hospede seu site conosco – kinghost.com.br”

  3. Estou com uma dificildade.
    tenho um forme cadastro que gera uma id para cada cadastro e ao excluir a id e excluida junto a linha.
    ao realizar um novo cadastro é usado o numero da ultima linha.
    gostaria de cadastrar o numero que esta faltando na seguencia.
    como fazer isso?

    • Marcos Rieper disse:

      Olá Carlos,

      Na verdade, uma vez excluído um código você não deve reutilizá-lo, por conta de uma regra de integridade do banco, pois pense assim, o cliente excluído pode ter notas fiscais emitidas e estarem em outra lista.

      Assim o novo cliente acabará vinculado a estas notas que não são dele, caso reutilize o código.

  4. william lages disse:

    Ola! o que significa os parametros entre parentes numa : sub (atual, max) ….and sub? o que siginifica atual e max?

  5. william lages disse:

    digo: end sub

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Inscreva-se no nosso canal do Youtube!


Junte-se ao nosso canal do Youtube. Começamos em abril de 2016, mas já temos mais de 06:00 h de treinamentos gratuitos e este número irá aumentar. Vídeos novos todos os sábados.