Bom dia planilheiros,
Tenho uma demanda em que preciso zipar 3 mil arquivos xml. Encontrei um código na internet que resolve meu problema, porém o desempenho é um pouco sofrível, levando quase 1 hora para criar um zip com os 3 mil arquivos xml.
Pelo que entendi do código ele é principalmente prejudicado por ésta linha
Application.Wait (Now + TimeValue("0:00:01"))
Mas nos meus testes, tentar diminuir o tempo de espera resultou em mensagens de erro, esse 1 segundo de espera é provavelmente necessário para manter o arquivo zip aberto.
Se tiverem sugestões, ou exemplos de código que utilizem a solução de zip do windows eu agradeço.
Segue o código abaixo.
Sub Zip_File_Or_Files()
Dim strDate As String, DefPath As String, sFName As String
Dim oApp As Object, iCtr As Long, I As Integer
Dim FName, vArr, FileNameZip
Excel.Application.DisplayAlerts = False
DefPath = Application.DefaultFilePath
If Right(DefPath, 1) <> "" Then
DefPath = DefPath & ""
End If
strDate = Format(Now, " dd-mmm-yy h-mm-ss")
FileNameZip = DefPath & "MyFilesZip " & strDate & ".zip"
'Browse to the file(s), use the Ctrl key to select more files
FName = Application.GetOpenFilename(filefilter:="Arquivos XML (*.xml*), *.xml*", _ ' trocar para exibir outros tipos de arquivo
MultiSelect:=True, Title:="Select the files you want to zip")
If IsArray(FName) = False Then
'do nothing
Else
'Create empty Zip File
NewZip (FileNameZip)
Set oApp = CreateObject("Shell.Application")
I = 0
For iCtr = LBound(FName) To UBound(FName)
vArr = Split97(FName(iCtr), "")
sFName = vArr(UBound(vArr))
If bIsBookOpen(sFName) Then
MsgBox "You can't zip a file that is open!" & vbLf & _
"Please close it and try again: " & FName(iCtr)
Else
'Copy the file to the compressed folder
I = I + 1
oApp.Namespace(FileNameZip).CopyHere FName(iCtr)
'Keep script waiting until Compressing is done
On Error Resume Next
Do Until oApp.Namespace(FileNameZip).items.Count = I
Application.Wait (Now + TimeValue("0:00:01"))
Loop
On Error GoTo 0
End If
Next iCtr
Excel.Application.DisplayAlerts = True
MsgBox "You find the zipfile here: " & FileNameZip
End If
End Sub
Sub NewZip(sPath)
Excel.Application.DisplayAlerts = False
'Create empty Zip File
'Changed by keepITcool Dec-12-2005
If Len(Dir(sPath)) > 0 Then Kill sPath
Open sPath For Output As #1
Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
Close #1
'Excel.Application.DisplayAlerts = True
End Sub
Function bIsBookOpen(ByRef szBookName As String) As Boolean
Excel.Application.DisplayAlerts = False
' Rob Bovey
On Error Resume Next
bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing)
'Excel.Application.DisplayAlerts = True
End Function
Function Split97(sStr As Variant, sdelim As String) As Variant
Excel.Application.DisplayAlerts = False
'Tom Ogilvy
Split97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
Excel.Application.DisplayAlerts = True
End Function
Encontrei o código aqui
-----
Mussato
V. Mussato
Office Developer
-------------------
Windows 7 64 bits
Office 2013
Postado : 28/01/2015 8:37 am