Вот ваш точно такой же код, использующий объект файловой системы вместо того, чтобы выполнять работу с папками внутри l oop. Я не проверял это, но это иллюстрирует то, о чем я говорю в моем комментарии выше. Вы должны быть в состоянии заставить его работать, используя это:
Sub Unzip()
Dim oApplicationlication As Object
Dim MyFolder As String
Dim MyFile As String
Dim ZipFile As Variant
Dim ExtractTo As Variant
' create the fso
Dim fso as Object
Set fso = CreateObject("Scripting.FileSystemObject")
Application.ScreenUpdating = False
'Cell B2 is the folder path which contains all zip file
MyFolder = Range("B2")
MyFile = Dir(MyFolder & "\*.zip")
ZipFile = Range("C2")
ExtractTo = Range("B3")
Do While MyFile <> ""
'Cell C2 is updated with a zip file name via loop function
Range("C2") = MyFolder & "\" & MyFile
' use the fso to check for and create the folder
' this way you dont have to use the DIR function again, which was messing things up
If Not fso.FolderExists(Range("B3")) Then
fso.CreateFolder(Range("B3"))
End If
Set oApplication = CreateObject("Shell.Application")
oApplication.Namespace(ExtractTo).CopyHere oApplication.Namespace(ZipFile).Items
DoEvents
MyFile = Dir
Loop
Application.ScreenUpdating = True
End Sub
Вы также можете извлечь выгоду (в зависимости от скорости, в зависимости от того, сколько существует zip-файлов) от перемещения этой строки за пределы l oop и поместите его сверху, где создается объект fso.
Set oApplication = CreateObject("Shell.Application")