Добрый день Форумчане! Видимо у меня сломался поисковик и я не могу найти решение, как открыть файл, который находится в архиве ".zip" без его распаковки (как в примере на соседнем форуме)
Пробовал сделать вот так, но выдает ошибку:
Код
Sub ExtractFileFromZip()
CreateObject("Shell.Application").Open "C:\Users\user\Desktop\Почта тест\Почта тест.zip" & "\" & "aaa.msg"
End Sub
Код
Sub Link_Open()
Shell ("explorer.exe " & "C:\Users\user\Desktop\Почта тест\Почта тест.zip" & "\" & "aaa.msg")
End Sub
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Дмитрий(The_Prist) Щербаков, очень жаль. Мне нужно просто открыть файл, посмотреть в нем данные и закрыть его (ничего в нем не меняя). Если я его распакую и открою, он же останется там, где был распакован? Вы говорите о временной папке, возможно ли это организовать и если да, то как?
Jack Famous, да, я видел эти статьи и одну из них указал в первом сообщении
New, да, это я знаю. Но если так, то получается, что мне нужно распаковать файл, открыть и после закрытия удалить его. Мне кажется это малореальным. Архив удалять не нужно.
это происходит автоматически. Папка temp, в которую, в числе прочего, извлекаются файлы из архива перед открытием, не нуждается в принудительной очистке, хотя это можно сделать, и самоочищается по своим законам (расписание, ограничения объёма данных и т.д.)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, понял, а как указать эту папку "temp" в коде?
Код
Sub ExtractFileFromZip()
With CreateObject("Shell.Application").Namespace(("C:\Users\user\Desktop\Почта тест"))
.CopyHere "C:\Users\user\Desktop\Почта тест\Почта тест.zip" & "\" & "aaa.msg"
End With
End Sub
Sub ExtractFileFromZip()
'C:\Documents - папка для извлечения файла из архива
'C:\Documents\VBAZip.zip - имя ZIP-архива, из которого необходимо извлечь файл
'Книга1.xls - имя файла в ZIP-архиве, который необходимо извлечь
With CreateObject("Shell.Application").Namespace(("C:\Documents"))
.CopyHere "C:\Documents\VBAZip.zip" & "\" & "Книга1.xls"
End With
End Sub
можно для удобства чуть переделать пути и имена и готов код, который Вам нужен:
Код
Sub ExtractFileFromZip()
'sExtractPath - папка для извлечения файла из архива
'sZIPPath - имя ZIP-архива, из которого необходимо извлечь файл
'sFileName - имя файла в ZIP-архиве, который необходимо извлечь
Dim sZIPPath$, sExtractPath$, sFileName$
sZIPPath = "C:\Users\Дмитрий\Documents\VBAZip.zip"
sFileName = "Книга1.xls"
sExtractPath = Environ("temp")
With CreateObject("Shell.Application").Namespace((sExtractPath))
.CopyHere sZIPPath & "\" & sFileName
End With
'делаем что-то с файлом sExtractPath & "\" & sFileName
'после всех действий удаляем
Kill sExtractPath & "\" & sFileName
End Sub
функция Environ("temp") вернёт путь к ней на текущем компьютере. Вопрос не по теме…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
коты знают, что дядь Миш наведёт порядок, если заприметит
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Дмитрий(The_Prist) Щербаков, супер! Это то, что нужно! А как сделать чтобы не выходило окно о замене файла? Пытался через DisplayAlerts, но не сработало
Т.к. файлы не изменяются у меня есть вариант проверки существования файла:
Код
Sub Link_Open()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.DisplayAlerts = False
Dim sZIPPath$, sExtractPath$, sFileName$
sZIPPath = ThisWorkbook.Path & "\MyEmails.zip"
sFileName = ActiveCell.Value
sExtractPath = Environ("temp")
If Len(Dir$(sExtractPath & "\" & sFileName)) > 0 Then
Shell ("explorer.exe " & sExtractPath & "\" & sFileName)
Else
With CreateObject("Shell.Application").Namespace((sExtractPath))
.CopyHere sZIPPath & "\" & sFileName
End With
Shell ("explorer.exe " & sExtractPath & "\" & sFileName)
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
End Sub
evgeniygeo написал: чтобы не выходило окно о замене файла?
подключить логику и смекалку. Логика: почему появляется это окно? Правильно - потому что такой файл в папке УЖЕ ЕСТЬ. Значит перед распаковкой надо проверить его наличие и при необходимости удалить. А Вы делаете не пойми чего вместо удаления:
Код
If Len(Dir$(sExtractPath & "\" & sFileName)) > 0 Then
kill sExtractPath & "\" & sFileName
End if