sábado, 24 de maio de 2014

1. MANIPULANDO ARQUIVOS COM O VBA - INTERMEDIÁRIO

1. MANIPULANDO ARQUIVOS COM O VBA
            
          My friends, vamos tratar de um assunto que é, digamos, “importantibilissimo” para profissional que deseja trabalhar com a programação VBA.
            Não serão poucas as vezes que você precisará varrer diretórios à procura de arquivos que precisam ser abertos ou pelo menos catalogados.
            Se ficou difícil entender, deixa eu dar um exemplo: Imagine que você precise criar um código para o José Firmino, que é um gerente de filiais de uma grande empresa. Imagine que ele receba todos os meses, arquivos de relatório de vendas de todas as filiais, que são 200, eu disse 200. Receber 2 ou 3 arquivos e abri-los para ver o resultado seria mole, não sendo necessário confeccionar um código VBA para isto. Mas agora, 200, a história é outra.
            Sendo assim, vamos criar o procedimento que abrirá os arquivos no diretório que você salvou e capturará os totais das filiais mais rápido que imediatamente. Então, prestenção!

Crie uma planilha com esta e nomeie “Vendas Filiais”



            Você precisará ainda, de arquivos no diretório que criamos para que os mesmos sejam abertos.



No meu caso, fiz 5 arquivos que ficaram com este conteúdo.


            Inseri os valores em cada arquivo de 1000 a 5000, sempre na célula B3.
            Agora vamos usar o código abaixo para abrirmos os arquivos e capturar o total de vendas de cada filial.
Sub TotalFiliais()
     Dim NomArq                                          'declaramos a variável
'Usamos o "Dir" para identificar no diretório os arquivos que queremos abrir.
'Perceba que usei um "*.xlsx". Aqui, estou querendo dizer que não nos interessa o que vem antes da extensão.
'logo, vamos abrir apenas os arquivos com extensão xlsx. Obviamente, faço isto porque os nomes dos arquivos
'são diferentes, porém, a extensão é a mesma.
NomArq = Dir(CamPad & "*.xlsx")
Do While NomArq <> ""                               'agora percorremos todos os arquivos no diretório à procura do que nos interessa
    Workbooks.Open CamPad & NomArq                  'se acharmos, vamos abri-lo.
   
    'Após abri-lo, precisamos pegar a informação que queremos e tranferí-la para o nosso relatório.
    Lin = ThisWorkbook.Sheets("Vendas Filiais").Cells(Rows.Count, 1).End(xlUp).Row + 1 'capturamos a última linha não preenchida
   
    With ThisWorkbook.Sheets("Vendas Filiais")
        .Cells(Lin, 1) = ActiveWorkbook.Path        'capturamos o diretório do arquivo
        .Cells(Lin, 2) = ActiveWorkbook.FullName    'capturamos o endereço completo
        .Cells(Lin, 3) = ActiveWorkbook.Name        'capturamos o nome do arquivo
        .Cells(Lin, 4) = ActiveWorkbook.ActiveSheet.Range("B2") 'e finalmente, o valor
       
        'criamos aqui um Hyperlink para facilitar os nossos futuros acessos às pastas e os arquivos.
        .Hyperlinks.Add Anchor:=Cells(Lin, "A"), Address:=Cells(Lin, "A")
        .Hyperlinks.Add Anchor:=Cells(Lin, "B"), Address:=Cells(Lin, "B")
   
    End With
   
    Workbooks(NomArq).Close                     'fechamos o arquivo, pois já pegamos a informação que queríamos
   
    NomArq = Dir            'chamamos o próximo arquivo
Loop
End Sub

            Para facilitar a compreensão do código, coloquei o mesmo em vermelho e os comentários em verde.
            Uma observação que jugo importante, refere-se ao Hyperlink que criamos nas coluna “A” e “B”. E para que fizemos isto? Pense! Se já rodamos a macro, por que não pegarmos o endereço do diretório onde o arquivo está para abrirmos os arquivos de forma bem simples e rápida.
            Após rodarmos o código, o resultado será este.


            Muito tranquilo, não?! Nos vemos na próxima lição!


Para acessar o curso completo Clique aqui 

CURSO INTERMEDIÁRIO - Programação VBA

CURSO INTERMEDIÁRIO - Programação VBA

boa tarde Pessoal!
Esforcei-me em tentar passar para você, com todos os temas abordados no curso que agora chamo de “Básico”, uma noção do que o VBA pode fazer.
            Para você que é iniciante e dá os primeiros passos no aprendizado da linguagem, acredito que deve ter achado útil tudo o que estudamos até agora.
            Vamos ampliar os horizontes? Abordar temas mais complexos para que você possa criar soluções mais profissionais e inteligentes?
            Sendo assim, começaremos uma nova etapa, com um curso que chamarei de intermediário, onde veremos tudo que aprendemos em aplicações mais úteis e que poderão norteá-lo na criação de soluções dos problemas cotidianos que todo programador VBA enfrenta. Então, como sempre! “Mãos à obra”!!!

            Te vejo logo na 1ª postagem dessa nova fase para viajarmos juntos pelo mundo da fantástica programação VBA! Viva as Macros!!!

14. EXCLUÍNDO DADOS ATRAVÉS DO FORMULÁRIO

14. EXCLUINDO DADOS ATRAVÉS DO FORMULÁRIO

            Já inserimos dados, alteramos os mesmos, fizemos a validação do número do CPF e outras coisas através do nosso formulário. Eis a pergunta. E se precisarmos excluir os dados que foram inseridos? Boa pergunta, muito boa mesmo.
            Não esquenta, vamos fazer isto num piscar de olhos. Então, prestenção!
            Primeiro insira um novo botão no formulário.

            

           
O código para excluir uma linha através do VBA é super simples. A grande sacada é saber qual é a linha que deve ser excluída. Para isto, vamos usar o índice da combobox para identificarmos na planilha qual a linha que vai ser excluída.
Vamos dizer que linha que queremos é Lin = PreencheListBox.ListBox1.ListIndex + 2. Com este código, localizaremos a linha exata que queremos excluir. Você pode estar se perguntando porque “+2”. Isto ocorre porque a listbox tem começa com o índice 0 e assim, precisamos contar as linhas à partir daí. Como temos uma linha de cabeçalho, então o índice da linha que procuramos será acrescido de 2.
Agora insira este código dentro do botão excluir que criamos.

Private Sub Cb_Excluir_Click()
   
Resp = MsgBox("Deseja excluir este registro?", vbYesNo + vbQuestion, "EXCLUSÃO DE REGISTRO")  
If Resp = vbNo Then Exit Sub
Lin = PreencheListBox.ListBox1.ListIndex + 2
 ActiveSheet.Rows(Lin).EntireRow.Delete
End Sub

Perceba que não fiz comentários dentro do código por ser muito simples e facilmente interpretado por você que acompanha o nosso curso. Para fazer o teste, selecione algum registro e clique em excluir.
Uma mensagem de confirmação será exibida, dando a opção de excluir ou não o registo. Facim demais sô!

Para acessar o curso completo Clique aqui 

domingo, 11 de maio de 2014

13. VALIDANDO DADOS


13. VALIDANDO DADOS

            Este assunto é extremamente amplo, as necessidades são muitas e você pode usar a criatividade para validar praticamente qualquer coisa.

            No nosso caso, vamos aproveitar o formulário que estamos criando e incrementá-lo para fazer a validação do CPF. Insira este novo campo.



Já fizemos este código no item 10.3 do nosso curso,  agora vamos apenas adapta-lo ao nosso formulário. Very Easy!!!



Private Sub Cb_Salvar_Click()

    Success = CPF(Replace(Replace(Txt_CPF, ".", ""), "-", ""))  'uso Sucess porque a função precisa retornar algum valor

    'o Replace é usado é usado para tirar o ponto e o hífem

    If Success = "Invalido" Then: Exit Sub          'se não for um CPF válido, sai da rotina

Salva_Reg

    Limpa_Reg

End Sub


Observe que em vermelho, fizemos uma chamada para a função CPF, que está abaixo:

            Agora, veja a função. Observe que tá tudo explicadinho nos mínimos detalhas. Mas se houver alguma dúvida, você pode consultar o item 10.3.

Function CPF(NUMEROCPF As String) As String 'EXCELECIA.BLOGSPOT.COM

    'Declaramos as variáveis S1 e S2 para receberem a soma. A variável QD, ficará com o número de digitos do CPF. A variável I será o contador.

    'A variável D, receberá o DV calculado. As variáveis R1 e R2, receberão o resto das divisões. Finalmente, DV1 e DV2, receberão os dígitos calculados.

    Dim S1, S2, QD, I, D As Integer

    Dim R1, R2 As Integer

    Dim DV1, DV2 As Integer '

    SOMA1 = 0 'Inicializamos as somas como zero.

    SOMA2 = 0

    QD = 11 'A quantidade de digitos de um CPF é 11.

    'Criamos um LOOP que será executado 11 vezes

    For I = 1 To 11 Step 1

        'D absorverá cada digito do CPF. A cada giro do loop, ele será um número diferente, sendo um de cada vez

        D = Val(Mid$(NUMEROCPF, I, 1))

        'Para calcularmos o 1º DV, precisamos vazer o calculo como explicado no capítulo. Repare que as duas somas são realizadas de uma só vez.

        If I <= 9 Then

            S1 = S1 + D * (QD - 1)

        End If

        If I <= 10 Then

            S2 = S2 + D * QD

        End If

        'Precisamos decrementar esta variável para que os números possam decrescer.

        QD = QD - 1

    Next

    'Agora é só descobrir o resto da divisão para usarmos a regra e encontrar os DVs.

    R1 = S1 Mod 11

    If (R1 <= 1) Then

        DV1 = 0

    Else

        DV1 = 11 - R1

    End If

        R2 = S2 Mod 11

    If (R2 <= 1) Then

        DV2 = 0

    Else

        DV2 = 11 - R2

    End If

    'Se tanto o DV1, com o DV2 forem diferentes do digito 10 e 11 respectivamente do CPF analisado,o mesmo será invalido, do contrário, válido! Pronto,está feito.

    If (DV1 <> Val(Mid$(NUMEROCPF, 10, 1))) Or (DV2 <> Val(Mid$(NUMEROCPF, 11, 1))) Then

        CPF = "Invalido"

    Else

        CPF = "Valido"

    End If

   

    If CPF = "Invalido" Then

        MsgBox "Este não é um CPF válido", vbOKOnly + vbCritical, "CPF INVÁLIDO"

        'Txt_CPF = ""

        Txt_CPF.SetFocus

       

    End If

End Function

Após o usuário digitar o número do CPF e clicar em salvar, a função verificará se trata-se de um CPF válido. Caso positivo, a informação será salva, do contrário, uma mensagem será exibida, exigindo a digitação de um número válido. Fácil demais.

Até o próximo capítulo.

Para acessar o curso completo Clique aqui

domingo, 4 de maio de 2014

12.2. Salvando e alterando dados através do formulário


12.2. Salvando e alterando dados através do formulário

            No capítulo 8, vimos como inserir dados em uma planilha através do formulário de forma bem simples. Porém, naquela oportunidade, vimos apenas como inserir registros linha a linha, sem a possibilidade de alterá-los.

            Pensa direitinho my friend. E precisarmos alterar as informações que já cadastramos?

            Vamos aprender então, além de salvar, alterar os dados que já foram inseridos na planilha.

            Para facilitar a compreensão, daremos sequência ao formulário que estamos construindo, acrescentando um botão, que chamaremos Cb_Salvar.

 


            Criaremos as rotinas chamadas Salva_Reg e Limpa_Reg respectivamente. Esta segunda, será para limpar os controles e permitir uma nova digitação.

 

Function Salva_Reg()

    Dim ShtFunc                                     'declara a variável da planilha

      

    Set ShtFunc = Sheets("Plan4")                   'seta a planilha que será utilizada

    'captura a última linha usada da plna e incrementa mais uma para colar o registro na imediatamente vazia

    If ComboBox1.ListIndex = -1 Then                'se não houver item selecionado

        UltLin = ShtFunc.Cells(Rows.Count, 1).End(xlUp).Row + 1 'defina a linha da planilha onde o registro será inserido

    Else                                            'se já houver um item selecionado, precisamos apenas atualizar o registro

        UltLin = ComboBox1.ListIndex + 2

    End If

    With ShtFunc                                    'insere dos dados na planilhas

        ShtFunc.Cells(UltLin, 1) = Txt_Nome

        ShtFunc.Cells(UltLin, 2) = Txt_Sal

        ShtFunc.Cells(UltLin, 3) = Txt_Cargo

    End With
 
End Function

Após inserirmos os dados, vamos automatizar uma rotina para limpar os campos para que possamos inserir novos dados. Veja a rotina abaixo(Moleza!).

Function Limpa_Reg()

    With PreencheListBox                            'considerando os controles do nosso formulário

        Txt_Nome = ""                               'vamos limpa-los

        Txt_Sal = ""

        Txt_Cargo = ""

        Txt_Nome.SetFocus                           'e trazer o foco para o 1º campo a ser digitado

    End With

End Function

            Finalmente, vamos chamar as rotinas através do botão Salvar

Private Sub Cb_Salvar_Click()

    Salva_Reg

    Limpa_Reg

End Sub

 

            É só fazer os testes, perceba que se você selecionar algum nome na ListBox ou ComboBox, ele será alterado quando o botão Salvar for clicado, do contrário, será inserido um novo registro.


Para acessar o curso completo Clique aqui