ここはトレードとプログラミングのサイトだよ!
でもメインは雑談だ ^_^;
2025年 9月15日 15時42分
いよいよ・・・ これから『終わりの始まり』がやってくるのかもしれない・・・
VBAなのだ。
ボクは、よく正規表現を使う。
VBAで正規表現となると、VBScript.RegExpをCreateObjectで読み込んでて・・・ ってのが一般的だと思う。
なんとそのVBScript.RegExpが、もっと言うとVBScriptを廃止にするとマイクロソフトから公式に発表されたとのことらしい。
2027年からだったかな?
    
マイクロソフトのメーラーソフトと言えば、Outlookだ。
Officeファミリーの1つだ。
ボクはOffice 365ユーザでVBA使いだ。
なのでOutlookにもVBAが組み込まれて今までも、もちろんOutlook VBAは使ってきた。
そのOutlookに、現在、右上の方に『新しい Outlook を試す』ってのがある。
なので試したところ、なんか違和感。
ソフトウェアというよりもガシェットというか・・・
どうもWEBベースのアプリらしい。
まぁ、それはいいのだが、開発タブがない!
いろいろと調査の結果、時期OutlookよりVBAが消えるとのこと・・・
    
やっぱりOfficeファミリーのメインと言えば、Word,Excel,Accessの3製品だろう。
これらに関しては、今のところ今後もサポートは続けていくとのこと。
ただそのExcelにしてもExcel in Pythonなるものが出てきたり・・・
まぁ、これに関しては完全にVBAの互換というわけでなく、ボクの感覚ではシート関数みたいなモノになるのかな?
    
また製品版というのかな?
マイクロソフトの統合開発ツールと言えば『Visual Studio』なのだ。
以前はVisual C++,Visual Basicがツートップというか、ちょうどJavaがブームになった頃はVisual J++なんて開発言語があったが
その後に.NETが出てきてメンバーもガラリと変わってVC++.net,VB.net,VC#.netに・・・ 2000年当初の話だ。
時間が流れて、2020年にVB.netは完全に新規機能の開発を止めたとかで・・・
    
まぁ、製品版のVBが止まってしまったってのは.NETが出てきた時点で覚悟は出来ていた。
だからこそVBAの方に流れていったのだが、とうとう、そのVBAも終わりに向けて動き始めたという感じなのだ。
    
もっと突き詰めて言えば、ボクの仕事がなくなる・・・
ボクの飯の種がなくなる・・・ ってことなのだ。
あと15年・・・ いや、10年!
VBA、現役で活躍してくれんかなぁ~・・・
    
最近、急にモチベーションが落ちた一因の一つだったりする話だ。
2025年 8月26日 18時00分
てなわけで。
みんな、VBAやってる?! ^_^;
別にねぇ~・・・ むちゃくちゃ人よりもVBAができるってわけでもないが。
まぁ、それでもそこそこ経験も知識もあるよなって程度くらいはねって感じ程度の自覚あり。
だけれど、やっぱ知らんもんは知らんのよねぇ~
逆にある程度知ってる分、それ以上は深入りしないというかさ、知らんくても他のやり方でなんとかなっちゃったりしちゃうからね。
まぁ、今回はある意味、ボク自身の無知を晒すようで恥ずかしい内容かも? ^_^;
Optional句の罠
これはね、今もボク自身、『そうだっけ?』って感じなのだが・・・
自作プロシージャを作る時、多くは引数を伴うと思う。
またそのように引数という形で与えても、実際は多くの機会でデフォルト値みたいな固定の値でほとんどの場合大丈夫だが
時たま違う値をその引数に与えたいということは多々経験していると思う。
そこで役に立つのがOptional句なのだ。
というか、今回はある程度VBAが判ってる人たち向けってことで、詳細は省こうと思う。
話は飛ぶが、ボクはよくラッピングして自分専用のライブラリを作る。
これくらいはみんなもよくやるんじゃなかろうか?
一例(てか、こいつでボクもハマッたんだけどね)として、MsgBox関数なのだけれど。
MsgBox メッセージ, [ボタンスタイル], [タイトル], [ヘルプファイル], [コンテキスト]
まぁ、基本的な関数だからこれも説明いらずだろうが・・・
メッセージ以下、コンテキストまでが引数だ。
そんで [・・・] と、大カッコ(っての?)で括られている箇所は、いわゆる・・・ ここでもOptionalって言って良いのかな?
指定をしてもしなくても良い引数だよね。
つまりMsgBox関数おいて、必ず指定をしなければいけない引数はメッセージだけだ。
そこでこいつのラッピングって、どういうこと?ってなると思うが・・・
インフォメーションアイコンにしろ、クエスチョンアイコンにしろ、エクスクラメーションアイコンにしろ、指定する時のキーワードが長いじゃん?
それに加えてボク自身、英語が大の苦手さ、スペルが覚えられんのよねぇ~
たしかにVBAにはインテリセンス機能が備わっているから、そこまで気にすることはないのだろうけれど。
それ以上にやっぱ長さだよね、手入力によるわずらわしさの解消のためにも、つまりさらに楽になるようにラッピングをしているわけだ。
ちなみに、ボクがよくやるのは・・・
例えばインフォメーション(情報)アイコン,エクスクラメーション(注意)アイコン,クリティカル(障害)アイコン
これら3つのメッセージボックスの返し(ボタンスタイル)は vbOK の固定にしちゃって・・・
メッセージは引数という形で与える。
タイトルは、基本的に作ったツールのタイトルをグローバル定数(gcTitle:gcはグローバル定数に付ける接頭辞 by マイルール)という形にして与えちゃう。
だからこいつ(gcTitle)は、グローバル定数を定義してるとこにまとめて定義するよ。
そんでこれを・・・
例 インフォメーションメッセージボックス
'==================================================================================================== ' Public Subプロシージャ '==================================================================================================== Public Sub MsgInf(ByVal pMsg As String) Call MsgBox(pMsg, vbInformation, gcTitle) End Sub
このような自作のプロシージャを作っちゃう。
これを見てピンッと来る人もいるだろうが、この他にvbExclamation,vbCritcalも作って、それぞれMsgExc,MsgCriという自作プロシージャ事前に作っておいて、それを一つのライブラリとしてまとめている。
これだとね、いちいち MsgBox(pMsg, vbInformation, gcTitle) と長ったらしく書かなくて MsgInf(sMsg) と済むし、
あと、これならボクのように英語が苦手でも Inf,Exc,Criと書けばそれだけで各メッセージボックスの書き分けも済むわけだ。
まぁ、似たようなこと、やってる人も多いと思うけど・・・
マネしていいよ! ^_^;
さぁ、次は今回のメインであろうクエスチョンメッセージボックスだ!
'==================================================================================================== ' Public Functionプロシージャ '==================================================================================================== Public Function MsgQue(ByVal pMsg As String, _ Optional ByVal pDefBTN As VbMsgBoxStyle = vbDefaultButton1, _ Optional ByVal pDefStyle As VbMsgBoxStyle = vbYesNo) As VbMsgBoxResult '***初期化*** If pDefBTN = 0 Then pDefBTN = vbDefaultButton1 End If If pDefStyle = 0 Then pDefStyle = vbYesNo End If MsgQue = MsgBox(pMsg, vbQuestion + pDefStyle + pDefBTN, gcTitle) Public Sub
今回、メインの『Optionalの罠』の正解(?)を先に書いちゃうが、上の自作のMsgExcプロシージャなのだ。
ここで間違ったプロシージャの定義を・・・
'==================================================================================================== ' 間違ったプロシージャ '==================================================================================================== Public Function MsgQue(ByVal pMsg As String, _ Optional ByVal pDefBTN As VbMsgBoxStyle = vbDefaultButton1, _ Optional ByVal pDefStyle As VbMsgBoxStyle = vbYesNo) As VbMsgBoxResult MsgQue = MsgBox(pMsg, vbQuestion + pDefStyle + pDefBTN, gcTitle) Public Sub
この違い、わかるかな?
繰り返すが、まぁ、ボクが不勉強だっただけなんだけれどさ。
ボクはここで、デフォルトでフォーカスするボタンの位置とボタンの種類を引数として与えている。
且つ、基本的にクエスチョンメッセージボックスは はい/いいえ(vbYesNo)として、フォーカスは はい になるように、Optional句を引数:pDefBTN,pDefStyleを加えている。
つまり基本的なクエスチョンメッセージボックスだけを使いたい場合
Call MsgQue(sMsg)
このように書けば済む・・・ と、想定していたんだよね。
Optional句を付けると省略できて、例えば・・・
pDefBTN As VbMsgBoxStyle = vbDefaultButton1
上記で言えば、引数:pDefBTNを省略すれば vbDefaultButton1 が自動的に指定される・・・
ところがだ!
なんか想定外のことが起きちゃったんだよ。
ボタンスタイルが vbYesNo となるはずなのに vbOKOnly を指定してる状態になったり、確実に vbDefaultButton2 と指定しているのに vbDefaultButton1 が指定されている状態に・・・
もう、わけがわからん?!
調べてみたら・・・
MsgBox関数の引数:ボタンスタイル
 = アイコンの種類 + ボタンの種類 + 規定ボタン(フォーカスさせたいボタンの位置)
さらに言えば順不同・・・ なんだが、まぁ、これも詰める必要はなかろう。
さぁ、とにかくなんで上手くいかんかったのか?
それはMsgBox関数の引数:ボタンスタイルが合算タイプのフラグ、これ自体が原因だったのさっ!
これが引数が文字列であれば・・・ 合算タイプでなければ・・・
Optional句で、指定したデフォルト値をそのまま持ってきてくれる。
だが合算タイプだと、引数:pDefStyleを省略した場合、デフォルト値が 0となってしまうこともあるらしい。
これで間違ったプロシージャを見てもらいたいのだが、こっちはデフォルトでvbYesNoとなっていると思っている。
その状態でフォーカスを いいえ に当てたいので引数:pDefBTNに vbDefaultButton2 を指定してやったのだが、引数:pDefStyleが 0 となってしまうとそれは vbYesNo ではなく vbOKOnly てあり、つまりボタンは1つだけだから引数:pDefBTNに vbDefaultButton2 を指定とかぜんぜん意味なし!
それを踏まえて正しい方のMsgQueプロシージャを見てほしい。
プロシージャの取り込みの部分で省略時は 0 として、そのプロシージャの中でIf文で値が 0 の時に改めて値をセットしているわけだ。
これを知るまで、もぉ~なんでぇ?!って状態でねぇ・・・
でもね、以前は間違ったプロシージャの定義の仕方でも、狙った通りの動作をしてたような記憶もあり・・・
それが最初の方に書いた『そうだっけ?』って歯がゆい思いになっているのだ。^_^;
これが今回ボクがハマった『Optionalの罠』なのだが、どうだったかな?
「そうだったのかぁ~」,「そういうことがあるんだっ?!」だった?
それとも「それって当たり前じゃん?」,「かぶくんまんってそんなことも知らなかったのぉ?!」だったのか?
こんなんボクでも、まだまだVBAと共に生きていくのだ・・・