簡體   English   中英

Office 2010 VBA - 將 SenderEmailAddress 傳遞給 Excel 工作簿並運行 Excel 宏來發送電子郵件

[英]Office 2010 VBA - pass SenderEmailAddress to Excel workbook and run Excel macro to send email

我一直在問那些比我更熟悉 VBA 的人,但沒有我希望的那種運氣。 這是我需要的:

  • 主題行中帶有“Stats1”、“Stats2”、“Stats3”(等)的傳入電子郵件
  • 觸發規則,捕獲發件人的電子郵件地址
  • 打開工作簿並將電子郵件地址傳遞給工作簿(例如:emaillog.xlsm)
  • 附加到工作簿(不覆蓋)
  • 在“emaillog.xlsm”上記錄電子郵件地址、時間和日期
  • 運行一個 excel 腳本(例如 emailsend.xlsm)
  • 將數據范圍從“emailsend.xlsm”發送到“emaillog.xlsm”上的最新條目
  • 保存並關閉“emaillog.xlsm”

這是我要發送的 Excel 部分:

Public dTime As Date
Sub AutoSchedule1()
    dTime = Now() + TimeValue("01:00:00")
    Sheet("Sheet1").Range("u1").Value = "Email On, next send at " & Hour(dTime) & ":" & Minute(dTime)
    ActiveWorkbook.RefreshAll
    Application.OnTime dTime, "SendStatsTeam"
    If Hour(dTime) >= 18 Then
        Application.OnTime dTime, "SendStatsTeam", , False
        Exit Sub
    End If
End Sub
Sub SendStatsTeam()
    Dim AWorksheet As Worksheet
    Dim Sendrng As Range
    Dim rng As Range
    Dim Hournow As Long
    AutoSchedule1
    On Error GoTo StopMacro
    If Hour(Now()) > 12 Then
    Hournow = Hour(Now()) - 12
    Else
    Hournow = Hour(Now())
    End If
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    Set Sendrng = Worksheets("Sheet1").Range("A1:Z26")

    Set AWorksheet = ActiveSheet

    With Sendrng

        ActiveWorkbook.EnvelopeVisible = True
        With .Parent.MailEnvelope

            .Introduction = "Here are your stats"

            With .Item
                .To = SenderEmailAddress
                .CC = ""
                .BCC = ""
                .Subject = "Stats so far today" & Hour(Now()) & ":" & Application.WorksheetFunction.Text(Minute(Now()), "00")
                .Send
            End With

        End With

        rng.Select
    End With

    AWorksheet.Select

StopMacro:
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With
    ActiveWorkbook.EnvelopeVisible = False

End Sub

Sub emailoff()
Application.OnTime dTime, "SendStatsTeam", , False
    Worksheets("Sheet2").Range("u1").Value = "Email Off"
End Sub

我意識到我在這里沒有正確完成所有事情,因為我對 VBA 還很陌生,但我已經盡我所能來弄清楚 Outlook 部分。

任何幫助將不勝感激 - 我不介意閱讀我只是在我無法弄清楚下一部分去哪里/去哪里的時候。

如果您選擇提供幫助,我想添加根據電子郵件主題發送不同范圍的不同工作表的功能。

謝謝

初始過帳

這不是一個答案。 這部分是對澄清的要求,部分是對我相信會幫助您進步的早期答案的參考。

為 Outlook 編寫的 VBA 宏和為 Excel 編寫的宏之間幾乎沒有區別。 您是否有理由希望從 Outlook 運行 Excel 宏? 在沒有 Outlook 的情況下包含宏會更容易。 例如這樣的事情:

  • 新郵件觸發的新項目事件宏。
  • 宏檢查主題。
  • 如果主題是關鍵字,則打開適當的 Excel 工作簿,存儲電子郵件的詳細信息,根據工作簿中的信息創建回復並關閉工作簿。
  • 將處理過的電子郵件移動到存檔文件夾。

為了回答之前的問題,我創建了一個宏來演示從 Outlook 寫入 Excel。 該宏不符合您的要求,但演示了許多相關的技術。 單擊https://stackoverflow.com/a/12146315/973283訪問該答案。

我希望以上幾點有幫助。 如有必要,請務必回來澄清或提出進一步的問題。

需求明晰后發帖2

答案的下一部分比我希望的要晚。 部分是因為這是忙碌的一天,部分是因為我遇到了一個我沒有預料到的問題。

從 Outlook 中通過以下方式選擇 Visual Basic 編輯器: - 依次選擇工具、宏和 Visual Basic 編輯器或 - 單擊 Alt+F11。

左下方將是 Project Explorer,它可能是:

- Project1 (VbaProject.OTM)
  + Microsoft Outlook Objects
  + Forms
  + Modules

如果您沒有表單或模塊,這些條目將丟失。 任何存在的條目可能已經被展開。 單擊+展開Microsoft Outlook Objects (如果尚未展開)。 顯示將變為:

- Project1 (VbaProject.OTM)
  - Microsoft Outlook Objects
      ThisOutlookSession
  + Forms
  + Modules

單擊ThisOutlookSession 右上角區域將變為白色(如果它還不是白色)。 這是一個代碼區,就像一個模塊,但用於特殊代碼。

將下面的代碼粘貼到ThisOutlookSession代碼區域。

此代碼包含兩個宏。 第一個宏 Application_Startup() 在打開 Outlook 時自動執行。 它指定收件箱中新項目的到達將觸發宏myNewItems_ItemAdd()的調用。 它還輸出“歡迎”以證明它已被調用。 第二個宏myNewItems_ItemAdd()標識新項目的類型並將所選信息輸出到立即窗口。

這些宏正確執行,但有一個我沒有解決的問題。 在我看來,Outlook 對宏和訪問電子郵件的宏並不滿意。 當您打開 Outlook 時,它會告訴您有宏(前提是您具有足夠的安全級別)並為您提供啟用或禁用這些宏的選項。 如果宏嘗試訪問電子郵件,Outlook 會警告您並提供最多允許訪問 10 分鍾的選項。

我已經對這些宏進行了自我認證,這告訴 Outlook 我信任它們。 這會抑制有關存在宏的警告,但不會像我預期的那樣抑制有關嘗試訪問電子郵件的宏的警告。 我會為了我自己的利益而進一步調查,但必須准備好每 10 分鍾給予許可,這違背了您舉辦新項目活動的目標。

我建議您無論如何都使用這些宏,因為知道此功能存在可能會在以后有所幫助。

我可以想到三種情況:

  • 如果您在擁有 IT 部門的大公司工作,您可能無論如何都無法進行自我認證,因為您需要管理權限才能這樣做。 您需要尋求 IT 部門的建議。
  • 如果我無法確定如何抑制每 10 分鍾授予權限的要求,那么 Stack Overflow 上的其他人也許可以。
  • 例如,每小時一次,您可以運行一個宏來查找自上次運行以來收到的任何請求電子郵件。 如果宏找到任何內容,您將授予它處理它們的權限。 如果這種方法有吸引力,我絕對知道如何實現這樣的宏。

.

 Option Explicit
 Public WithEvents MyNewItems As Outlook.Items
 Private Sub Application_Startup()

   ' This event procedure is called when Outlook is started

   Dim NS As NameSpace

   Set NS = CreateObject("Outlook.Application").GetNamespace("MAPI")

   With NS
    Set MyNewItems = NS.GetDefaultFolder(olFolderInbox).Items
   End With

   MsgBox "Welcome"

 End Sub
 Private Sub myNewItems_ItemAdd(ByVal Item As Object)

   ' This event procedure is called whenever a new item is added to
   ' to the InBox.

   Dim NewMailItem As MailItem

   Debug.Print "------Item Received"

   On Error Resume Next
   ' This will give an error and fail to set NewMailItem if
   ' Item is not a MailItem.
   Set NewMailItem = Item
   On Error GoTo 0

   If Not NewMailItem Is Nothing Then
     ' This item is a mail item
     With NewMailItem
       Debug.Print "Subject " & .Subject
       Debug.Print "Sender Email [" & .SenderEmailAddress & "]"
     End With
   Else
     ' Probably a meeting request.
     Debug.Print "Not mail item " & Item.Subject
   End If

 End Sub

對於我的下一個帖子,我將添加一個 Outlook 宏,該宏可以打開一個工作簿並寫入它並從中讀取。

在您的問題中,您說要將工作簿中的范圍發送給電子郵件的作者。 你知道怎么做嗎? 如果不是,你會發送什么樣的范圍? 你希望它如何出現? 如果這會給您想要的外觀,那么將小范圍轉換為 Html 並不困難。

最終發布

抱歉,我放棄了這個問題。 我沒有嘗試阻止 Outlook 報告宏正在嘗試發送電子郵件。 關於這個問題的其他一切都很簡單,但這個問題是一個殺手。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM