例によって本当に学びの多いVBA100本ノックから。
神髄さんの解答例からの学びをご紹介
学びヶ所
上記の神髄さんの解答例から学びがあった箇所を抜粋してみました。
Mid(s, i, 1) = StrConv(Mid(s, i, 1), vbNarrow + vbUpperCase)
更に具体的に言うとvbNarrow + vbUpperCaseの部分です。
Msgboxの場合
私が列挙型の足算で思いつくのはMsgboxです。
例えば下記のようにすると
MsgBox "test", vbInformation, "テスト"
この様に表示される。
次に第2引数に+ vbOKCancelを追加する
MsgBox "test", vbInformation+vbOKCancel, "テスト"
この様に表示される。
列挙型の足算を行うことで複数の要素を同時に実行することが出来ます。
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, "テスト"
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のボタンをコントロールしたように、複数の変換条件を同時に表現することが出来ます。
まとめ
自分が知っていて使っている機能でも、このように正しい使い途を分かっていないものがあるんでしょうね。
この書き方でコードもスッキリしますし、他の事例でも使えないか調べて積極的に使用していきたいと思います。