首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用VBA解压缩PKZip文件有什么特别的方法吗?

用VBA解压缩PKZip文件有什么特别的方法吗?
EN

Stack Overflow用户
提问于 2021-04-05 22:51:18
回答 1查看 55关注 0票数 0

我正在尝试使用一种相当标准的方法从Outlook中提取电子邮件,然后提取Zip文件。文件名和文件夹位置正确。我想知道PKZip文件(我们公司的Zip文件标准)是否需要特殊的技术?这是我到目前为止的代码。它工作得很好,直到从Zip文件中提取文件失败为止。( oApp.Namespace(fDest ).CopyHere oApp.Namespace(fDest& Fname).Items)

代码语言:javascript
复制
Sub SaveAttachments()
    Dim ol As Outlook.Application
    Dim ns As Outlook.Namespace
    Dim fol As Outlook.Folder
    Dim i As Object
    Dim mi As Outlook.MailItem
    Dim at As Outlook.Attachment
    Dim Inbox As MAPIFolder
    Dim strDate As String
    Dim oApp As Object
    Dim fDest As String
    Dim fZip As String
               
    strDate = InputBox("Enter Date in format dd-Mmm-yyyy", "User Date", Format(Now(), "dd-Mmm-yyyy"))
       
    Set ol = New Outlook.Application
    Set ns = ol.GetNamespace("MAPI")
    Set fol = ns.Folders("GCMNamLogs").Folders("Inbox")
    
    fDest = "C:\Users\jb76991\Desktop\0_SWPA 50011 CORP Violations\"
        
    For Each i In fol.Items.Restrict("@SQL=urn:schemas:httpmail:subject LIKE '%" & strDate & "%'")
        
        If i.Class = olMail Then
            Set mi = i
            For Each at In mi.Attachments
                If InStr(at.Filename, ".zip") > 0 Then
                    If InStr(mi.Subject, "Daily SWPA swpaViolRPT REPORT for DOMAIN:CORP") > 0 Then
                        'Set oApp = CreateObject("Shell.Application")
                        FileNameFolder = fDest
                        Fname = at.Filename
                        at.SaveAsFile fDest & Fname
                        Set oApp = CreateObject("Shell.Application")
                        Debug.Print fDest & Fname
                        oApp.Namespace(fDest).CopyHere oApp.Namespace(fDest & Fname).Items
                        Application.Wait (Now + TimeValue("0:00:02"))
                    End If
                    If InStr(mi.Subject, "Daily SWPA swpaViolRPT REPORT for DOMAIN:INFRA") > 0 Then
                        Set oApp = CreateObject("Shell.Application")
                        FileNameFolder = fDest
                        Fname = at.Filename
                        at.SaveAsFile fDest & Fname
                        Debug.Print fDest & Fname
                        oApp.Namespace(fDest).CopyHere oApp.Namespace(fDest & Fname).Items
                        Application.Wait (Now + TimeValue("0:00:01"))
                    End If
                    If InStr(mi.Subject, "Daily SWPA swpaSumRPT REPORT for DOMAIN:CORP") > 0 Then
                        Set oApp = CreateObject("Shell.Application")
                        FileNameFolder = fDest
                        Fname = at.Filename
                        at.SaveAsFile fDest & Fname
                        Debug.Print fDest & Fname
                        oApp.Namespace(fDest).CopyHere oApp.Namespace(fDest & Fname).Items
                        Application.Wait (Now + TimeValue("0:00:01"))
                    End If
                    If InStr(mi.Subject, "Daily SWPA swpaSumRPT REPORT for DOMAIN:INFRA") > 0 Then
                        Set oApp = CreateObject("Shell.Application")
                        FileNameFolder = fDest
                        Fname = at.Filename
                        at.SaveAsFile fDest & Fname
                        Debug.Print fDest & Fname
                        oApp.Namespace(fDest).CopyHere oApp.Namespace(fDest & Fname).Items
                        Application.Wait (Now + TimeValue("0:00:01"))
                    End If

                End If
            Next at
        End If
    Next i
    MsgBox ("Done")
    
End Sub
EN

回答 1

Stack Overflow用户

发布于 2021-04-06 06:45:10

字符串/变量是修复方法,但您也可以从减少代码中的重复中获益

(未测试)

代码语言:javascript
复制
Sub SaveAttachments()
    Dim ol As Outlook.Application
    Dim ns As Outlook.Namespace
    Dim fol As Outlook.Folder
    Dim i As Object
    Dim mi As Outlook.MailItem
    Dim at As Outlook.Attachment
    Dim Inbox As MAPIFolder
    Dim strDate As String
    Dim fDest As Variant, FName As Variant, e, arrZips
    
    strDate = InputBox("Enter Date in format dd-Mmm-yyyy", "User Date", Format(Now(), "dd-Mmm-yyyy"))
       
    Set ol = New Outlook.Application
    Set ns = ol.GetNamespace("MAPI")
    Set fol = ns.Folders("GCMNamLogs").Folders("Inbox")
    
    arrZips = Array("Daily SWPA swpaViolRPT REPORT for DOMAIN:CORP", _
                    "Daily SWPA swpaViolRPT REPORT for DOMAIN:INFRA", _
                    "Daily SWPA swpaSumRPT REPORT for DOMAIN:CORP", _
                    "Daily SWPA swpaSumRPT REPORT for DOMAIN:INFRA")
    
    fDest = "C:\Users\jb76991\Desktop\0_SWPA 50011 CORP Violations\"
        
    For Each i In fol.items.Restrict("@SQL=urn:schemas:httpmail:subject LIKE '%" & strDate & "%'")
        If i.Class = olMail Then
            Set mi = i
            For Each at In mi.Attachments
                FName = at.Filename
                If InStr(FName, ".zip") > 0 Then
                    For Each e In arrZips
                        If InStr(mi.Subject, e) > 0 Then
                            at.SaveAsFile fDest & FName
                            ExtractZip fDest & FName, fDest, 2
                            Exit For
                        End If
                    Next e
                End If
            Next at
        End If
    Next i
    MsgBox ("Done")
End Sub

Sub ExtractZip(ZipPath, DestFolder, Optional waitsecs As Long = 0)
    Debug.Print "Extracting '" & ZipPath & "' to '" & DestFolder & "'"
    With CreateObject("Shell.Application")
        .Namespace(DestFolder).copyhere .Namespace(ZipPath).items
    End With
    If waitsecs > 0 Then Application.Wait Now + waitsecs / (24 * 60 * 60)
End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66954949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档