【问题标题】:Save attachment from an email in to a folder that changes every month将电子邮件中的附件保存到每月更改的文件夹中
【发布时间】:2017-04-26 17:13:05
【问题描述】:

我正在尝试在 Outlook 中获取 VBA 宏,它将电子邮件的附件保存到特定文件夹(每个月都会更改)并将收到的上个月的 YYYYMM 添加到文件名中。

outlook 规则识别电子邮件标头包含来自某人的“NTMR”。

当它这样做时,它会运行将附件保存在文件夹中的脚本。

因此,当宏识别收到电子邮件的月份时,它会保存在滞后一个月的文件夹中。例如:

在 DD/04/17 收到的电子邮件为“这是给您的 NTMR 文件”,它会将文件保存在 201703 父文件夹中的文件夹中,为 NTMR - 201703

所以文件的路径是 C:\Users\alitalh\Downloads\Test\201703\Source Files\NTMR 201703

我想出了 follownig 宏 - 请告知我该如何修复它?

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
    Dim objAtt As Outlook.Attachment
    Dim saveFolder As String
    Dim dateFormat As String
    saveFolder = "C:\Users\alitalh\Downloads\Test"
    dateFormat = Format(Now, "yyyymm" - 1, 1)

    For Each objAtt In itm.Attachments
        objAtt.SaveAsFile saveFolder & "\" & dateFormat & "\" & "Source Files" & "\" & objAtt.DisplayName & dateFormat
        Set objAtt = Nothing
    Next
End Sub

如何从标题中去掉 NTMR 并将其放入文件名中?

我有另一个宏可以在电子邮件之前设置文件夹,因此我们不需要创建另一个文件夹

【问题讨论】:

  • NTMR 在哪里?主题行?还是电子邮件正文?
  • @0m3r 主题行

标签: vba outlook


【解决方案1】:

MSDN Split Function

合作

主题行上的示例Here is the NTMR file for you 用空格字符分隔它(" ")

代码示例

Sub Example()
    Dim Item As Outlook.mailitem

    Set Item = ActiveExplorer.Selection.Item(1)

    Debug.Print Item.subject ' Print on Immediate Window (Ctrl+G)

    Item.subject = Split(Item.subject, " ")(3)

    Debug.Print Item.subject ' Print on Immediate Window (Ctrl+G)

End Sub

你的主题 = (Here)(1) (is)(2) (the)(3) (NTMR)(4) (file)(5) (for)(6) (you)(7)

现在 Split(subject line), "space")(3) 分配给字符串变量时

Dim FileName As String
FileName = Split(Item.subject, " ")(3)

objAtt.DisplayName 替换为 FileName


Dim FileName As String
For Each objAtt In itm.Attachments
    objAtt.SaveAsFile saveFolder & "\" & _
                       dateFormat & "\" & _
                    "Source Files" & "\" & FileName & dateFormat
Next

默认情况下,或者当 Limit 等于 -1 时,Split 函数会在每次出现分隔符字符串时拆分输入字符串,并在数组中返回 子字符串
当 Limit 参数大于零时,Split 函数在分隔符的第一个 Limit-1 出现处拆分字符串,并返回一个包含结果子字符串的数组。
例如,Split("a:b:c", ":") returns the array {"a", "b", "c"}
Split("a:b:c", ":", 2) returns the array {"a", "b:c"}.


要获取上个月的信息,请尝试 DateAdd Function

例子

Option Explicit
Public Sub Example()
    Dim PrevMonth As String

    PrevMonth = Format(DateAdd("m", -1, Date), "yyyymm")
    Debug.Print PrevMonth
End Sub

在其他情况下值得探索的一些有用的日期函数包括 DateDiffDatePartDateSerial、Day、Month、Year 和IsDateIsDate(检查字符串是否为有效日期)对于像UserForms 这样您可能希望强制用户在特定文本框中输入有效日期的内容特别有用。


【讨论】:

  • 非常感谢.. dateFormat 在我的代码中可以正常工作吗?
  • 我怎样才能让我的 dateFormat 比当月早一个月?
  • @wasimakram101 只是月份和年份?-
  • 是的,采用 YYYYMM 格式。这就是我遇到的问题。非常感谢您抽出宝贵的时间。
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2018-07-10
相关资源
最近更新 更多