ACCESS VBAのメッセージボックスに表示される日付について解説

このQ&Aのポイント
  • ACCESS VBAの勉強をはじめました。下のプロシージャを実行するとメッセージボックスに「2018/08/30」と出るようですが、なんでそうなるのかが分からない。
  • Loopは繰り返し処理を行うため、繰り返し回数を指定する必要があります。一方、Whileは指定した条件が真である間、処理を繰り返します。
  • 今回のプロシージャでは、retに初期値として「2018/08/29」が代入され、Doループが開始されます。ループの中でretに1日ずつ加算し、iも1ずつ増やしていきます。しかし、条件i > 3が最初から偽であるため、ループは一度も実行されず、retには初期値のままとなります。その後、MsgBoxでretの値が表示されます。
回答を見る
  • ベストアンサー

ACCESS VBAが分からない!この問題ですが

ACCESS VBAの勉強をはじめました。 下のプロシージャを実行するとメッセージボックスに「2018/08/30」と出るようですが、なんでそうなるのかが分からないんです。 ちなみに Loop は繰り返しでWhileは~間という意味は分かるのですが。。。 よろしくお願いいたします。 Sub Lesson() Dim ret As Date, i As Long ret = #8/29/2018# Do ret = ret + 1 i = i + 1 Loop While i > 3 MsgBox ret End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6638/9405)
回答No.2

「Do (作業) Loop While (条件) 」の実行順序は以下の通り。 (1) Do を実行する。すなわち (作業) をする。 (2) While (条件) が成立しているなら、(1)に戻る。 ということでプログラムを見てみると。 ----ここから 変数 ret と i を宣言し、ret にだけ値(2018年8月29日)を入れています。※アメリカ式表記 変数宣言だけされた i には、最初は 0 が入っています。 Doループの本文、日付変数retに1を足すとは、「日付を1日進める」ことを意味します。 なので、(2018年8月29日)→(2018年8月30日)に変化します。 一方、i は 1 足されて、i=1 になります。 ここで条件判断、「i が3より大きければ再度ループせよ」と書いてあるわけですが、現時点でiは3以下です。 なのでループせず、次の命令に進みます。 Msgbox 命令でretの内容が表示されます。 ----ここまで 結局、Loop と書いてはありますが、1回しか実行されなかったという訳です。 まあこのプログラムではそうでないと困りますね。 仮に i=5 とかでループをはじめてしまったら、「iに1足したらさらに大きな数になる」→「i>3なのでさらにループする」となって終了しません。永久ループです。 意味のない終了条件であるとも言えます。 ---- ひょっとして、近くに Do While の説明も書いてあるでしょうか? Do Whileループでは、 「Do While (条件) (作業) Loop 」と書き、 (1) While の (条件) が成立しているなら、(2)を実行する。 (2) (作業) をして、(1)に戻る。 となっています。 もし同じように Dim ret As Date, i As Long ret = #8/29/2018# Do While i>3 ret = ret + 1 i = i + 1 Loop MsgBox ret こんな風になっていた場合。 はじめから i>3 が不成立ですので、ループ内部は『一度も実行されません』。 最後の Msgbox では「2018/08/29」が表示されるはずです。 その様に、Whileが先にある場合は「プログラムに書いてあっても、実行されない」という動作をすることもある訳です。 そういう違いを示したかった、サンプルなのかもしれません。

ohime777
質問者

お礼

とても丁寧に説明してくださり理解でき本当にうれしいです!!有難うございます。数日間悩んでました。感謝!!

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

No1の蛇足です。 もし、iが3以上の状態でこのDo~Loopが実行されたら(iが加算され続けますから)永久ループやオーバーフローになると思われますので、iの上限も条件に付けくわえないと怖いやり方だと思います。

ohime777
質問者

お礼

ありがとうございます!とても勉強になります!!感謝!!

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.1

Loop While i > 3 iが3より大きければLoopを繰り返す条件なので、現状はiが1の時に条件判定が行われますから、実際にLoopはしないということになります。

関連するQ&A

  • フォルダのファイル数をvbaで取得したい

    vbaなのですが、フォルダにgifファイルがたくさんはいっていますが、 その数を数えるコードを教えてください。 今は、 Sub Macro7() Dim File As String Dim i As Long File = Dir("C:\*.*", vbDirectory) Do While File <> "" File = Dir i = i + 1 Loop MsgBox "ファイル数は" & i & "です" End Sub のように、全てのファイル数をカウントして求めています。

  • フォルダの中のファイル数を取得するには vba

    手作業でフォルダのプロパティからファイルの数を確認することはできるのですが VBAで(FSOなど)、該当のフォルダの中に何個ファイルが入ってるかを確認するコードはありますか? Sub test() Dim MyFileName As String Dim MyFolderName As String Dim i As Long MyFolderName = "\○○\icon" MyFileName = Dir(MyFolderName & "\*.*") Do While MyFileName <> "" MyFileName = Dir() i = i + 1 Loop MsgBox i End Sub このようなコードを作ってみたのですが、 画像のように実際に目で確認したファイル数と一致しません。 正しい数が取得できるvbaコードはありますか?

  • VBAでln関数の計算

    VBAでln関数から以下のようなプログラムを組みましたが、 オーバーフローします。どこが原因でしょうか? 初心者なので初歩的なところで間違えていると思います。 Sub log関数() Dim i As Double Dim t As Double i = 2 Do i = i + 1 t = Log(i) Loop While (t > 10) MsgBox (i & "はin(x)が最初に10を超える数字です") End Sub 値として最初の数字の3でとまってしまいます。 ぜひとも間違いご指摘ください。

  • VBAでスロットを作る

     VBAでゲームを作ろうとしています。まず、手始めに簡単なスロットを作っています。スロットを回転させて止めるまではできたのですがメッセージを出す段階でメッセージが2回、0とiの値が出ます。次のコードなのですが、なぜできないのか、どうすればできるようになるのか教えてください。よろしくお願いします。 Sub SlotLoop_1() Dim i As Long Static Flg As Boolean Flg = Not Flg 'ボタンを使えるようにする With [a1] 'A1を選ぶ Do If Flg = False Then Exit Do i = (i + 1) Mod 10 '(i+1)を10で割った余り。 .Value = i DoEvents Loop End With MsgBox i 'ここが問題 End Sub

  • VBA ループ文

    お手数ですが、回答お願いします。 VBAでループ文を勉強しております。 最初のfor 文で1000行、1000列に文字を入力、 次のdo 文でその文字を全部消したいのですが、うまくいきません。 またfor 文で1000行、1000列で文字を入力しているのですが、 時間がかかるのは仕方がないことなのでしょうか? お手数ですが、ご教授お願いします。 Sub 文字入力() Dim i As long Dim t As long For i = 1 To 1000 For t = 1 To 1000 Cells(i, t) = "wooo" Next t Next i End Sub ================================================================= Sub 文字入力消し() Dim i As long Dim t As long i = 1 Do t = 1 Do Cells(i, t) = "" t = t + 1 Loop Until Cells(i, t) = "" i = i + 1 Loop Until Cells(i, t) = "" End Sub

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • VBA 九九 Do While

    VBAのDo Whileステートメントを使って九九の表をつくりたいのですが、何度やっても途中で詰まり、実行に至りません。 For NextとDo untilではできたと思うのですがDo Whileがどうしてもわからなくて… どなたか助けてください。お願いします。 Sub 九九計算_for() Dim i, j As Integer For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = i * j Next Next End Sub Sub 九九計算_do_until() j = 1 Do i = 1 Do Cells(j, i).Value = i * j i = i + 1 Loop Until i = 10 j = j + 1 Loop Until j = 10 End Sub

  • VBAで教えてください。

    データがないときはExitSubしたいのですが、何処に記述すれば良いでしょうか? Sub 削除() Dim i As Long If MsgBox("データを削除します。よろしいですか?", vbYesNo) = vbYes Then Sheets("リスト").Select i = 5 Do Until i = 200 If Cells(i, 5).Value = Sheets("マスタ登録").Range("D5") Then Cells(i, 1).EntireRow.Delete End If i = i + 1 Loop Else Exit Sub End If End Sub

  • VBA グループ化について

    VBAで、取り込んだ本のリストをグループ化して見やすくしようと思ったのですが、@のついているところでエラーが出ます。 (あるところからとってきたVBAを自分で付け加えたものです。) A列に著者、B列に本のタイトルが書かれているリストで、完成図としては著者の毎にグループがされ、著者のグループを開くと、本のタイトルのグループが出てくるかたちを目指しています。 エラー内容は以下の通りです。 実行時エラー 1004 アプリケーション定義またはオブジェクト定義のエラーです。 どなたか教えて下さい。 Sub TEST() Dim wri1 As Long Dim wri2 As Long Dim wri As Long Dim com1 As Long Dim com2 As Long Dim com As Long Dim strFORMULA As String ActiveCell.Activate com = 1 Do While Cells(com, 2).Value <> "END" com1 = com com = com + 1 Do While Cells(com, 2).Value = Cells(com1, 2).Value com = com + 1 Loop com2 = com - 1 Rows(com).Insert Cells(com, 2).Value = Cells(com1, 2).Value Cells(com, 1).Value = Cells(com1, 1).Value Rows(com1 & ":" & com2).Group com = com + 1 Loop wri = 1 Do While Cells(wri, 1).Value <> "END" wri = wri wri = wri + 1 @@@ Do While Cells(wri, 1).Value = Cells(wri1, 1).Value wri = wri + 1 Loop wri2 = wri - 1 Rows(wri).Insert Cells(wri, 1).Value = Cells(wri1, 1).Value Rows(wri1 & ":" & wri2).Group wri = wri + 1 Loop End Sub 

  • エクセルvba 値渡しのsubプロシージャ

    お世話になります。 エクセルVBAにて、loop処理中にCALLかけている subが最初の一度だけしか呼べません。 なにか、特別にしなければならないことがあるのでしょうか。 こんな感じです。 dim i as integer sub main()   i = 1   max = 5   do     if day1 = day2 then 処理1 データ1, データ2     end if     i = i + 1 loop until i = max    end sub sub 処理1(Byval 引数1 as variant, 引数2 as variant)    msgbox("引数1" & 引数1)    msgbox("引数2" & 引数2) end sub データ1 及び データ2、 DAY1 DAY2は、必要に応じて 転送処理等やっています。

専門家に質問してみよう