エクセルVBAーーーSPLIT編(Split)メールから項目の抜き出し(1)

お仕事お手伝いの関係で,引き続きVBAをいじってます。

ある催しの受付処理をするのにHPのスクリプトから送られてくるメールを半自動で処理しています。処理に
は,エクセルのVBAを使ってます。次のようなメールが送られてきます。

〓このメールは自動送信でお送りしています。
以下のとおりフォームメールより送信がありました。
————————————————————
▼送信内容
————————————————————
お名前 = 佐藤太郎
ご所属 = 自宅
ご所属先電話 = 00000000000
メールアドレス = xxxyyy@dummy.com
申し込み種別 = 会員
所属支部 = ロサンゼルス県
登録番号 = 00999
会員番号 = 10000999
————————————————————
送信日時 : 2024/09/28(Sat) 19:22:00

このメールから,VBAで,お名前等に該当する佐藤太郎等を切り出し,エクセルの一覧表にしていました。
各項目を取り出しをするのに,次のようにしていました。

simei = Mid(Honbun, InStr(Honbun, "お名前=") + 4, InStr(Honbun, "ご所属=") - InStr(Honbun, "お名前=") - 4)

前処理で,空白と改行を除いたメール文面を Honbun に文字列として取り込み,該当する項目と次の項目
ではさむようにして目的のものをとりだしてました。
送られてくるメールの項目の順番や項目が同じならいいのですが,今回のように,項目の順番が変わってし
まうと,VBAのプロシャージャの方も変更しなくてはいけません。
そこで,メールの項目・順番が変わってもも,プロシャージャを変更しなくてもいいようにできないかとあ
れこれ,なやんでました。
昨日あれこれ悩んで,検索して,たどりついて解決にむすびついた,Split を使ってできそうなアルゴリズ
ム(そんな大それたものではないのですが・・・),手順をおもいつきましたので,備忘録がてら,まとめ
ておきたいと思います。

エクセルVBA-エラー処理

プログラムを作り始めて何年になるでしょうかね。就職して,2年目からですから,結構な年月になります。
当時は,PCのはじめで,やりたいことのほとんどは,BASIC と呼ばれる言語で,自作しないといけませんでし
た。そのうち,MS-DOS上で動くマルチプランやらwindoesで動くロータス123等がでてきました。確か,
ロータス123は,当時68000円か78000円ぐらいしたと記憶していました。おまけに,123は,
プロテクトがかけられていて,バックアップができませんでした。その後,コピーツール等がでてきて,バッ
クアップはできるようになりました。
それにしても,高かったです。ただ,自分でもプログラムを作ってましたので,それが作成されるまでの労力
を考えると,決して高くないと思ってました。素人の自分が作るプログラムと,その高いプログラムはどこが
ちがうのでしょうか。もちろん完成度もあるのですが,素人とプロでは,エラー処理が格段に違います。プロ
は,考えるすべてのエラー処理をしていますが,素人の私が作るものは,動けばいい,というレベルのもので
す。
ただ,作るにあたっては,最低限の処理が必要になります。たとえは今,仕事のお手伝い関係で自作している
エクセルvbaのサーチのプロシャージャ(プログラム)でも,目的の項目がサーチできなかった時は,どうす
るかの処理ぐらいは必要になってきます。
そんな訳でエラーの時に,

XFD1048576

を返すものを作りました。この数字はなにかというと,
エクセルの表の最右列・最下段のセルということで,一番端っこのセルの番地を表す数字です。なぜ,この
この数字を使ったのかと言うと,昔BASICでプログラムをくんでいた時のなごりで,エラー処理に普段
出てこない,9999とか言う数字を使った名残です。(確か何年構えに2000年問題ということで,
話題になりましたね。これも。エラー処理に1999という数字を使っていて,ためですね)
ところが,デバックしているときにまたまた,はまりました。わざとエラーを起こしても,XFDが返って
こないのです。返ってくるのは,16384という数字が返ってきてしまいます。あれこれやりましたが,
肝心なこと忘れてました。使ったのは,Column というプロパティですが,当たり前ですが,このプロパテ
ィは,数字を返すものでした。ネット検索で,

Split(Columns(列番号).Address, “$”)(2)

のようにやって,やっと目的のXFDが返ってきました。長かったです。

下記がXFD1048576を返す,関数です,といってもぱくりです。

Public Function Search(ByVal rng As Range, ByVal keyWord As Variant, ByVal Whole As Boolean)
   Dim r As Range
    If Whole Then
        For Each r In rng
            If r.Value = keyWord Then
                Set Search = r
                Exit Function
            End If
        Next
    Else
        For Each r In rng
            If InStr(r.Value, keyWord) > 0 Then
                Set Search = r
                Exit Function
            End If
        Next
    End If

    Set Search = Range("XFD1048576")←←エラー処理です。
            
End Function

デバックに使ったプロシャージャです。

MsgBox Split(Columns(Search(rng, "******", True).Column).Address, "$")(2)