0

私は、私が望んでいるような幸運ではなく、私よりも VBA に精通している人々に尋ねてきました。必要なものは次のとおりです。

  • 件名に「Stats1」、「Stats2」、「Stats3」などを含む受信メール
  • ルールがトリガーされ、送信者の電子メール アドレスを取得する
  • ワークブックを開き、電子メール アドレスをワークブックに渡します (例: emaillog.xlsm)
  • ワークブックに追加 (上書きではありません)
  • 「emaillog.xlsm」にメールアドレス、日時を記録
  • Excel スクリプトを実行します (emailend.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 の部分を理解するためにできることはすべて試しました。

どんな助けでも大歓迎です - 私は次の部分のために何/どこに行くべきかを理解できないところにいるだけです。

ご協力いただける場合は、メールの件名に基づいて、さまざまな範囲のさまざまなシートを送信する機能を追加したいと考えています。

ありがとう

4

1 に答える 1

0

初期転記

これは答えではありません。これは、一部は明確化の要求であり、一部はあなたの進歩に役立つと私が信じている以前の回答への参照です.

Outlook 用に作成された VBA マクロと Excel 用に作成された VBA マクロの間にはほとんど違いはありません。Outlook から Excel マクロを実行する理由はありますか? Outlook なしでマクロを含める方が簡単です。たとえば、次のようなものです。

  • 新しいメールによってトリガーされる新しいアイテム イベント マクロ。
  • マクロは件名をチェックします。
  • 件名がキーワードの場合、適切な Excel ワークブックを開き、電子メールの詳細を保存し、ワークブックの情報から返信を作成し、ワークブックを閉じます。
  • 処理済みのメールをアーカイブ フォルダーに移動します。

以前の質問に答えて、Outlook から Excel への書き込みを示すマクロを作成しました。そのマクロは要件に一致しませんが、関連する多くのテクニックを示しています。https://stackoverflow.com/a/12146315/973283をクリックして、その回答にアクセスしてください。

以上の点がお役に立てば幸いです。必要に応じて、説明や追加の質問をして戻ってきてください。

明確化の要件の後に転記 2

答えのこの次の部分は、私が望んでいたよりも遅れています。忙しかったこともあれば、予期していなかった問題に遭遇したこともあります。

Outlook 内から、次の方法で Visual Basic Editor を選択します。 - [ツール]、[マクロ]、[Visual Basic Editor] の順に選択するか、[Alt+F11] をクリックします。

左下には、次のようなプロジェクト エクスプローラーがあります。

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

フォームまたはモジュールがない場合、これらのエントリは失われます。存在するエントリは、すでに展開されている可能性があります。まだ展開Microsoft Outlook Objectsされていない場合は、 をクリックして展開し+ます。表示が次のように変わります。

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

をクリックしThisOutlookSessionます。右上の領域が白くなります (まだ白でない場合)。これはモジュールのようなコード領域ですが、特別なコード用です。

以下のコードをコード領域に貼り付けますThisOutlookSession

このコードには 2 つのマクロが含まれています。最初のマクロ Application_Startup() は、Outlook を開くと自動的に実行されます。Inbox に新しいアイテムが到着すると、 macro の呼び出しがトリガーされることを指定しますmyNewItems_ItemAdd()。また、呼び出されたことを示すために「Welcome」も出力します。2 番目のマクロ myNewItems_ItemAdd()は、新しいアイテムの種類を識別し、選択した情報をイミディエイト ウィンドウに出力します。

これらのマクロは正しく実行されますが、まだ解決していない問題があります。私の見解では、Outlook は正しく、特に電子メールにアクセスするマクロとマクロに不満を持っています。Outlook を開くと、マクロがあることが通知され (十分なセキュリティ レベルを持っている場合)、それらのマクロを有効または無効にするオプションが提供されます。マクロが電子メールにアクセスしようとすると、Outlook は警告を表示し、最大 10 分間アクセスを許可するオプションを提供します。

私はこれらのマクロを信頼していることを Outlook に伝える自己認証を行いました。これにより、マクロが存在するという警告は抑制されますが、予想どおり、電子メールにアクセスしようとしているマクロに関する警告は抑制されません。私は自分の興味のためにさらに調査しますが、10分ごとに許可を与える準備をしなければならないことは、あなたが新しいアイテムイベントを持つという目的を無効にします.

この機能が存在することを知っておくと、後で役立つ可能性があるため、とにかくこれらのマクロを試してみることをお勧めします。

次の 3 つの状況が考えられます。

  • IT 部門を持つ大企業で働いている場合は、管理者権限が必要なため、自己認証を行うことはおそらくできません。IT 部門のアドバイスを求める必要があります。
  • 10分ごとに許可を与えるという要件を抑制する方法を特定できない場合、おそらくStack Overflowの他の誰かができるでしょう.
  • たとえば、1 時間に 1 回、マクロを実行して、前回の実行以降に届いたリクエスト メールを探すことができます。マクロが何かを見つけた場合、それらを処理する許可を与えます。このアプローチが魅力的である場合、私はそのようなマクロを実装する方法を間違いなく知っています.

.

 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 が報告するのを妨げるものは何も試していません。この質問に関する他のすべては簡単ですが、この問題はキラーです.

于 2013-04-28T14:36:54.233 に答える