Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

列挙型の足算

例によって本当に学びの多いVBA100本ノックから。

excel-ubara.com

神髄さんの解答例からの学びをご紹介

学びヶ所

上記の神髄さんの解答例から学びがあった箇所を抜粋してみました。

Mid(s, i, 1) = StrConv(Mid(s, i, 1), vbNarrow + vbUpperCase)  

更に具体的に言うとvbNarrow + vbUpperCaseの部分です。


Msgboxの場合

私が列挙型の足算で思いつくのはMsgboxです。

例えば下記のようにすると

MsgBox "test", vbInformation, "テスト"

この様に表示される。
f:id:ExcelLover:20201220163054j:plain


次に第2引数に+ vbOKCancelを追加する

MsgBox "test", vbInformation+vbOKCancel, "テスト"

この様に表示される。
f:id:ExcelLover:20201220163112j:plain

列挙型の足算を行うことで複数の要素を同時に実行することが出来ます。


VbMsgBoxStyle列挙型一覧

msgboxの第2引数に使用できるVbMsgBoxStyle列挙型定数は下記のとおりです。

列挙型定数 定数 意味
vbOKOnly 0 [ OK ] ボタンのみ (既定値)
vbDefaultButton1 0 1 番目のボタンが既定 (既定値)
vbApplicationModal 0 アプリケーションのモーダル メッセージ ボックス (既定値)
vbOKCancel 1 [OK] ボタンと [キャンセル] ボタン
vbAbortRetryIgnore 2 [ 中止 ]、[ 再試行 ]、[ 無視 ] の各ボタン
vbYesNoCancel 3 [ はい ]、[ いいえ ]、[ キャンセル ] の各ボタン
vbYesNo 4 [ はい ] ボタンと [ いいえ ] ボタン
vbRetryCancel 5 [ 再試行 ] ボタンと [ キャンセル ] ボタン
vbCritical 16 重大なメッセージ
vbQuestion 32 警告クエリ
vbExclamation 48 警告メッセージ
vbInformation 64 情報メッセージ
vbDefaultButton2 256 2 番目のボタンが既定
vbDefaultButton3 512 3 番目のボタンが既定
vbDefaultButton4 768 4 番目のボタンが既定
vbSystemModal 4096 システムのモーダル メッセージ ボックス
vbMsgBoxHelpButton 16384 メッセージ ボックスに [ヘルプ] ボタンを追加する
VbMsgBoxSetForeground 65536 メッセージ ボックス ウィンドウを手前のウィンドウにする
vbMsgBoxRight 524288 テキストを右揃えにする
vbMsgBoxRtlReading 1048576 ヘブライ語アラビア語のシステムでテキストが右から左に読む形式で表示されるようにする


列挙型はvbOKOnlyのような文字列で表現されますが、実際の中身は上記表の定数の値、つまり数字になります。
数字なので先程のMsgboxは下記のようにしても正常に動作します。

MsgBox "test", 64 + 1, "テスト"

f:id:ExcelLover:20201220163112j:plain

StrConvの場合

私は今まで列挙型の足算というと上記のMsgboxしか思い浮かばなかったのですが、それ以外の列挙型でも足算で複数の条件と一度に指定することが出来ます。

それを気づかせてくれたのが冒頭で紹介した神髄さんの解答例です。

私は下記のようにネストしてStrConv関数を2回実行するようなコードを書きました。

StrConv(StrConv("abc",vbUpperCase),vbNarrow)

一方神髄さんのコードはStrConv関数の第2引数を足算することで一度に処理をしています。

StrConv("abc", vbUpperCase + vbNarrow)

Msgboxでは当たり前に使っていた列挙型の足算ですが、他でも使えるということが完全に盲点でした。


VbStrConv列挙型一覧

列挙型定数 定数 意味
vbUpperCase 1 文字列を大文字に変換します。
vbLowerCase 2 文字列を小文字に変換します。
vbProperCase 3 文字列のすべての単語の最初の文字を大文字に変換します。
vbWide 4 文字列の半角 (1 バイト) 文字を全角 (2 バイト) 文字に変換します。 東アジア ロケールに適用されます。
vbNarrow 8 文字列の全角 (2 バイト) 文字を半角 (1 バイト) 文字に変換します。 東アジア ロケールに適用されます。
vbKatakana 16 文字列のひらがなをカタカナに変換します。 日本のみに適用されます。
vbHiragana 32 文字列のカタカナをひらがなに変換します。 日本のみに適用されます。
vbUnicode 64 システムの既定のコード ページを使用して文字列を Unicode に変換します (Macintosh では使用できません)。
vbFromUnicode 128 文字列を Unicode からシステムの既定のコード ページに変換します (Macintosh では使用できません)。

これらの列挙型定数を足算することで、Msgboxのボタンをコントロールしたように、複数の変換条件を同時に表現することが出来ます。


まとめ

自分が知っていて使っている機能でも、このように正しい使い途を分かっていないものがあるんでしょうね。
この書き方でコードもスッキリしますし、他の事例でも使えないか調べて積極的に使用していきたいと思います。