IT仕事 MS Access

AccessとBASP21で正規表現を使ってメール文から必要事項を取り出すサンプル

投稿日:2017年4月13日 更新日:

Accessで正規表現を使いたかったのですが、ネット上にはサンプルが少なく、苦労したので、とりあえずツギハギで作った私のコードを披露したいと思います。

Accessで正規表現を使うには、BASP21を使う方法と、RegExpを使う方法がありますが、自分の場合、メール送信にBASP21を使わせていただいているので、まずは、こんな感じでBASP21の正規表現を使えないか、テストしてみました。

Public Sub test99()
    Set bobj = CreateObject("basp21")
    out = bobj.MatchEx("/あい./k", "あいうえお", 0)
    Debug.Print out(2)
End Sub

・・・何度やっても取り出せるのは、「あいうえお」の「えお」になり、「う」がどこかに消える。
マニュアルを読んで、Kオプションをつけているのにダメ。
英語だけだとうまくいった。うむむ。

そこで、BASP21を諦め、Accessの参照設定でMS VBScript Regular Expressionsにチェックして、RegExpを使うことにした。

そうして書いてみたコードが下になる。
メールの読み込みにはBASP21を使わせてもらうけども、文字列解析と取り出しにはRegExpを使う。

Public Sub testReceiv()

Dim bobj, ar
    Dim Server As String, User As String, Pass As String, Command As String
    Set bobj = CreateObject("basp21")              ''BASP21オブジェクト
    Server = "xxxx.com"                       ''POP3サーバー
    User = "xxxx"                           ''アカウント名
    Pass = "xxxxx"                              ''パスワード
    Command = "SAVEALL"                            ''コマンド
    
    bobj.CodePage = 65001 ' WebArenaサーバではこれをつけないと文字化けして読めなかった。CPIサーバは不要だった。
    ar = bobj.RcvMail(Server, User, Pass, Command, ">c:\temp")
    If IsArray(ar) Then
        Para = "from:subject:"
        For Each Mail In ar
            retv = bobj.ReadMail(Mail, Para, Folder)
            If Not IsArray(retv) Then
                MsgBox "メールの受信に失敗しました"
            Else
                Debug.Print (0)    ''From
                Debug.Print retv(1)   ''Subject
'                Debug.Print retv(2)   ''Body
                
'               BASP21の正規表現ではうまくいかなかった部分
'                out = bobj.MatchEx("m/HP/k", retv(2), 0)
'                Debug.Print "* " & out(2)
                
'               AccessのRegExpで文字列解析
                Set re = CreateObject("VBScript.RegExp")
                sPtn1 = "(ご注文番号 : )(.*)"
                With re
                    .Pattern = sPtn1
                    .Multiline = False '一行のみ
                    .Global = True
                    Set mc = .Execute(retv(2))
                    Debug.Print mc.Count 'カウント
'                    Debug.Print mc(0)
                    Debug.Print mc(0).SubMatches(0) '検索文字
                    Debug.Print mc(0).SubMatches(1) '検索文字の後ろから右端までの文字
                End With
            End If
        Next Mail
    Else
        MsgBox "新着メールはありません"
    End If
    Set bobj = Nothing
End Sub

「ご注文番号 : 」のところはわかりにくいと思いますが、やりたかったことは、メール文中の「ご注文番号 : 115383」から「115383」だけを取り出そうと思ったら、こうなる。

うまくいって、満足だ。

さて、1.メールの読み出し、2.メール分から必要事項の取り出し、ときて次は、3.テーブルに書き込み、としたいんだけど、それはまた後日に。
読み出し時に、メールを新着分に限定したり、特定のタイトルで絞ったり、返信を除外したり、する必要があるな。
テーブルへの書き込み時に、同一注文番号があれば除外するか上書きするか(注文訂正があった場合など)、選択できるようにしたほうが良いかな。
(などと、面倒そうなので)

-IT仕事, MS Access

執筆者:

関連記事

no image

Amazonツール注文情報取得シートでListOrderで想定しない値エラー

会社では商品をAmazonでセラーとして販売している。 宅急便の伝票を作るときに注文情報(ListOrders)をExcelでCSVで出力できないかなあと、何かのツールを探していて、以下にたどり着いた …

no image

Excelグラフの軸ラベルを折り返したい

Excel2007で、グラフの長いラベル文字の折り返しを2行にしたい。 しかし設定ダイアログには項目がない。 がんばって試行錯誤して、何とかうまくいったものの、とても尋常ではないやり方。 しかしこれし …

no image

Accessのフォームを開く際、acHiddenとVisibleの組み合わせで高速化

Accessのフォームを開く際、acHiddenとVisibleの組み合わせで高速化 Accessのとあるシステムで、 フォームを開いてフィルタをセットして実行してさらに並べ替える・・・という処理をし …

在庫らくだのメニュー部分を、UiPathで操作する->うまくいったり、いかなかったり

テスト中は、うまくいったものが、本番では、うまくいかなくなったり(うまくいくことも、たまに)。 UiExplorerでタグを調べたり、クリックを偽装したり、待機時間を入れてみたりと、いろいろ試してみた …

Access「実行時エラー3061 パラメータが少なすぎます。2を指定してください」で意外な決着

クロス集計クエリをVBAで読むときで、かつパラメータクエリを使う場合には、クエリのパラメータパネルで、別途、パラメータを指定しなくてはならない(VBAで使わないなら不要) 本日のトラブルは、その後、W …