Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 18.08.2015
Сообщений: 48
1
Outlook

Функция CopyHere объекта Shell.Application не принимает параметры

25.10.2018, 10:09. Показов 3686. Ответов 4

Добрый день,

Возникла необходимость в макросе реализовать извлечение архива (ZIP/ RAR).
Макрос на Outlook VBA, многие константы почему то не доступны, использую цифры

Функции разархивации нашел, подстроил под себя, работают отлично (источник)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'путь к архиватору WinRAR
Const sWinRarAppPath As String = "C:\Program Files (x86)\WinRAR\WinRAR.exe"
 
'Функция извлекает данные из указанного архива в папку с файлом архива
' sExtractPath  - путь к архиву
' sArhiveFile   - имя архива
'пример вызова: ExtractFilesFromRAR("C:\Temp\", "C:\Temp\Test.rar")
Sub ExtractFilesFromRAR(sExtractPath As String, sArhiveFile As String)
    'извлекаем данные из архива (E) в скрытом окне(vbHide)
    'при совпадении имен: без замены(-o-) /с заменой(-o+) / с переименованием(-or)
    'добавляем двойные кавычки, что позволит нам работать с именем файла и путём, которые содержат пробелы (без кавычек пробелы недопустимы)
    Shell sWinRarAppPath & " E -or " & " """ & sArhiveFile & """ """ & sExtractPath & """ ", vbHide
End Sub
 
'Извлечение всех файлов из ZIP-архива
' sExtractPath  - папка для извлечения файла из архива
' sArhiveName   - имя ZIP-архива, из которого необходимо извлечь файл
'пример вызова: ExtractFilesFromZIP("C:\Temp\", "C:\Temp\Test.rar")
Sub ExtractFilesFromZIP(sExtractPath As String, sArhiveFile As String)
    With CreateObject("Shell.Application")
        .NameSpace((sExtractPath)).CopyHere .NameSpace((sArhiveFile)).Items, &H4& + &H8& ' пробовал и только "8" и "&H8&"
    End With
End Sub
НО! мне необходимо чтобы при разархивации он не задавал вопросов при совпадении имен, а автоматически принимал решение "Сохранить оба файла", переименовав копируемый.

Архив RAR c ключом "-or" делает это прекрасно,
А вот при разархивации ZIP он все равно спрашивает, хотя нужную опцию я включил:
У функции CopyHere, второй параметр - "опция" (источник, описание всех функций объекта Shell.Application или еще тут ):
  • 4 - Не показывать окно с прогресс-баром.
  • 8 - Дать копируемому файлу новое имя, если файл с таким именем уже существует.
  • 16 - Отвечать автоматически "Yes to All" в любом отображаемом диалоге.
  • 256 - Отображать окно с прогресс-баром, но не показывать имена файлов.
  • 4096 - Производить операции только в локальной папке. Не производить операции рекурсивно в подпапках.
  • 9182 - Не копировать связанные файлы (например, html-файлы с их папками) как группу. Копировать только указанные файлы.
Мне нужны 4 и 8. Пробовал по разному задать их, все равно выдает это дурацкое окно...

Подскажите пожалуйста в чем может быть ошибка?
Может в макросе для outlook особенности какие то ...
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2018, 10:09
Ответы с готовыми решениями:

Параметры метода SetOption объекта Application
И снова здравствуйте... Экспресс вопрос... Я слаб в английском ("слаб" - это очень мягко...

Функция не принимает параметры
Есть код: #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <locale.h> ...

Какие параметры принимает функция IntRect
Пример : Sprite sp; sp.setTextureRect(IntRect( что именно мужно здесь написать , чтобы вырезать...

Определить, какие параметры принимает функция
Читаю книгу по C# и БД и не могу понять что эти строчки значят OleDbConnection connection =...

4
15037 / 6361 / 1726
Регистрация: 24.09.2011
Сообщений: 9,971
25.10.2018, 11:55 2
novikoff92, а зачем отдельная функция для ZIP? WinRAR умеет работать с ZIP.
0
1 / 1 / 0
Регистрация: 18.08.2015
Сообщений: 48
25.10.2018, 12:09  [ТС] 3
Цитата Сообщение от Казанский Посмотреть сообщение
WinRAR умеет работать с ZIP.
Большинство нужных мне архивов в ZIP.
А WinRAR может быть не установлен.
И так он их будет отрабатывать .ZIP а на .RAR писать ошибку в лог
0
15037 / 6361 / 1726
Регистрация: 24.09.2011
Сообщений: 9,971
25.10.2018, 13:12 4
Лучший ответ Сообщение было отмечено novikoff92 как решение

Решение

novikoff92, да, при копировании/перемещении файла из обычной папки это работает, при копировании из ZIP - нет.
Значит, надо скопировать файлы из ZIP в обычную временную папку, оттуда переместить в целевую папку.
Добавьте обработку ошибок по необходимости.
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub ExtractFilesFromZIP(sExtractPath As String, sArhiveFile As String)
Dim tempFldr
  tempFldr = Environ("temp") & "\" & Timer
  MkDir tempFldr
  With CreateObject("Shell.Application")
    .Namespace(tempFldr).copyhere .Namespace((sArhiveFile)).Items, &H4& + &H8& ' пробовал и только "8" и "&H8&"
    .Namespace((sExtractPath)).movehere .Namespace(tempFldr).Items, &H4& + &H8&
  End With
 RmDir tempFldr
 End Sub
1
1 / 1 / 0
Регистрация: 18.08.2015
Сообщений: 48
26.10.2018, 10:02  [ТС] 5
Цитата Сообщение от Казанский Посмотреть сообщение
Значит, надо скопировать файлы из ZIP в обычную временную папку, оттуда переместить в целевую папку.
Спасибо большое, так работает

Сначала не понял почему RmDir не вызывает ошибку, т.к. он может удалить только пустую папку а потом заметил, что там команда"MoveHere" из временной папки.

Но на случай, если например не все файлы нужны из архива, или что то не перенеслось по каким то причинам, я бы лучше удалял с помощью других функций (у меня они все равно уже были написаны для других задач) :
С помощью Shell:
Visual Basic
1
Shell "cmd /c rd /S/Q """ & sFolder & """"
или с помощью стандартных средств но со сканированием и удалением файлов и рекурсивным удалением подпапок:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
' удалить папку с содержимым
Public Sub DeleteFolder(sFolder As String)
    Dim i As Integer, Files() As String, SubFolders() As String
    'удаляем все подпапки (рекурсия)
    SubFolders = FoldersInFolder(sFolder)
    If (Not Not SubFolders) <> 0 Then
        For i = LBound(SubFolders) To UBound(SubFolders)
            DeleteFolder (SubFolders(i))
        Next
    End If
    'удаляем все файлы
    Files = FilesInFolder(sFolder)
    If (Not Not Files) <> 0 Then
        For i = LBound(Files) To UBound(Files)
            Kill Files(i)
        Next
    End If
    'удаляем папку
    RmDir (sFolder)
End Sub
 
' получение списка файлов в папке
Public Function FilesInFolder(sFolder As String) As Variant
    Dim File As String, Files() As String
    If Right(sFolder, 1) <> "\" Then sFolder = sFolder & "\"
    File = Dir(sFolder)
    Do While File <> ""
        If (Not Not Files) = 0 Then
            ReDim Files(0)
            Files(0) = sFolder & File
        Else
            ReDim Files(UBound(Files) + 2)
            Files(UBound(Files)) = sFolder & File
        End If
        File = Dir
    Loop
    FilesInFolder = Files
End Function
 
' получение списка подпапок в папке
Public Function FoldersInFolder(sFolder As String) As Variant
    Dim dir_name  As String, index As Long, Folders() As String
    If Right(sFolder, 1) <> "\" Then sFolder = sFolder & "\"
    If GetAttr(sFolder) And vbDirectory Then
        dir_name = Dir(sFolder & "\*", vbDirectory)
        dir_name = Dir
        dir_name = Dir
        Do Until dir_name = ""
            dir_name = sFolder & "" & dir_name
            If GetAttr(dir_name) And vbDirectory Then                
                If (Not Not Folders) = 0 Then
                    ReDim Folders(0)
                    Folders(0) = dir_name
                Else
                    ReDim Folders(UBound(Folders) + 2)
                    Folders(UBound(Folders)) = dir_name
                End If
            End If
            dir_name = Dir
        Loop
    End If
    FoldersInFolder = Folders
End Function
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2018, 10:02

Какие параметры принимает функция main?
Всем привет, какие параметры может принимать функция main() в c++, согласен, много статей на эту...

Функция принимает в параметры массив и сжимает его
Написать функцию которая принимает в параметры массива и сжимает его путем сложения разных соседних...

Функция принимает в параметры коефициенты квадратного уравнения и возращает сумму его корней
Нужно написать функцию которая принимает в параметры коефициенты квадратного уравнения и возращает...

Разница запуска функция Console Application и VCL Forms Application
Ситуация следующая. Есть устройство подключенное к компу посредством USB и библиотека для работы с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.