• ベストアンサー

Access VBA でのFor_Nextステートメントで使用例の意味が理解できず困っています

Access VBA の勉強を始めて間もないものですが、あるテキストのFor_Nextステートメント使用の一部分の意味がわかりません。教えてください。 Sub ループのネスト() Dim i As Integer, j As Integer Dim myStr As String '九九の結果を表示する For i = 1 To 9 For j = 1 To 9 myStr = myStr & i * j & " " Next j MsgBox myStr, , i & "の段" myStr = "" Next i End Sub 以上の文面で(1)『myStr = myStr & i * j & " "』でmystrにmyStr & i * j & " "を代入する意味だとは理解できますがmystr&を右辺に記載する意味がわかりません。何故必要でしょうか? (2)『mystr=""』は何故必要なのでしょうか?

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

Access VBAとあったのでどんな難しいことかと思ったら これなら、VB,エクセルVBAでも動くないようだ。 エクセルを持っておれば 標準モジュールに張り付け、実行して シートを見ると良くわかる。 Sub ループのネスト() Dim i As Integer, j As Integer Dim myStr As String '九九の結果を表示する For i = 1 To 9 For j = 1 To 9 Cells(i, j + 1) = myStr & i * j & " " Next j Cells(i, 1) = myStr & i & "の段" myStr = "" Next i End Sub &は文字列を結合するもの。 この場合エクセルのセルと違ってMsgboxなので1行で1回の表示にしているので1行分は文字列追加累積しているわけ。 これを使うときはある段階・単位で=””でクリアする。 次の行の文字列を作るに入る前に、前行のものは(同じ変数を使うがため)クリアしなければならない。 i*jは本来文字列の扱いだが、VBでは文字列化しなくても MsgBoxやエクセルのセル、テキストボックスにセットできる。 >右辺に記載する意味がわかりません Msgboxやエクセルのセルやテキストボックスにセットするとき セット・表示する内容は、右辺です。

sketch4910
質問者

お礼

なるほど。勉強になります。ありがとうございました。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

#2の回答で 間違いがあるようです myStr = myStr & i * j & " " の命令は myStrに i*jの演算結果の文字列とスペース1個を追加する と言った内容です i=2, j=3 だったら myStrには "6 "が追加されます "2*3 "の文字列生成はされません "2*3 "を生成するなら myStr = myStr & i & "*" & j & " " としないといけません

sketch4910
質問者

お礼

そうですね。最初、ちょっと戸惑いがありましたが理解できました。ありがとうございました

  • PPancho
  • ベストアンサー率27% (26/96)
回答No.2

(1)i=1,j=1の時はmyStr = myStr & i * j & " "に  「1*1 」という文字列になります。   i=1,j=2の時「1*1 1*2 」という文字列を生成するため。 (2)j=1~9の後でメッセージボックスの表示は   「1*1 1*2 ~(略)~1*9 」になります。   その後でiをカウントアップして2にする際、変数をリセット  (消去)させるため。(そうしないと文字列が延々長くなる) &は文字列と文字列をつなげる意味を表します。

sketch4910
質問者

お礼

なるほど。具体的な説明ありがとうございました。

  • 6dou_rinne
  • ベストアンサー率25% (1361/5264)
回答No.1

1.プログラミング言語特有の書き方でもとのmyStrに i*j  を追加したものをmyStrに代入するとうことです。 2.についてはどんどん追加されていくので間にスペースをいれて見やすくしているのでしょう。

sketch4910
質問者

お礼

プログラミング言語特有の書き方なんですね。ありがとうございました

関連するQ&A

  • For~Nextステートメント  途中で止めるには

    For~Nextステートメント で、変数が5なら止めたいのですがIFを使わない方法があったと思うのですが、 忘れてしまいました。 今は、 +++++++++++++++++++++++++++++ Sub test() Dim i As Long For i = 2 To 10 If i = 5 Then Stop End If Next End Sub +++++++++++++++++++++++++++++ としていますが、 If i = 5 Then Stop End If じゃなくても、一つのメソッドで出来た気がするのですが、 わかる方いらっしゃいますか? ご回答よろしくお願いします。

  • EXcel VBAのFor~Nextステートメントで質問です

    初歩の初歩ですがお願いします。 3から13行目をデータのある最終行の下に 20回コピーをしていきたいのですが、 (3から13行のデータの複製を20個用意 したいということです) つまずいています。iとしてみたのですが 、何をiとして実行させるのか分かりません。 教えていただけないでしょうか? Sub test() Dim i As Integer For i = ● To ●   Rows("3:13").Copy   Worksheets("Sheet1").Range("A65536") _   .End(xlUp).Offset(1).Select   ActiveSheet.Paste  Application.CutCopyMode = False   Next i    End Sub

  • Excel 「For … Next」のやり方

    Excel画面のA1~A10を10~1の表示にさせるため、VBAを Sub ***() Worksheets("Sheet1").Activate Cells.Clear Dim i As Integer, n As Integer For i = 10 To 1 Step -1 Cells(i, 1).Value = i Next i End Sub としたのですが、実際に表示するとA1から1~10と1ずつ加算されてしまいます。 マイナス値は-1の表示で可能だといろいろ調べてわかったのですが、実際にやるとうまくいきません。 どこが間違っているのでしょうか? 学習不足ではありますが、よろしくお願いします。

  • For ステートメントについて

    Dim t As Byte と宣言をした上で 次のコードを書くと For t = 1 To 10 Step 1 Next t 通常に実行されます。ところが、 For t = 10 To 1 Step -1 Next t とするとオーバーフローします。 Dim t As Integer とすると上手くいくことから t が負の数に対応していないからだと思いますが、t が負の数になることはありません。これはなぜなのでしょうか? 。

  • Excel VBA のFor Each ・・・ Next について

    配列に数字(特段数字でなくても)入れたいのですが、以下のように書きました。 Sub test() Dim x As Variant Dim m(1 To 10) As Integer For Each x In m x.Value = 100 Next Stop End Sub Stopでとめてmを確認するとすべて0です。どうしてなのでしょうか。 配列ではなく Sub test() Dim x As Variant For Each x In range("a1:a10") x.Value = 100 Next End Sub とするとA1:A10には100が入ります。 この差がいまいちわからなくて、 もちろんFor ・・・ Nextで簡単に入れられるのは承知しています。 補足ですが また最初はx.valueの.valueをつけていなかったのでセルにも反映されませんでしたが.valueをつけると入りました。

  • 以前に回答いただいたVBAですが、理解できない部分があったので、抜粋し

    以前に回答いただいたVBAですが、理解できない部分があったので、抜粋して質問に投稿したところ、多くの方々から、「これでは、わからない」などの指摘をいただき、これでは、以前に回答していただいた回答者様の名誉にかかわると思い全文を記載させていただくことにしました。  あわせて、この、VBAの詳しい説明を快くしていただける方は回答よろしくお願いします。以下のとうりです。  A列  B列 1 期間  90 2 人数  21 3 4 氏名  回数 5 A   23 6 B   23 7 C   19 8 D   16 9 E   12 10 F   9 11 G   8 12 H   7 13 I   7 14 J   6 15 K   6 16 L   6 17 M   5 18 N   5 19 O   4 20 P   4 21 Q   4 22 R   4 23 S   4 24 T   4 25 U   4 Sub 当番割当() Dim 期間 As Integer Dim 人数 As Integer Dim 氏名() As String Dim 回数() As Integer Dim i As Integer Dim j As Integer Dim k As Integer Dim m As Integer Dim n As Integer Dim n1 As Integer Dim n2 As Integer Dim p As Single Dim q As Single Dim 当番() As String Dim 担当() As Single 期間 = Cells(1, 2) 人数 = Cells(2, 2) ReDim 氏名(人数) ReDim 回数(人数) For i = 1 To 人数 氏名(i) = Cells(4 + i, 1) 回数(i) = Cells(4 + i, 2) Next i ReDim 当番(期間 * 2) ReDim 担当(期間 * 2) n = 0 For i = 1 To 人数 n1 = 0 n2 = 0 For j = 1 To 人数 If 回数(j) = 回数(i) Then n1 = n1 + 1 If j <= i Then n2 = n2 + 1 End If Next j p = 期間 / 回数(i) For j = 1 To 回数(i) q = p * (n2 - 0.5) / n1 + p * (j - 1) m = 1 For k = n To 1 Step -1 If 担当(k) <= q Then m = k + 1 Exit For End If 当番(k + 1) = 当番(k) 担当(k + 1) = 担当(k) Next k 当番(m) = 氏名(i) 担当(m) = q n = n + 1 Next j Next i Range("E:G").Clear For n = 1 To 期間 Cells(n, 5) = n & "日" Cells(n, 6) = 当番(n * 2 - 1) Cells(n, 7) = 当番(n * 2) Next n End Sub

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • VBA Next For でのコピペについて

    EXCEL VBA初心者です。 AシートEW44からGD44までをコピーしてBというシートの最終行へコピーしたいです。 今下記のように組んでいるのですが、うまく作動しません。 Private Sub CommandButton1_Click() Dim i As Integer For i = 153 To 186 row1 = Worksheets("B").Cells(Rows.Count, 27).End(xlUp).Row Worksheets("A").Cells(i, 44).Value = Worksheets("B").Cells(row1 + 1, 27).Value Next i End Sub アドバイスいただけませんでしょうか。

  • Excel VBAライフゲーム

    ExcelのVBAでライフゲームを作りたいのですが、次のプログラムの途中以降がわかりません。 もしよろしければ、このつづきの簡単な実行できるVBAライフゲームを教えてください。 続きのプログラムを教えていただけたら幸いです。 Option Explicit Const ALIVE As Integer = 1 Const DEAD As Integer = 0 Const SIZE As Integer = 19 Const Tmax As Integer = 100 Dim C(SIZE, SIZE) As Integer Sub LifeGame() Dim InitRate As Single Dim T As Integer Dim N As Integer Dim Cnext(SIZE, SIZE) As Integer Dim I As Integer, J As Integer InitRate = -1 Do While InitRate < 0 Or 1 < InitRate Loop For I = 0 To SIZE For J = 0 To SIZE If Rnd() < InitRate Then C(I, J) = ALIVE Else C(I, J) = DEAD End If Next J Next I For T = 1 To Tmax For I = 0 To SIZE For J = 0 To SIZE If C(I, J) = ALIVE Then Cells(I + 1, J + 1).Value = "■" Else Cells(I + 1, J + 1).Vallue = "" End If Next J Next I For I = 0 To SIZE For J = 0 To SIZE N = Count(I, J) Next J Next I For I = 0 To SIZE For J = 0 To SIZE C(I, J) = Cnext(I, J) Next J Next I Next T End Sub Function Count(I As Integer, J As Integer) As Integer End Function

  • For~Nextについて

    VBA勉強中です。 For~Nextについて、いまいちわからないので、教えてほしいのですが、 下記の表を作り、テーブルと言う名前を付けました。 C列に上からA.Bの値を入れようと思います。 | A | B |C 1| AA| 11| 2| AB| 12| Sub Macro1() Dim AA As Range, BB As Range, AB As Variant Dim myTbl As Range, myFld As Integer, i As Integer Set AA = Range("A1") 'AAの箱にA1の値を Set BB = Range("B1") 'BBの箱にB1の値を Set myTbl = Range("テーブル") 'myTblの箱にテーブルを myFld = 3 'myFldの箱に3列目 AB = AA & "." & BB 'A1とB1の値を入れる For i = 1 To myTbl.Rows.Count 'iはテーブルの1行目から最後の行まで If myTbl.Cells(i, myFld).Value = AB Then 'テーブルの1行目のCのセルにA1とB1の値を入れる Exit Sub End If Next End Sub と思うのですが、やはり動きません。 アドバイスをお願いします。

専門家に質問してみよう