Aprenda como descompactar arquivos zip com VBA

Olá Amigos,

Hoje vou postar um artigo para quem já possui um pouco de conhecimento em programação em VBA, neste arquivo trabalharemos com a extração de um arquivo que esteja compactado no formato “zip” para uma pasta específica.

Para você que não possui conhecimentos em programação não se assuste, pois também recomendo a leitura, tentarei abordar o assunto da maneira mais simples o possível para que assim você que está dando os primeiros passos possa entender o que é passado e evoluir conforme o seu ciclo e curva de aprendizado.

Aprenda como descompactar arquivos zip com VBA

Aprenda como descompactar arquivos zip com VBA

Neste artigo trabalharemos com objetos para manipulação do arquivos, variáveis e a criação de uma pasta via VBA, abaixo você tem o código comentado e um exemplo para Download.

Decidi criar esta rotina quando passei a atuar com mais forte com a otimização de rotinas de extração de dados de arquivos compactados no formato “ZIP” onde atuo, na empresa onde trabalho temos uma rotina que roda sempre por volta das 03hs da manhã via Robot, gerando assim alguns arquivos compactados que geralmente eram descompactados manualmente, este artigo também me chamou a atenção pois existe muita coisa na WEB porém poucos artigos bons e destes nem todos com explicações que fizessem com que atingisse meu objetivo.

Com esta rotina este trabalho deixou de ser realizado manualmente e deixou de depender de uma pessoa, isso gerou ganho de tempo, performance diferenciada, redução para 0 do índice de erros por motivos humanos.

Como dica digo que a otimização de processos e investir na inteligência da operação seja qual for o seu segmento é o melhor negócio.

Assim como eu, você também deve achar desnecessário e muito cansativo ficar descompactando arquivos manualmente, a partir daí espero que você possa aprender algo com o código abaixo e assim acabar com o problema de descompactar aquivos no formato zip via vba.

Abaixo temos o código que irá descompactar arquivos ZIP com VBA, abra o Microsoft Excel, aperte as teclas Alt + 11 (Aperte uma, solte e depois aperte a outra) você verá o Editor de códigos do VBA, insira um novo módulo e cole o código abaixo, não esqueça de alterar o caminho das variáveis do código:

Sub Unzip1()

Dim oApp As Object ‘Objeto application
Dim Arquivo As Variant
Dim NovaPasta As Variant
Dim Caminho As String
Dim strDate As String

Arquivo = “C:\Douglas_Godoy\VBA\erros_2012.zip”
Caminho = “C:\Douglas_Godoy\VBA\”

strDate = Format(Now, ” dd-mm-yy h-mm-ss”)
NovaPasta = Caminho & “Nome da Pasta” & strDate & “\”

‘Cria um nova pasta chamada Solicit dd-mm-yyyy
MkDir NovaPasta

‘Extrai os arquivos para a pasta criada
Set oApp = CreateObject(“Shell.Application”)
oApp.Namespace(NovaPasta).CopyHere oApp.Namespace(Arquivo).items

End Sub

Pontos Importantes:

Temos as variáveis: Arquivo, Caminho, strDate e NovaPasta.

Arquivo: substitua com o caminho completo de onde está o arquivo “.zip” que você deseja descompactar conforme a linha 10.

Caminho: você deve colocar o caminho onde deseja que o arquivo seja descompactado, no exemplo colocamos a mesma pasta, porém você pode alterar o endereço para que assim ele descompacte o arquivo via vba na pasta que você desejar.

Atenção:  Coloque sempre barra ao contrário (” \ “) no final do caminho, desta forma não haverá problemas para a criação de pastas e prosseguimento da rotina.

strDate: esta variável existe pois ao extrair o arquivo é criada uma pasta dentro do caminho, e esta pasta irá conter o nome que determinarmos na variável NovaPasta e a data de hora na qual a rotina foi executada.

Para encontrar a data atual com formatos personalizados você pode utilizar:

strDate = Format(Now, ” dd-mm-yy h-mm-ss”)

Para trazer Dia, Mês, Ano, Hora, Minuto e Segundo.

strDate = Format(Now, ” dd-mm-yy”)

Para trazer Dia, Mês, Ano.

NovaPasta: Esta variável é composta pelo caminho já declarado anteriormente na variável “caminho” e pela variável “strDate”, formando assim o caminho completo mais o nome da nova pasta a ser criada concatenando as duas variáveis.

Para se criar uma pasta com VBA utilizamos o comando MkDir, semelhante a como fazemos no MSDOS. Após utilizarmos MkDir devemos inserir o caminho completo mais o nome da pasta a ser criada.

Verifique como criar uma pasta via VBA conforme exemplo abaixo, em outro artigo abordarei este assunto de forma mais completa.

Sub Criar_Pasta()

Dim NovaPasta As String

NovaPasta = “C:\Teste”

MkDir NovaPasta

End Sub

Com este arquivo espero que sua dúvidas sejam sanadas e que você tenha pelo menos um norte para iniciar seus trabalhos no que refere-se a descompactar arquivos zip com VBA.

Agradeço pela leitura e fico no aguardo de seus comentários e sugestões.

Um abraço. DG




.

Sobre o Autor

Comentários bacanas...

  1. Marcos Lacerda

    Olá, por acaso eu conseguiria fazer o contrário? No caso eu quero compactar pastas para poder enviá-las por email.

  2. Israel

    O código do Ricardo, além da variável caminho ter sido definida como string, como constatado pelo Douglas, foi digitado com apenas um p no shell.application.

  3. Pingback: Atualizar importação salva no access através do excel com vba - Douglas GodoyDouglas Godoy

  4. Milton Miguel

    Caro Douglas, estou extraindo um arquivo todos os dias mas ele possui senha padrão. Como faço para inserir a senha de forma automática.

  5. Ricardo

    Douglas, obrigado! Funcionou!
    Troquei pro variant e também percebi que o application estava com apenas um “p” no meu código anterior.

    1. Douglas Godoy Resposta do Autor

      Luciano, Bom dia.

      Respondendo a sua dúvida é possível sim descompactar os arquivos e “sobrescrever”.

      O solução que tenho é fazer uma verificação se o arquivo descompactado já existe, ele faz o check se caso o arquivo que está sendo descompactado já existir na pasta ele apaga o arquivo anterior e descompacta o arquivo novo, caso não existe nenhum arquivo com o mesmo nome na pasta ele descompacta direto.

      Segue código:

      Sub Unzip1()

      Dim oApp As Object
      Dim strZip, Caminho, Arquivo, strCheck, strPath As Variant

      ‘Arquivo descompactado que será substituído
      Arquivo = “C:\Users\PC\Documents\abc.txt”
      ‘Arquivo compactado
      strZip = “C:\Users\PC\Documents\abc.zip”
      ‘Pasta na qual o arquivo será descompactado
      Caminho = “C:\Users\PC\Documents\”

      If Dir(Arquivo) = vbNullString Then
      strCheck = False
      Else
      strCheck = True
      End If

      If strCheck Then

      strPath = “C:\Users\PC\Documents\abc.txt”
      Kill strPath

      Set oApp = CreateObject(“Shell.Application”)
      oApp.Namespace(Caminho).CopyHere oApp.Namespace(strZip).items

      Else
      Set oApp = CreateObject(“Shell.Application”)
      oApp.Namespace(Caminho).CopyHere oApp.Namespace(strZip).items
      End If

      End Sub

  6. Ricardo

    Amigo, Tentei um código similar e deu o erro erro 429. O componente ActiveX não pode criar objeto. O erro ocorre na linha do Shell
    Tem idéia o que possa ser?

    Meu código foi abaixo. Não usei MkDir pq a pasta já existe
    Sub unzip()
    Dim oApp As Object
    Dim arquivo As Variant
    Dim NovaPasra As Variant
    Dim caminho As String

    arquivo = “D:\Dropbox\Estudo\Desenvolvimento\Simpa\Anexos_Gerador_v1.1.zip”
    caminho = “D:\Dropbox\Estudo\Desenvolvimento\Simpa\”

    Set oApp = CreateObject(“Shell.Aplication”)
    oApp.Namespace(caminho).Copyhere oApp.Namespace(arquivo)
    End Sub

    1. Douglas Godoy Resposta do Autor

      Olá Ricardo,

      Muito obrigado pelo comentário.
      Este erro se dá devido a variável caminho estar como string, altere para variant que conseguirá extrair o arquivo sem ter de usar o Mkdir.

      Sub Descompactar()

      Dim oApp As Object
      Dim Arquivo As Variant
      Dim Caminho As Variant

      Arquivo = “W:\Users\douglas.godoy\Documents\teste.zip”
      Caminho = “W:\Users\douglas.godoy\Documents\”

      Set oApp = CreateObject(“Shell.Application”)
      oApp.Namespace(Caminho).CopyHere oApp.Namespace(Arquivo).items

      End Sub

      Um abraço!!!

      Douglas Godoy

Deixe um comentário

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