none
Erro no VBA com Next sem For RRS feed

  • Pergunta

  • Boa tarde!

    Estou tentando adaptar deste processo abaixo para envio de Malling de alguns relatórios.

    Este envio é feito por uma lista de clientes que são de uma tabela com 4 colunas, e quando chega na etapa:
    'Próximo Cliente
    Next i


    Da a mensagem que o NEXT está sem FOR porém o For está declarado:
    'Iniciar
    For i = 2 To WorksheetFunction.CountA(Sheets("clientes").Columns("a:a"))

    Eu já não sei mais o que fazer, será que algum de vocês conseguiria me ajudar?

    Atenciosamente,


    Abaixo segue o código completo

    Private Sub Enviar_Click()
    'Mensagem do email
    mensagem_padrão = "Bom Dia!"

    'Não mostrar movimentações da tela
    Application.ScreenUpdating = False

    'Iniciar
    For i = 2 To WorksheetFunction.CountA(Sheets("clientes").Columns("a:a"))


    'Variáveis de armazenamento das informações
    nome_cliente = UCase(Sheets("clientes").Range("a" & i).Value)
    email_cliente = Sheets("clientes").Range("b" & i).Value
    nivel_cliente = Sheets("clientes").Range("c" & i).Value
    código_desconto = Sheets("clientes").Range("d" & i).Value
    saudacao_mensagem = "Olá, " & nome_cliente & Chr(10)

    'Mostrar status da operação para o usuário
    Application.StatusBar = "Enviando email para " & nome_cliente & "..."

    'Deixar ativa a aba 'email'
    Sheets("email").Select


    'Condição se cliente é de nível A
    If nivel_cliente = "A" Then
    Sheets("email").Range("C4").Value = saudacao_mensagem & mensagem_padrão
    Sheets("email").Range("B7").Value = "Para melhor analise e utilização dos filtros: " & código_desconto
    Sheets("email").Range("A1:M110").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    ASSUNTO = "Painel - "
    'Condição se cliente é de nível B
    ElseIf nivel_cliente = "B" Then
    Sheets("email").Range("C118").Value = saudacao_mensagem & mensagem_padrão
    Sheets("email").Range("B121").Value = "Para melhor analise e utilização dos filtros: " & código_desconto
    Sheets("email").Range("A115:M190").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    ASSUNTO = "Painel - "
    'Condição se cliente é de nível C
    ElseIf nivel_cliente = "C" Then
    Sheets("email").Range("C198").Value = saudacao_mensagem & mensagem_padrão
    Sheets("email").Range("B201").Value = "Para melhor analise e utilização dos filtros: " & código_desconto
    Sheets("email").Range("A195:M219").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    ASSUNTO = "Painel - "
    'Condição se cliente é de nível D
    If nivel_cliente = "D" Then
    Sheets("email").Range("C227").Value = saudacao_mensagem & mensagem_padrão
    Sheets("email").Range("B230").Value = "Para melhor analise e utilização dos filtros: " & código_desconto
    Sheets("email").Range("A225:M251").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    ASSUNTO = "Painel - "
    'Condição se cliente é de nível E
    ElseIf nivel_cliente = "E" Then
    Sheets("email").Range("C255").Value = saudacao_mensagem & mensagem_padrão
    Sheets("email").Range("B258").Value = "Para melhor analise e utilização dos filtros: " & código_desconto
    Sheets("email").Range("A255:M279").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    ASSUNTO = "Painel - "
    'Condição se cliente é de nível F
    ElseIf nivel_cliente = "F" Then
    Sheets("email").Range("C285").Value = saudacao_mensagem & mensagem_padrão
    Sheets("email").Range("B288").Value = "Para melhor analise e utilização dos filtros: " & código_desconto
    Sheets("email").Range("A285:M309").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    ASSUNTO = "Painel - "
    End If


    'Mostrar página de email
    ActiveWorkbook.EnvelopeVisible = True
    'Iniciar envio
    With Sheets("email").MailEnvelope
    'Endereço do cliente
    .Item.To = email_cliente
    'Assunto do email
    .Item.Subject = ASSUNTO
    'Enviar
    .Item.Send
    End With


    'Próximo Cliente
    Next i

    'Limpar status de informação
    Application.StatusBar = ""

    'Ativar a aba enviar
    Sheets("enviar").Select

    'Mostrar movimentos da tela
    Application.ScreenUpdating = True
    'Mensagem final
    MsgBox "Mensagens enviadas com sucesso!", vbInformation, "Ok"
    End Sub
    quinta-feira, 27 de agosto de 2015 15:44

Respostas

  • Ao inserir um código no fórum, utilize blocos de código. Para utilizar essa ferramenta, clique no botão cuja legenda é “Inserir bloco de código” na barra do editor de mensagens do fórum. Uma janela aparecerá onde você deverá colar seu código cru na caixa de texto à esquerda. Então, selecione a opção Vb.Net na caixa de combinação que você verá em cima à esquerda e depois clique no botão Inserir.

    ---

    Como o André disse, é isso mesmo, você esqueceu de fechar um If.

    De qualquer forma, você pode melhorar seu código. Declare todas suas variáveis e utilize a cláusula If onde puder poupar código:

    Private Sub Enviar_Click()
        Dim NomeCliente As String
        Dim MensagemPadrão As String
        Dim EmailCliente As String
        Dim CodigoDesconto As String
        Dim NívelCliente As String
        Dim SaudaçãoMensagem As String
        Dim Assunto As String
        Dim i As Long
        Dim wsClientes As Worksheet
        
        'Mensagem do email
        MensagemPadrão = "Bom Dia!"
        
        'Não mostrar movimentações da tela
        Application.ScreenUpdating = False
        
        Set wsClientes = ThisWorkbook.Worksheets("clientes")
        With ThisWorkbook.Sheets("email")
            'Iniciar
            For i = 2 To WorksheetFunction.CountA(wsClientes.Columns("a:a"))
                'Variáveis de armazenamento das informações
                NomeCliente = UCase(wsClientes.Cells(i, "A"))
                EmailCliente = wsClientes.Cells(i, "B")
                NívelCliente = wsClientes.Cells(i, "C")
                CodigoDesconto = wsClientes.Cells(i, "D")
                SaudaçãoMensagem = "Olá, " & NomeCliente & vbNewLine
                
                'Mostrar status da operação para o usuário
                Application.StatusBar = "Enviando email para " & NomeCliente & "..."
            
                'Deixar ativa a aba 'email'
                .Select
                .Activate
                
                'Condição se cliente é de nível A
                If NívelCliente = "A" Then
                    .Range("C4") = SaudaçãoMensagem & MensagemPadrão
                    .Range("B7") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                    .Range("A1:M110").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                    Assunto = "Painel - "
                    'Condição se cliente é de nível B
                ElseIf NívelCliente = "B" Then
                    .Range("C118") = SaudaçãoMensagem & MensagemPadrão
                    .Range("B121") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                    .Range("A115:M190").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                    Assunto = "Painel - "
                    'Condição se cliente é de nível C
                ElseIf NívelCliente = "C" Then
                    .Range("C198") = SaudaçãoMensagem & MensagemPadrão
                    .Range("B201") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                    .Range("A195:M219").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                    Assunto = "Painel - "
                    'Condição se cliente é de nível D
                    If NívelCliente = "D" Then
                        .Range("C227") = SaudaçãoMensagem & MensagemPadrão
                        .Range("B230") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                        .Range("A225:M251").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                        Assunto = "Painel - "
                        'Condição se cliente é de nível E
                    ElseIf NívelCliente = "E" Then
                        .Range("C255") = SaudaçãoMensagem & MensagemPadrão
                        .Range("B258") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                        .Range("A255:M279").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                        Assunto = "Painel - "
                        'Condição se cliente é de nível F
                    ElseIf NívelCliente = "F" Then
                        .Range("C285") = SaudaçãoMensagem & MensagemPadrão
                        .Range("B288") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                        .Range("A285:M309").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                        Assunto = "Painel - "
                    End If
                    
                    'Mostrar página de email
                    ThisWorkbook.EnvelopeVisible = True
                    'Iniciar envio
                    With .MailEnvelope
                        'Endereço do cliente
                        .Item.To = EmailCliente
                        'Assunto do email
                        .Item.Subject = Assunto
                        'Enviar
                        .Item.send
                    End With
                    
                End If
                'Próximo Cliente
            Next i
        End With
        
        'Limpar status de informação
        Application.StatusBar = ""
        
        'Ativar a aba enviar
        Sheets("enviar").Select
        
        'Mostrar movimentos da tela
        Application.ScreenUpdating = True
        'Mensagem final
        MsgBox "Mensagens enviadas com sucesso!", vbInformation, "Ok"
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br



    quinta-feira, 27 de agosto de 2015 18:40
    Moderador
  • Elizeu, 

    Você abriu dois IFs mas só fechou um.

    Passe o olho no código e conte quantos IFs tem.. para cada um deles deve ter um END IF

    Abraço

    quinta-feira, 27 de agosto de 2015 16:11

Todas as Respostas

  • Elizeu, 

    Você abriu dois IFs mas só fechou um.

    Passe o olho no código e conte quantos IFs tem.. para cada um deles deve ter um END IF

    Abraço

    quinta-feira, 27 de agosto de 2015 16:11
  • Ao inserir um código no fórum, utilize blocos de código. Para utilizar essa ferramenta, clique no botão cuja legenda é “Inserir bloco de código” na barra do editor de mensagens do fórum. Uma janela aparecerá onde você deverá colar seu código cru na caixa de texto à esquerda. Então, selecione a opção Vb.Net na caixa de combinação que você verá em cima à esquerda e depois clique no botão Inserir.

    ---

    Como o André disse, é isso mesmo, você esqueceu de fechar um If.

    De qualquer forma, você pode melhorar seu código. Declare todas suas variáveis e utilize a cláusula If onde puder poupar código:

    Private Sub Enviar_Click()
        Dim NomeCliente As String
        Dim MensagemPadrão As String
        Dim EmailCliente As String
        Dim CodigoDesconto As String
        Dim NívelCliente As String
        Dim SaudaçãoMensagem As String
        Dim Assunto As String
        Dim i As Long
        Dim wsClientes As Worksheet
        
        'Mensagem do email
        MensagemPadrão = "Bom Dia!"
        
        'Não mostrar movimentações da tela
        Application.ScreenUpdating = False
        
        Set wsClientes = ThisWorkbook.Worksheets("clientes")
        With ThisWorkbook.Sheets("email")
            'Iniciar
            For i = 2 To WorksheetFunction.CountA(wsClientes.Columns("a:a"))
                'Variáveis de armazenamento das informações
                NomeCliente = UCase(wsClientes.Cells(i, "A"))
                EmailCliente = wsClientes.Cells(i, "B")
                NívelCliente = wsClientes.Cells(i, "C")
                CodigoDesconto = wsClientes.Cells(i, "D")
                SaudaçãoMensagem = "Olá, " & NomeCliente & vbNewLine
                
                'Mostrar status da operação para o usuário
                Application.StatusBar = "Enviando email para " & NomeCliente & "..."
            
                'Deixar ativa a aba 'email'
                .Select
                .Activate
                
                'Condição se cliente é de nível A
                If NívelCliente = "A" Then
                    .Range("C4") = SaudaçãoMensagem & MensagemPadrão
                    .Range("B7") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                    .Range("A1:M110").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                    Assunto = "Painel - "
                    'Condição se cliente é de nível B
                ElseIf NívelCliente = "B" Then
                    .Range("C118") = SaudaçãoMensagem & MensagemPadrão
                    .Range("B121") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                    .Range("A115:M190").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                    Assunto = "Painel - "
                    'Condição se cliente é de nível C
                ElseIf NívelCliente = "C" Then
                    .Range("C198") = SaudaçãoMensagem & MensagemPadrão
                    .Range("B201") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                    .Range("A195:M219").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                    Assunto = "Painel - "
                    'Condição se cliente é de nível D
                    If NívelCliente = "D" Then
                        .Range("C227") = SaudaçãoMensagem & MensagemPadrão
                        .Range("B230") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                        .Range("A225:M251").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                        Assunto = "Painel - "
                        'Condição se cliente é de nível E
                    ElseIf NívelCliente = "E" Then
                        .Range("C255") = SaudaçãoMensagem & MensagemPadrão
                        .Range("B258") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                        .Range("A255:M279").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                        Assunto = "Painel - "
                        'Condição se cliente é de nível F
                    ElseIf NívelCliente = "F" Then
                        .Range("C285") = SaudaçãoMensagem & MensagemPadrão
                        .Range("B288") = "Para melhor analise e utilização dos filtros: " & CodigoDesconto
                        .Range("A285:M309").CopyPicture Appearance:=xlScreen, Format:=xlPicture
                        Assunto = "Painel - "
                    End If
                    
                    'Mostrar página de email
                    ThisWorkbook.EnvelopeVisible = True
                    'Iniciar envio
                    With .MailEnvelope
                        'Endereço do cliente
                        .Item.To = EmailCliente
                        'Assunto do email
                        .Item.Subject = Assunto
                        'Enviar
                        .Item.send
                    End With
                    
                End If
                'Próximo Cliente
            Next i
        End With
        
        'Limpar status de informação
        Application.StatusBar = ""
        
        'Ativar a aba enviar
        Sheets("enviar").Select
        
        'Mostrar movimentos da tela
        Application.ScreenUpdating = True
        'Mensagem final
        MsgBox "Mensagens enviadas com sucesso!", vbInformation, "Ok"
    End Sub


    Felipe Costa Gualberto - http://www.ambienteoffice.com.br



    quinta-feira, 27 de agosto de 2015 18:40
    Moderador