エクセル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)

プラグイン XOスライダー

画像を並べて横にスライドさせたいなと思ってあれこれやりましたが,うまくいきませんでした。
「XOスライダー」なるプラグインを使ってみるとほぼ思っていた動作ができましたので,
掲載します。
このプラグインを使うと,下記の写真のような表示ができます。

20本ぐらい準備します。
水洗いします。
カットします。
塩を振りながら,タッパーにいれます。
30分ぐらいおきます。
水気を切って,出汁にいれます。
一煮立ちするまで加熱します。
広めの鍋に移してさまします。
出汁は5分ぐらい,煮詰めます。
濾しながらタッパーにいれます。
冷えたキュウリをうつします。
ごまをいれます。
ショウガをいれます。
鷹の爪をいれます。
よくまぜます。
ラップをかけて冷蔵庫で保存します。

FlashAir 不具合

しばらく便利に使ってましたが,あるときから,自動転送ができなくなってました。思い当たることがなかっ
たので,どうしたものかと思ってましたが,FlashAirの config をみてみました。すると config に次の
記載があるのにきづきました。

folder = “/DCIM/105NIKON”

つまり,画像が保存されるのが,DCIM/105NIKON のホルダーで,ここに書き込まれた画像データが転送さ
れる設定になってました。しかし,写真を撮りためるうちに,DCIM/105NIKON に保存できるデータの上限をこえたため,/DCIM/106NIKON というホルダーが新規に作成され,ここに保存されるようになってまし
た。それで,自動転送されなくなっていました。どれくらい保存されると新しいホルダーが作成されるか,わ
かりませんが,原因が分かったので,これからは対処できます。

インターネット接続不具合

新しいルーターに変更してから,インターネット回線が時々切れたりする症状がではじめました。原因が分か
らずしらみつぶしにしらべました。
最初,前に買い換えたルーターが原因かと思いましたが,取り替える前のルーターと変えても,症状がかわり
ませんでした。念のために,LANケーブルテスターで,ケーブル関係を調べてみましたが,異常なし。

ということで,NTTドコモの修理に連絡をして,あれこれ確認をさせられました。結果,ONUのLANコネク
ターのところに付くはずのLEDの点滅がしていなくて,どうやら,ケーブル関係とやっと原因が分かりまし
た。

我が家は,

  ONU(ルーター)→→光コンセット(納戸)→→LANケーブル→→LANコンセット(居間)→→ルーター

と接続してあります。LANケーブルは,屋根裏を通してあります。屋根裏のLANケーブルの断線が一番やっか
いだと思ったのですが,我が家にネズミはいないので,あとは,コンセットのLANケーブルの接続かなと思い
ましたが,今問題なく使えてたので,それは考えにくかったのです。まだ,原因は特定できてないのですが,
多分LANケーブルのコネクター,の結線か,ONUのLANコネクターの接触不良,あたりが原因と推測されます。

ONUを見てもらおうかとも思ったのですが,修理にだいしている間,ネットに接続できなくなるので,様子を
見ることに。いままで,ONUの一番上のポートに接続していましたが,接続場所を3番目にすると,無事,
LAN接続のLEDも点滅するようになりました。

無事,ネットにつながりました。不安はありますが。このまま様子を見たいと思います。

エクセル(関数 文字列の分割 空白区切り)

手伝いでやっている仕事関連で,エクセルをいじっています。疑問点があったので,「教えてGoo」の記事を
みていました。
すると,空白区切りの文字列を分割するには,どうすればいいのか,という,投稿
がありました。

写真のように,一つのセルに入っているデータを空白を区切りに,セルごとに分割したいとのことでした。
VBAを使って,

  〇空白の数を数える。
  〇空白が先頭から何番目にあるか調べる。
  〇先頭から,最初の空白の前までの文字を切り出す。
  〇2番目と3番目の空白の間にある文字を切り出す。
  〇3番目を4番目の空白の間にある文字を切り出す。
  〇4番目と5番目の空白の間にある文字を切り出す。
  〇5番目の空白以降の文字をきりだす。

というようなことをやればできそうに思えましたが,なんと,この作業を1行の関数でおこなってる諸兄がい
ました。

  =TRIM(MID(SUBSTITUTE($B2, ” “, REPT(” “,LEN($B2))),(COLUMN(A1)-1)*LEN($B2)+1, LEN($B2)))

この1行の関数をC2のセルにいれて,Hのセルまでドラグしてコピーすると分割ができてしまうのです。

何をやっているのか,関数をしげしげと並べて,自分なりに解釈してみました。

 REPT(“ ”,LEN($B2))

で,元々文字列分の空白を作ります。
その後,一文字の空白と,文字列長分の空白を入れ替えます。

SUBSTITUTE($B2, ” “, REPT(” “,LEN($B2)))

この入れ替えた,文字列の先頭から,文字をきりだします。

MID(SUBSTITUTE($B2, ” “, REPT(” “,LEN($B2))),(COLUMN(A1)-1)*LEN($B2)+1, LEN($B2))

切り出す際に,

(COLUMN(A1)-1)*LEN($B2)+1

で,どこから切り出すかを決めています。うまい具合に,COLUMN(A1)のA1の部分は,コピーするたびに,

A1→B2→C2→D3→E5

のように,エクセルの方で,相対的に移動してくれます。結果,切り出し開始位置が,文字長分だけずれてくれます。
結果

COLUMN(A1)→1
COLUMN(B1)→2
COLUMN(C1)→3
COLUMN(D1)→4

のようにCOLUMNの値が増えていきますので,切り出し開始位置が文字長だけずれていきますので,一番目,2番目
と切り出すことができるようです。

最後に

TRIM( )

で,余分な空白を削除すれば,完成です。

写真は,空白を「*」に置き換えて表示しています。

しかし,頭の良い方は,考え方がちがうのですね。余分な空白をいれて,一気に切り出して,余分なものを取
り除くことで目的をはたしているのですごいと思いました。

WINDOWS10 起動時間の改善

このところ,普段使ってるPCの起動時間が長くなってるようなきがします。壁紙表示されるまでの時間を計る
と,50秒~60秒程度かかります。
SSDに換装したときは,もう少し早く起動できたようなので,NETでくぐってあれこれやってみました。

起動が遅い!Windows 11/10でSSDの起動に時間がかかる

を参考に,順不動にやってみましたが,なかなか改善しませんでしたが,

   方法1.起動時に不要なサービスを無効にする
   方法2.高速起動をオンにする
   方法3.4KアライメントでSSDを管理し、起動をより速く
   方法4.SSDのシステムクリーンアップを実行する
   方法5.スタートアップ時にブロートウェアやサービスをロードしないようにする

方法4の.SSDのシステムクリーンアップを実行するで,約20秒ほど早くなりました。
残すは,

   方法6.仮想メモリを調節/増加する

ですが,これはシステムの自動にまかせます。

ブルートースが突然使えなくなる

本日,お手伝いの仕事で使い終わったPCの電源を落とし,しばらくして,再起動しました。すると,何と,
何と,

ブルートース

が使えなくなりました。なんで分かったかというと,ブルートース接続のトラックボールが使えなくなってい
たのです。

早速ネットでグクッてみると,結構あるようで,その対処方がいろいろでてました。

高速シャットダウンの設定をやめたり,ブルートースのドライバーを削除したりしてみましたが,一行に改善
されません。ある記事に,シャットダウン後,電源プラグを抜く,というのがありましたので,これもやりま
したが,だめです。そこで,電源関係ならと,電源を落として,ついでに,内蔵バッテリーをはずして,つけ
なおしました。

結果

見事復活です。

通常,あるハードのドライバーを削除しても,再起動等で,自動でインストールされるのですが,今回は,だ
めでした。手こずりましたが,めでたし,めでたし。

スマホ用の画面が崩れるーーWP

CやVBAのコードを見やすくする Highlighting Code Block というプラグインをインストールしました。
おかげ様でコード等は見やすくなりましたが,困った問題が一つ発生です。
それは,今まで,何のても加えずに,スマホ等でもそれに応じた画面の表示ができていたのですが,PCの画面
が表示されるようになりました。
このWPも多少手を加えて,投稿記事を~で囲めばPC用の表示に,で囲めばスマホ用の画
面になるようにしていましたがそれもできなくなりました。
あれこれやりましたが,PCとスマホ用で使用するテーマを変更するために,Multi Device Switcher という
プラグインを導入しました。PCの画面とは,イメージが違ってしまいますが,今までと同じようにスマホでも
画面の全部が表示できるようになりました。

コードの表示も問題なさそうです。

お散歩グッズの修理?

このところ,夜にお散歩(ウォーキング)をしています。そのとき,安全面を考えて,名前は分かりませんが
LEDで点滅するグッズを身につけています。

買った時からどうもスイッチの感度が悪く,スイッチを入れるのに,かなり,押し込まないと点灯しませんで
した。
そこで,修理といえるほどではないのですが,分解して,接点をお掃除することにしました。

写真の四つのねじを外して,カバーをとります。

基盤ば見えますので,この基盤を裏返しします。

この基盤にスイッチがあります。押すとペコペコと音がする5mm程度金属がスイッチです。

画像はあまりよくないのですが,この金属のカバー?と基盤の間に隙間がありますので,そこを,エアダス
ターで何回かブローして,接点回復剤で,さらにスプレします。最後にエアダスターで,余分な接点回復剤
をタブローします。電池を入れて,テストして問題なかったので,戻します。

今回は,近くのHCで入手したKUREの2-26を使いましたが,〇MAZONには,専用の回復剤もある
ようですが,どれがいいのかは,わかりません。お掃除?の結果,今までの動作が嘘だったかのように,軽い
力で操作ができるようになりました。本当なら,ペコペコする金属を基盤から外して,接点を掃除した方がい
んでしょうけど,か細い爪で基盤に付いているだけなので,それを曲げて取り外すのが怖くで,基盤にすいた
ままのお掃除でした。