【问题标题】:Save zip attachments from Outlook in an internal drive (folder)将 Outlook 中的 zip 附件保存在内部驱动器(文件夹)中
【发布时间】:2020-02-18 08:51:12
【问题描述】:

我在银行工作,我们有很多限制。我无法在 Outlook 中使用开发人员选项。我可以使用 Excel VBA。

我想自动将每天收到的 zip 文件保存在本地驱动器文件夹中,并自动解压缩并替换昨天的文件。

我想在 Excel 工作表中创建一个按钮。一旦我按下按钮,Outlook 中的附件应该保存在我想要的任何目的地的本地文件夹中,并且附件应该解压缩。

我尝试了一些使用 VBA 从 Outlook 保存附件的方法,但没有多大帮助。

【问题讨论】:

  • 你试过这样的事情吗?如果您的技术人员可以阻止您使用“开发人员”选项卡,那么他们可能会阻止您使用工作簿宏访问您的电子邮件。如果您可以从工作簿访问电子邮件,则不需要按钮。该工作簿除了保存 zip 文件之外什么也不做,以便您可以使用自动执行。您打开工作簿,它会立即执行您想做的任何事情。
  • 您的问题中缺少有关您如何识别包含 zip 文件附件的电子邮件的信息。还缺少如何识别输出文件夹。是固定的吗?例如,是否基于日期?每次运行宏时是否要指定不同的文件夹?如果输出文件夹是固定的,每个 zip 文件是否都有唯一的名称?如果没有,您介意覆盖以前的 zip 文件吗?
  • 嗨,托尼,感谢您的来信。我无法真正澄清这些限制,因为这是一家银行,他们需要遵循很多规则。这种限制不仅适用于我或我们的部门。这是整个银行的。
  • 所以,托尼我尝试了这个“通过在文件夹中使用代码保存附件并在外观中使用运行脚本”但由于银行限制,该选项运行脚本不可用规则向导。说到我每天收到的邮件被称为“制裁”,它包含 zip 文件(这就是我的接收方式,这封电子邮件每天都附带一个 zip 文件)。下一个问题:不,必须解压缩 zip 文件并替换或覆盖旧的或以前的 zip 文件。 Zip 文件永远具有相同的名称。不,文件保存文件夹应该永远保持不变或相同。
  • 感谢您提出这个问题。总的来说,来自同一电子邮件的压缩文件和来自 Outlook 的相同文件名需要永远保存在一个特定的文件夹中,并且需要每天通过单击一个按钮来解压缩。这是电子邮件主题(ISIN 列表:金融制裁 - ISIN 筛选)。 zip 文件名为:GSM_1_004_EU_RU_NU_US_INSTR_FULL_...日期...ZIP 文件 667KB。

标签: excel vba outlook


【解决方案1】:

银行不希望其电子邮件被访问,我并不感到惊讶。您可以更改发件人、添加或删除收件人或更改文本。在不留下痕迹的情况下很难做到这些,但这是可能的。你不想改变任何东西;您只想自动保存附件,以便您的技术人员和 Outlook 允许这样做。

在尝试您的要求中更复杂的部分之前,让我们检查您的要求是否可行。我不知道您对 Excel VBA 了解多少。如果我要求你做一些你不明白的事情,请回来提问。

在方便的地方创建启用宏的工作簿。工作簿的名称无关紧要。

打开工作簿,然后打开 VBA 编辑器。

单击[工具],然后单击[参考]。您将获得所有可用库的下拉菜单。向下滚动,直到找到“Microsoft Outlook nn.0 对象库”。 “nn”标识正在使用的 Outlook 版本,据我了解,对您而言,该版本将是“14”。单击左侧的框,将出现一个勾号。单击[确定]。这将使您能够从 Excel 访问 Outlook。

在项目资源管理器中,您将看到如下内容:

-  VBAProject (YourNameForWorkbook.xlsm)
  -  Microsoft Excel Objects
       Sheet1 (Sheet1)
       ThisWorkbook  

如果其中一个缺点是加号,请点击那个加号。

单击 [ThisWorkbook]。 VBA 编辑器窗口的右侧将出现一个空白代码区域。将下面的代码复制到该区域。

在代码中,您会发现以“###”开头的行。这些行告诉您必须进行的更改或必须检查的事项。进行必要的更改,然后保存并关闭工作簿。重新打开工作簿。幸运的是,宏将自动运行,默认工作表将报告它所做的事情。它可能会发现错误的电子邮件并保存了错误的附件。这没关系。如果您可以保存任何附件,您可以保存您想要的附件。

Option Explicit
Sub Workbook_Open()

  '### Replace "C:\DataArea\SO\" with the name of a disc folder on your system
  '    Make sure your folder name ends with \.
  Const DiscFldrDest As String = "C:\DataArea\SO\"
  '### The name of the default worksheet depend on the local language. Replace
  '    "Sheet1" is this is not the default name for you.
  Const WshtOutName As String = "Sheet1"
  ' ### The subject of the email. Correct if I have misunderstood your comment    ' ###
  Const Subject As String = "ISIN List: Financial Sanctions - ISIN screening"     ' ###

  Dim AppOut As Outlook.Application
  Dim Found As Boolean
  Dim InxA As Long
  Dim InxI As Long
  Dim OutFldrInbox As Outlook.Folder
  Dim RowNext As Long
  Dim WshtOut As Worksheet

  Set AppOut = CreateObject("Outlook.Application")

  With AppOut
    With .Session
      Set OutFldrInbox = .GetDefaultFolder(olFolderInbox)
    End With
  End With

  Set WshtOut = Worksheets(WshtOutName)
  RowNext = WshtOut.Cells(Rows.Count, "A").End(xlUp).Row + 1

  '### Change if you prefer different date or time formats
  WshtOut.Cells(RowNext, "A").Value = "Macro activated at " & _
                                      Format(Now(), "h:mm") & " on " & _
                                      Format(Now(), "d mmm yy")
  RowNext = RowNext + 1

  '### GetDefaultFolder is not much use on my system because I have two
  '    email addresses, each with their own Inbox, neither of which is
  '    the default Inbox.  Probably you only have one work email address
  '    which is the default for you.  To check, the following statement
  '    outputs the name of the default Inbox's mailbox.  Tell me if it is
  '    not the mail box you want.
  WshtOut.Cells(RowNext, "A").Value = Space(6) & "Inbox accessed"
  WshtOut.Cells(RowNext, "B").Value = OutFldrInbox.Parent.Name
  RowNext = RowNext + 1

  Found = False

  With OutFldrInbox
    For InxI = .Items.Count To 1 Step -1
      With .Items(InxI)
        If .Subject = Subject And .Attachments.Count > 0 Then                            '###
          WshtOut.Cells(RowNext, "A").Value = Space(6) & "Attachment saved from email"   '###
          WshtOut.Cells(RowNext, "B").Value = "With subject"
          WshtOut.Cells(RowNext, "C").Value = .Subject
          RowNext = RowNext + 1
          WshtOut.Cells(RowNext, "B").Value = "Received"
          'WshtOut.Cells(RowNext, "C").Value = .ReceivedTime
          WshtOut.Cells(RowNext, "C").Value = Format(.ReceivedTime, "\a\t h:mm \o\n d mmm yy")
          'WshtOut.Cells(RowNext, "C").NumberFormat = "at h:mm on d mmm yy"
          RowNext = RowNext + 1
          WshtOut.Cells(RowNext, "A").Value = Space(6) & "Attachment saved"             '###
          For InxA = 1 To .Attachments.Count                                            '###
            If UCase(Right$(.Attachments(InxA), 4)) = ".ZIP" Then                       '###
              WshtOut.Cells(RowNext, "B").Value = .Attachments(InxA).Filename           '###
              .Attachments(1).SaveAsFile DiscFldrDest & .Attachments(1).Filename        '###
              Found = True                                                              '###
              Exit For                                                                  '###
            End If                                                                      '###
          Next                                                                          '###
        End If
      End With
    Next

    With WshtOut
      If Not Found Then
        .Cells(RowNext, "B").Value = "No email with correct subject and a ZIP attachment found"
        RowNext = RowNext + 1
      End If
      .Columns.AutoFit
      .Cells(RowNext, "A").Select
    End With

  End With

End Sub

【讨论】:

  • 您好托尼,感谢您的代码。它实际上正在工作,我很感激。该代码确实提取了附件并将其保存在我想要的位置。现在如何借记或更改我要保存的确切或特定电子邮件地址附件?我们从这里开始的下一步应该是“从特定电子邮件中提取附件并解压缩它,它应该在我运行宏的每一天都覆盖。来自德国的问候。
  • 我已更新我的代码以查找特定主题和扩展名为“ZIP”的附件。新的或修改的行以 '### 结尾。我怀疑替换我的原始代码然后重做必要的更改会更容易,但您可以选择。您的 cmets 意味着 zip 文件名每天都会更改。如果电子邮件中只有一个 zip 文件附件,我目前的测试就足够了。如果有两个或多个 zip 文件,请告诉我更多关于 zip 文件名的信息,我将创建一个更具体的测试。
  • 您想自动解压缩 zip 文件。我使用 WinZip。为了从宏或程序调用 WinZip,我下载了免费的 WinZip 命令行界面。你使用 WinZip 吗?可以下载命令行界面吗?如果没有,您认为您的技术人员会为您下载吗?
  • @UdaySimhaReddyPucha 如果我们可以解压缩您的文件,我需要知道压缩文件是否受密码保护?我不想知道密码;只要有一个。使用 CLI,在命令字符串中包含“-sxxx”会导致 WinZip 使用密码“xxx”进行解压缩。
  • 系统已预装7-Zip。
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多