Có các phương pháp VBA để zip và unzip bằng cách sử dụng các cửa sổ được nén cũng như sẽ cung cấp một số thông tin chi tiết về cách hoạt động của hệ thống. Bạn có thể xây dựng các phương thức này thành ngôn ngữ kịch bản mà bạn chọn.
Nguyên tắc cơ bản là trong các cửa sổ, bạn có thể xử lý tệp zip dưới dạng thư mục và sao chép vào và ra khỏi tệp đó. Vì vậy, để tạo một tệp zip mới, bạn chỉ cần tạo một tệp có phần mở rộng .zip
có tiêu đề phù hợp cho tệp zip trống. Sau đó, bạn đóng nó, và nói với cửa sổ bạn muốn sao chép các tập tin vào nó như thể nó là một thư mục khác.
Giải nén dễ dàng hơn - chỉ coi đó là thư mục.
Trong trường hợp các trang web bị mất một lần nữa, sau đây là một vài trong số các đoạn mã liên quan:
ZIP
Sub NewZip(sPath)
'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
End Sub
Function bIsBookOpen(ByRef szBookName As String) As Boolean
' Rob Bovey
On Error Resume Next
bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing)
End Function
Function Split97(sStr As Variant, sdelim As String) As Variant
'Tom Ogilvy
Split97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function
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
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:="Excel Files (*.xl*), *.xl*", _
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
MsgBox "You find the zipfile here: " & FileNameZip
End If
End Sub
giải nén
Sub Unzip1()
Dim FSO As Object
Dim oApp As Object
Dim Fname As Variant
Dim FileNameFolder As Variant
Dim DefPath As String
Dim strDate As String
Fname = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", _
MultiSelect:=False)
If Fname = False Then
'Do nothing
Else
'Root folder for the new folder.
'You can also use DefPath = "C:\Users\Ron\test\"
DefPath = Application.DefaultFilePath
If Right(DefPath, 1) <> "\" Then
DefPath = DefPath & "\"
End If
'Create the folder name
strDate = Format(Now, " dd-mm-yy h-mm-ss")
FileNameFolder = DefPath & "MyUnzipFolder " & strDate & "\"
'Make the normal folder in DefPath
MkDir FileNameFolder
'Extract the files into the newly created folder
Set oApp = CreateObject("Shell.Application")
oApp.Namespace(FileNameFolder).CopyHere oApp.Namespace(Fname).items
'If you want to extract only one file you can use this:
'oApp.Namespace(FileNameFolder).CopyHere _
'oApp.Namespace(Fname).items.Item("test.txt")
MsgBox "You find the files here: " & FileNameFolder
On Error Resume Next
Set FSO = CreateObject("scripting.filesystemobject")
FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True
End If
End Sub
Có nhiều triển khai VBScript khác nhau có sẵn trên Google, ví dụ: "[Zip và UnZip tập tin bằng cách sử dụng Windows Shell (XP, Vista, 2003 và 2008) và VBScript] (http://www.naterice.com/blog/template_permalink.asp?id=64)". Tôi chưa thử nghiệm nhưng có nhiều khả năng họ chỉ 'zip', không nén. – samjudson
sự khác biệt bạn đang vẽ giữa zip và nén là gì? – Cheeso
Bạn có thể 'nén' các tệp thành một tệp duy nhất mà không cần nén chúng, giống như 'tar' trong unix. Điều này cho phép bạn phân phối các tệp dưới dạng gói, nhưng không giảm dung lượng đĩa của chúng. – samjudson