Страницы: 1
RSS
Открыть файл из архива без распаковки
 
Добрый день Форумчане!  :)
Видимо у меня сломался поисковик и я не могу найти решение, как открыть файл, который находится в архиве ".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
Изменено: evgeniygeo - 17.02.2021 09:36:18
 
Цитата
evgeniygeo написал:
открыть файл, который находится в архиве ".zip" без его распаковки
никак. Даже ОС распаковывает файл, прежде чем Вы его открываете. Во временную папку, но распаковывает. Чем распаковка не угодила?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
evgeniygeo, здравствуйте
АРХИВАЦИЯ/ИЗВЛЕЧЕНИЕ ИЗ АРХИВА ЧЕРЕЗ VBA и Получение файлов из архива ZIP на VBA — смотрели?
Изменено: Jack Famous - 17.02.2021 09:49:49
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Дмитрий(The_Prist) Щербаков,
очень жаль. Мне нужно просто открыть файл, посмотреть в нем данные и закрыть его (ничего в нем не меняя). Если я его распакую и открою, он же останется там, где был распакован? Вы говорите о временной папке, возможно ли это организовать и если да, то как?

Jack Famous,
да, я видел эти статьи и одну из них указал в первом сообщении
Изменено: evgeniygeo - 17.02.2021 10:06:32
 
Команда Kill путь_к_файлу удалит любой архив (не открытый в данный момент)
 
New,
да, это я знаю.
Но если так, то получается, что мне нужно распаковать файл, открыть и после закрытия удалить его. Мне кажется это малореальным.
Архив удалять не нужно.

Может быть есть вариант с временной папкой, о которой говорил Дмитрий(The_Prist) Щербаков,?
Изменено: evgeniygeo - 17.02.2021 10:43:30
 
Цитата
evgeniygeo: есть вариант с временной папкой
это происходит автоматически. Папка 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
Изменено: Дмитрий(The_Prist) Щербаков - 17.02.2021 11:05:56
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
evgeniygeo: как указать эту папку "temp" в коде?
функция Environ("temp") вернёт путь к ней на текущем компьютере. Вопрос не по теме…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
вернёт путь к ней на текущем компьютере
коты опять мат часть коверкают. Путь к этой папке у пользователя в сесии которого работает приложение, скрипт ....
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: коты опять мат часть коверкают
коты знают, что дядь Миш наведёт порядок, если заприметит  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Дмитрий(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 - 17.02.2021 12:46:18
 
Цитата
evgeniygeo написал:
чтобы не выходило окно о замене файла?
подключить логику и смекалку. Логика: почему появляется это окно? Правильно - потому что такой файл в папке УЖЕ ЕСТЬ. Значит перед распаковкой надо проверить его наличие и при необходимости удалить. А Вы делаете не пойми чего вместо удаления:
Код
If Len(Dir$(sExtractPath & "\" & sFileName)) > 0 Then
kill sExtractPath & "\" & sFileName
End if
Цитата
evgeniygeo написал:
Пытался через DisplayAlerts
DisplayAlerts не отлавливает события операционной системы :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков,
так я же так и сделал  :D
Только не стал удалять файл, а решил просто его открывать, т.к. файл не меняется

Но все равно большое спасибо!  :)  
Изменено: evgeniygeo - 17.02.2021 19:07:44
Страницы: 1
Наверх