質問するログイン新規登録

Q&A

解決済

1回答

420閲覧

VBA内部で持つブーリアン型がよく分からない

chintao1224

総合スコア158

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2026/01/01 05:25

0

0

実現したいこと

VBA内部でもつブーリアン型が何なのか知りたいです。
VBAのブーリアン型は既定値がFalseです。
でも無限ループではTrueのような気がします。
VBA内部では無限ループのときだけTrueになったりするのでしょうか。
よろしくお願いします。

前提

無限ループを書いてみてどう動くか確認していました。

該当のソースコード

vba

1Private Sub CommandButton1_Click() 2 Do While True 3 Debug.Print "DoWhile OK"            'ココが動く 4 Loop 5 Do Until True 6 Debug.Print "DoUntil OK"             ’ココは動かない 7 Loop 8End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

dodox86

2026/01/01 05:51

> でも無限ループではTrueのような気がします。 そんなことはありません。VBAのDo文における"Until"の使い方、理解の問題です。"Until"について調べてみてください。英語におけるuntilは「~になるまで」、転じて「式の評価の結果が偽/Falseである間」になります。 公式の情報はこちら。 https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/doloop-statement
chintao1224

2026/01/01 06:12

実際動くのはDoWhileのループです。DoUntilがtrueになるまで(falseである間)ならブーリアンの既定値falseなのでDoWhileは動かずDoUntilが動くはずです。しかし実際動いているのが逆になっています。
meg_

2026/01/01 07:58

「ブーリアンの既定値」の解釈が何か違っているのではないでしょうか?
u2025

2026/01/01 07:59

ブーリアン型の規定値とwhile, untilの話は分けてる考えていいかと思います。 そのていで、whileはブロックを抜けようとするとき、与えられた式がtrueならもう一度実行し、untilならその逆というのが仕様です。ifに置き換えてみると、 ``` StartLoop: Debug.Print "DoWhile OK" If True Then ' While Trueと同じ意味 GoTo StartLoop ' ココでスタートに戻る End If ``` になります。 そして、もし、DoWhileはFalseを与えられたらループするという意味で解釈しているならそれはたんなる間違いです。
fiveHundred

2026/01/01 08:02 編集

Do Whileが動作するのは、明らかに正常な動作です。 おそらく、あなたの認識が真逆なのでしょう。 Do Whileは - Trueの時に動作する/ループを行う - Falseの時にループから抜ける であり、Do Untilはその逆です。
TakaiY

2026/01/01 09:15

いろいろ書いてありますが、 >VBAのブーリアン型は既定値がFalseです。 は、「VBAのブーリアン型**の変数の**は既定値がFalseです。」が正いので、質問者さんの解釈や考えかたが間違えているのでしょう。 そして、質問のコードにはブーリアン型の変数が出てきませんので、既定値がどのようになっているかの判定にもなっていません。 と書いていたら、回答に同様のことが書いてありました。
guest

回答1

0

ベストアンサー

コメントで色々やり取りがありますが
勘違いの点を推測して回答します。

TrueというのをBooleanの変数と勘違いしているのではないでしょうか。
Trueと記載すると、それは変数ではなく、Trueの値を持つ定数になります。
Trueの値を持つわけなので、FalseはなくTrueになります。
Falseとプログラムに記述すると質問者さんの想像通りの動きはすると思いますが
それは変数の規定値がFalseだからではなく、Falseという定数を使っているからそのように動くという事になります。

Trueは定数です。Long型の1や、String型のvbCrLfみたいに値を指しています。
変数ではありません。

よって質問文に提示したような動きになります。

Booleanの変数で規定値がFalseであることを確認するループであれば以下のようなコードが良いでしょう。

VBA

1Private Sub CommandButton1_Click() 2 Dim pBoolean As Boolean 3 Do While pBoolean 4 Debug.Print "DoWhile OK" 'ココが動かない 5 Exit Do 6 Loop 7 Do Until pBoolean 8 Debug.Print "DoUntil OK" 'ココは動く 9 Exit Do 10 Loop 11End Sub

これで、Boolean型の変数pBooleanの規定値がFalseであることを確認出来るかと思います。

さて。どうでしょうか。
外していたらごめんなさい。

投稿2026/01/01 08:57

xail2222

総合スコア1545

chintao1224

2026/01/01 10:05

仰られていることは確かにと思いました。 確かにブーリアンの既定値は、あくまで変数の既定値がFalseでした。 申し訳ございませんでした。 すみませんが、もう少し教えてください。 Do WhileのDebug.Printが動くということは、CommandButton1_Clickはイベントに入って直ぐはTrueになっているということで、ブーリアンの変数の既定値はfalseだが、プロシージャでの初期値はtrueと考えてよいということでしょうか。 はじめはプロシージャの初期値がブーリアンの既定値となっていると想像していたので質問しましたが、確かにブーリアンは変数の既定値がfalseでした。 ブーリアンの変数の既定値とは別にプロシージャの初期値がありtrueと考えてよいと捉えてよいでしょうか。
xail2222

2026/01/01 10:41 編集

>Do WhileのDebug.Printが動くということは それは、質問者さんのコードでは Do While True と記載されているからです。 このTrueという単語は、変数ではありません。 Trueという値を持つ定数です。 プログラムのどこであれ、Trueと書けば、それはTrueです。 私が提示したサンプルコードでは Do WhileのDebug.Printは動きません。 繰り返しになりますが プロシージャの初期値だけではなく プログラムのどこであってもTrueというコードは、Trueの値になります。 追記します。 Do While 1=1 というのと Do While True というのは同じような意味になります。 Do While Trueと言うのは 隠れたBooleanの変数とTrueを比較しているわけではありません。 もう少し正確に言いますと Do While <式> というのは、<式>がTrueと評価される時は内容を繰り返す。という意味になります。 <式>にTrueと書けば、それは常にTrueと評価される式になります。 さて、伝わるでしょうか。
chintao1224

2026/01/01 11:49

仰っていることは分かっています。 が、それではDo Untilのループが動かないのが分かりませんでした。 もう一度考えてみたのですが、もしかしてDo While trueはDo Until falseと同じということでしょうか。 無限ループでDo While trueと書くのですが、これはDo Until falseと書くのと同じということでしょうか。
xail2222

2026/01/01 12:05

fiveHundredさんが言っていた通りですが >無限ループでDo While trueと書くのですが、これはDo Until falseと書くのと同じということでしょうか。 同じ動きになります。 なぜ2種類あるかについては、可読性をよくするため。とか考えるといいかと思います。
chintao1224

2026/01/01 12:07

回答ありがとうございます。 問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問