web-dev-qa-db-ja.com

VBA Outlook。メール本文から特定のデータを抽出してExcelにエクスポートしようとしています

私は現在私がいるところに行くためのかなりのガイドをここで見つけましたが、私のコードに最後の仕上げをするのに助けが必要です(私はこれに完全な初心者なので、私と一緒に我慢してください)。 OutlookのVBAを使用して、Outlookの特定のフォルダーにある電子メールからExcelにデータをエクスポートしようとしています。多数のメールのメッセージ本文からExcelシートにデータを抽出する必要があります。私が抽出しているメールテンプレートは以下にあります。参照番号の後に10桁の番号、シリアル番号の後に10桁の番号、問題の説明の後に7桁の番号が必要です。 (不明な場合に備えて、必要な部分を太字にしています)

Xxxxxxxx様

------------------不要な情報-----------------

参照番号1234567890

ステータス:----不要な情報-----

シリアル番号:[〜#〜] xxxxxxxxxx [〜#〜]問題の説明:______________(ここのデータは少し異なりますが、私はこの領域から7桁の番号を取得することのみを考慮していますが、それができない場合は、そうしてください)_______

これを使って…。

-----------------残りは必要ありません-----------------------

これまでのところ、現在使用しているOutlookフォルダーを参照するスクリプトを作成し、Excelシートを開き、Excelでヘッダーに名前を付け、データをインポートすることができました。ただし、必要なセグメントだけでなく、ボディ全体がプルされ、Excelの間違った列に配置されます。私はこれで完全な初心者なので、残念ながらそれができる範囲です。このサイトで、解決策に関する同様の問題のある例をいくつか見つけることができましたが、それらをあまり理解できませんでした。多くの試行錯誤を通して、私は自分自身を投稿することに頼りました、そしてどんな助けも大いに感謝されます。これが現在の化身の私のコードです-

    Sub Extract()
    On Error Resume Next
    Set myOlApp = Outlook.Application
    Set mynamespace = myOlApp.GetNamespace("mapi")

    ‘open the current folder, I want to be able to name a specific folder if possible…

    Set myfolder = myOlApp.ActiveExplorer.CurrentFolder
    Set xlobj = CreateObject("Excel.application.14")
    xlobj.Visible = True
    xlobj.Workbooks.Add
    'Set Heading

    xlobj.Range("a" & 1).Value = "Case Number"
    xlobj.Range("b" & 1).Value = "HDD Serial Number"
    xlobj.Range("c" & 1).Value = "Sys Serial Number"
    xlobj.Range("d" & 1).Value = "User"


    For i = 1 To myfolder.Items.Count
    Set myitem = myfolder.Items(i)
    msgtext = myitem.Body

    ‘search for specific text
    delimtedMessage = Replace(msgtext, "reference number", "###")
    delimtedMessage = Replace(delimtedMessage, "Problem description:", "###")
    delimtedMessage = Replace(delimtedMessage, "Serial Number:", "###")
    messageArray = Split(delimtedMessage, "###")
    ‘write to Excel
    xlobj.Range("a" & i + 1).Value = messageArray(1)
    xlobj.Range("b" & i + 1).Value = messageArray(2)
    xlobj.Range("c" & i + 1).Value = messageArray(3)
    xlobj.Range("d" & i + 1).Value = myitem.To

    Next
    End Sub

これまでに使用した参照: VB/VBAを使用してOutlookメッセージを検索し、特定のデータをExcelワークシートに抽出する リンクを見つけることができない別のものがあり、redditにもスレッドがありました、しかし私はまだ行き詰まっています。これが私のような最初の試みなので、これが私が望む結果を達成するための最良の方法であるかどうかはわかりません。私は何でも変えることにオープンです。前もって感謝します

8
bezj

「完全な初心者」のための非常に素晴らしいコードのようです

あなたのコードは動作に非常に近いです。見逃しているように見えるのは、配列変数「messageArray」がどのように機能しているかを理解することです。

デフォルトでは、配列はゼロから始まり、そこから上に移動します。したがって、3つの可能な値を持つ配列は次のようにディメンション化されます。

dim messageArray(3) as string  
 -'meaning an array with 3 possible values all of which are strings

そして、その変数を埋めるには、コードを現在のものからこれに変更する必要があります

xlobj.Range("a" & i + 1).Value = messageArray(0)  ' Not 1 
xlobj.Range("b" & i + 1).Value = messageArray(1)  ' Not 2
xlobj.Range("c" & i + 1).Value = messageArray(2)  ' Not 3

もう1つ注意する必要があるのは、split関数の使用であり、区切り文字は非常に洗練されていますが、データの列には、顧客番号だけでなく、顧客番号に加えて、テキスト全体が含まれる場合があります。ほしくない。開始および終了の区切り文字を考慮する必要がある場合があります。

たとえば、現在のメールのテキストには、

参照番号123456789
ステータス:----不要な情報-----
シリアル番号:[〜#〜] xxxxxxxxxx [〜#〜] Pro .......

区切り文字は、「参照番号」と「シリアル番号」というキーワードを見つけ、次のようなテキストを残します。

### **1234567890**.  '
*STATUS: ----not needed info-----* 
### **XXXXXXXXXX** Pro.......

このようにして、データの最初の列には2つの区切り文字「###」の間にeverythingが含まれ、最初の列には次のすべてが含まれます。

> **1234567890**.
> *STATUS: ----not needed info-----*

これだけではなく

123456789

最も簡単な解決策は、「STATUS」に別の区切り文字を追加し、「status」という別の列を追加することです。最終的には、4つの列とすべてのデータがきちんと分割されます。

あなたがこれを投稿してからかなりの時間が経過したことがわかります。これが役に立てば幸いです。おかしな書式設定についてはすべてお詫びします。以前にStackOverflowに投稿したことはありません。

8
user3217896