Accessで正規表現を使いたかったのですが、ネット上にはサンプルが少なく、苦労したので、とりあえずツギハギで作った私のコードを披露したいと思います。
Accessで正規表現を使うには、BASP21を使う方法と、RegExpを使う方法がありますが、自分の場合、メール送信にBASP21を使わせていただいているので、まずは、こんな感じでBASP21の正規表現を使えないか、テストしてみました。
[code]
Public Sub test99()
Set bobj = CreateObject("basp21")
out = bobj.MatchEx("/あい./k", "あいうえお", 0)
Debug.Print out(2)
End Sub
[/code]
・・・何度やっても取り出せるのは、「あいうえお」の「えお」になり、「う」がどこかに消える。
マニュアルを読んで、Kオプションをつけているのにダメ。
英語だけだとうまくいった。うむむ。
そこで、BASP21を諦め、Accessの参照設定でMS VBScript Regular Expressionsにチェックして、RegExpを使うことにした。
そうして書いてみたコードが下になる。
メールの読み込みにはBASP21を使わせてもらうけども、文字列解析と取り出しにはRegExpを使う。
[code]
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
[/code]
「ご注文番号 : 」のところはわかりにくいと思いますが、やりたかったことは、メール文中の「ご注文番号 : 115383」から「115383」だけを取り出そうと思ったら、こうなる。
うまくいって、満足だ。
さて、1.メールの読み出し、2.メール分から必要事項の取り出し、ときて次は、3.テーブルに書き込み、としたいんだけど、それはまた後日に。
読み出し時に、メールを新着分に限定したり、特定のタイトルで絞ったり、返信を除外したり、する必要があるな。
テーブルへの書き込み時に、同一注文番号があれば除外するか上書きするか(注文訂正があった場合など)、選択できるようにしたほうが良いかな。
(などと、面倒そうなので)