2013-04-26 64 views
0

我一直在問那些比我更熟悉VBA的人,而不是我所希望的那種運氣。這是我需要:Office 2010 VBA - 將SenderEmailAddress傳遞給Excel工作簿並運行Excel宏以發送電子郵件

  • 傳入電子郵件「Stats1」,「Stats2」,「Stats3」(等)在主題行
  • 規則被觸發,捕獲發件人的電子郵件地址
  • 打開的工作簿並通過電子郵件地址簿(例如:emaillog.xlsm)
  • 追加到工作簿(未覆蓋)
  • 登錄「emaillog.xlsm」
  • 運行的Excel腳本的電子郵件地址,時間和日期(示例emailsend.xlsm)
  • 對「emaillog.xlsm」最新的條目
  • 發送範圍從「emailsend.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,但我嘗試了一切,我可以找出展望部分。

任何幫助將不勝感激 - 我不介意做閱讀我只是在一個點,我無法弄清楚下一部分什麼/去哪裏。

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

感謝

+0

你是否從Outlook或Excel開始8分(點)過程?你如何以及在哪裏設置兩個應用程序的連接? – 2013-04-27 05:35:37

+0

使用規則啓動Outlook。 – TheOrion 2013-04-27 12:44:04

回答

0

首次發佈

這不是一個答案。這部分是要求澄清,部分是對先前答案的參考,我相信這會幫助你取得進展。

爲Outlook編寫的VBA宏和爲Excel編寫的VBA宏之間幾乎沒有區別。爲什麼要從Outlook運行Excel宏有什麼原因?包含沒有Outlook的宏將更容易。比如這樣的事情:

  • 由新電子郵件觸發的新項目事件宏。
  • 宏檢查主題。
  • 如果主題是關鍵字,請打開相應的Excel工作簿,存儲電子郵件的詳細信息,從工作簿中的信息創建回覆並關閉工作簿。
  • 將處理過的電子郵件移至歸檔文件夾。

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

我希望以上幾點有幫助。根據需要回來澄清或進一步的問題。

發佈2的要求後澄清

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

從Outlook中選擇Visual Basic編輯器: - 選擇工具,然後選擇宏,然後選擇Visual Basic編輯器或 - 單擊Alt + F11。

下左側將工程資源管理器可能是:

- 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報告一個宏正試圖發送電子郵件。關於這個問題的其他一切都很簡單,但這個問題是一個殺手。

+0

謝謝你的迴應。我瀏覽了你的鏈接,雖然它給了我一些答案,但對我來說仍然有點困惑。您的項目符號能夠完美地確定我想要構建的內容 - 我可以在哪裏找到一些示例代碼,將其放入我已經構建的內容中? – TheOrion 2013-04-29 16:29:19

+0

今晚對我來說已經太遲了。我明天會發布一些東西。 – 2013-04-29 22:09:20

相關問題