• 締切済み

エクセル マクロ ループ処理の構文について

お世話になります。エクセル初心者です。 i < j の関係があるときに、それぞれの数値をfor構文でループを回したいです。 i の数値は外部から入力される前提です。 現在、以下のような構文を考えています(istartとiendは外部から決められた数値とします)が、 この場合、jendはiend + 1とすれば良いのですが、jstartはどのように入力すれば良いでしょうか? 修正箇所を指摘(もしくは全文修正)していただけると、非常に助かります。 よろしくお願いいたします。 Sub test() Dim i As Integer Dim j As Integer Dim istart As Integer Dim iend As Integer Dim jstart As Integer Dim jend As Integer istart = 1 iend = 50 For i = istart To iend For j = jstart To jend '実行したい内容 Next Next End Sub

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.6

  No.5です。すみません。一点、転記ミスをしました。 Sub testC()の内、jstart = i + 1 の1行は消し忘れです。 /// 訂正   Sub testC()   Dim i As Integer Dim j As Integer Dim istart As Integer Dim iend As Integer   istart = 1 iend = 50   For i = istart To iend For j = i + 1 To iend '実行したい内容(i, j) Next Next   End Sub   /// m(__)m むしろ混乱させてしまったかも知れませんね。   ところで、 istart iend jstart jend などの変数は、それぞれ、 iまたはjの、最小値、最大値、という意味ですよね?   「iの、最小値、最大値である istart と iend は」  「(実際には)サブプロシージャ内で直に(直値で)指定するものではなく」  「(何らか)取得された値である」(例えば何処かのセルに値を指定してあるとか) という理解で合ってますか?   (↑合っているとして、、、) どんな結果を求めているのか、他に"ありそうな"な例をひとつ挙げてみます。  変数i、j、それぞれに最小値、最大値(istart iend jstart jend)が決められている。  iを最小値から最大値までループする。  そのループの内でjをループさせるが、その条件として   「jは jstart を下回らない」    且つ   「i<j」 という意図なのかも?ということで一例を挙げておきます。 (jend だけは、iend + 1 という条件に合わせました)   内容的には、ご提示のものに  If i >= jstart Then jstart = i + 1 の一行を追加しただけです。 i、jが、どのような相関でループしているか、を、 イミディエイトウィンドウ上で確認する為に 「' ■ 確認用 ■」の2行を書き足してあります。   イミディエイトウィンドウは Visual Basic Editor 画面にて   [Ctrl] + [G] キーを押すことで表示されます。 確認がとれたら、「' ■ 確認用 ■」とコメントされた2つの行を丸ごと削除してください。   ///   Sub testD()    Dim i As Integer  Dim j As Integer  Dim istart As Integer  Dim iend As Integer  Dim jstart As Integer  Dim jend As Integer    istart = 1 ' 仮の設定  iend = 50 ' 仮の設定    jstart = 30 ' 仮の設定  jend = iend + 1 ' ?    For i = istart To iend        Debug.? vbLf; "i:"; i; "- j:"; ' ■ 確認用 ■   If i >= jstart Then jstart = i + 1 ' 追加する行   For j = jstart To jend    '実行したい内容(i, j)       Debug.? j; ' ■ 確認用 ■   Next  Next   End Sub   ///   実際に動かしてみた結果について、意図したものと比較して 「ぜんぜん違う」とか「ここは合っていて」「ここは違う」とか 補足する中で答えが見つかるといいですね。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

お邪魔します。 求めるものへの理解に自信はありませんが、 例えば、こんなことがしたいのではないかな?と。   /// 新規シートでテストしてみてください。 i、jが、どのような相関でループしているか、を、シート上で確認する為の記述です。 (実際の処理とは違うものだというのは勿論承知しています)    50以下の数値(自然数)について  A列に、iの値  B列以右に、iよりも大きいjの値すべて   Sub test0() Dim i As Integer Dim j As Integer Dim istart As Integer Dim iend As Integer istart = 1 iend = 50 For i = istart To iend Cells(i, 1) = i For j = i + 1 To iend Cells(i, j) = j Next Next End Sub   もし、↑こういうことだとして、ご提示のものに合わせて書くと、以下のようになります。 ///    Sub testB() Dim i As Integer Dim j As Integer Dim istart As Integer Dim iend As Integer Dim jstart As Integer Dim jend As Integer istart = 1 iend = 50 jend = iend For i = istart To iend jstart = i + 1 For j = jstart To jend '実行したい内容(i, j) Next Next End Sub   iが48の時、jは49-50 iが49の時、jは50 iが50の時、jはループしません。   /// 変数、jstart、jend、が、必ずしも要らない、ということなら、 以下のような書き方で済む場合もあるかと思います。   Sub testC() Dim i As Integer Dim j As Integer Dim istart As Integer Dim iend As Integer istart = 1 iend = 50 For i = istart To iend jstart = i + 1 For j = i + 1 To iend '実行したい内容(i, j) Next Next End Sub   ///   以上は >この場合、jendはiend + 1とすれば良いのですが、 これが、「jstartはi + 1」の間違い、という前提ですが、 i<jを満たすj値をループするなら、jstartはi + 1 にすればよい ということを説明しています。   >jendはiend + 1 が誤記ではないという場合は testBの  jend = iend を  jend = iend + 1 の置き換えるということなのかもしれません。 私の読み違えであれば、スルーして下さって結構ですが、 どう違うのか補足があれば、他の回答も付きやすくなるかと思います。

回答No.4

補足および他の方の回答に対する反応から余計にわからなくなってしまいました。 例えばNo.3の回答に示されるコードでは不十分ですか? 不十分であるならば、何がどのように不十分か補足頂けると嬉しいです。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

すみません。やはり何を求めているのかがわかりません。 > i の数値は外部から入力される前提です とありながら > istart = 1 > iend = 50 > For i = istart To iend と、内部で勝手に1から50に変化させています。 もう一度整理して補足してください。 ○「i の数値は外部から入力」というのはどういう意味ですか? プログラム中の「変数i」は上に書いたように外部入力されていません。 ・外部iはプログラム中の istartにあたる値 ・外部iはプログラム中の iendにあたる値 ・外部iはプログラム中の istartからiendの範囲にあたる値集合 ・その他 ○「i < j の関係があるとき」だけだと、jは無限に存在します。 プログラムでは無限などあつかえません。 ・このjもプログラム中の 「変数j」とは別のものだったりしませんか? もしそうなら上と同様、何にあたるか明記してださい。 ・jの最大値は「iの最大値(iend)+1」と決まっているですか? ○「jstartはどのように入力すれば良いでしょうか?」 こっちが聞きたいです。jの範囲って不等式で表現したらどうなってるんですか? それに合せて決めてください、としか。 > For i = istart To iend > For j = jstart To jend > '実行したい内容 > Next > Next > の部分は変更せずに jstartをどのように入力すれば良いかを教えていただきたいです と言われても、そもそもこの構造で正しいかどうかもわかりません。 > 修正箇所を指摘(もしくは全文修正)していただけると、非常に助かります と御自身で言われているように、仕様によってはまったく考え違いということもあります。 効率を無視するなら、jstart,jendを取り得る最大幅にして For i = istart To iend For j = jstart To jend If i < j Then '実行したい内容 End If Next Next とするのも一つの手段です。

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

意味不明。補足読んでも同じことを言っているだけ。判らないといわれたら視点を変えて説明するもんだ。 For j = jstart To jend '実行したい内容 Next のくり返しが先に繰り返し1セット実行される。 1通り終われば次の i で1通り実行される。 >具体的には、i < j の関係は外部入力によって、i > j もしくは、i と j には関係がないといった形で変化するため は事実上の問題であって、処理が3類型のどれかでは困るなら、 >実行したい内容 のコードで手当てしないよいけないだけでは。 具体的にはどんなケースですか。ソートのアルゴリズムなどそんなことがあったような。 対照的で同じパターンになって無駄とか言う場合か? 質問者の頭の中を、文章やデータで吐き出すのが質問文だと思うが。

回答No.1

質問の意味が読み取れない部分がありますが、 下記のような感じでしょうか? istart = 1 iend = 50 For i = istart To iend jstart = i+1 jend = iend+1 For j = jstart To jend '実行したい内容 Next Next

skygreen18
質問者

補足

早速ご回答いただき、ありがとうございました。 質問の内容が不明確で申し訳ありませんでした。 今回の質問の内容としては、 For i = istart To iend For j = jstart To jend '実行したい内容 Next Next の部分は変更せずに jstartをどのように入力すれば良いかを教えていただきたいです。 具体的には、i < j の関係は外部入力によって、i > j もしくは、i と j には関係がないといった形で変化するため、For構文(もしくはループ分)の中にiとjの関係を記載できない前提です。 何度も申し訳ありませんが、ご回答いただければ幸いです。

関連するQ&A

  • マクロの処理速度が遅くなってしまいました

     今までエクセル2000を使用していたのですが、エクセル2003にバージョンアップして、以下の処理速度を検証したところ、処理が遅くなってしまいました。内容はsheet2にあるデータを変数に格納して簡単な計算をした後にsheet1に入力するということを5回繰り返し、それぞれの処理にかかる時間をsheet3に表示するというものです。 Sub タイム計測()   Dim myStart As Single, myGoal As Single   Dim j As Integer   Application.ScreenUpdating = False   Sheets(1).Select   Cells.Clear     For j = 1 To 5       myStart = Timer         Call サンプル       myGoal = Timer - myStart       Sheets(3).Select       Cells(j, 1) = myGoal       Sheets(1).Select     Next     Sheets(3).Select   Application.ScreenUpdating = True End Sub Sub サンプル()   Dim i As Integer, j As Integer   Dim Data As Variant, KeKKa(1 To 2000, 1 To 199) As Variant   Data = Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2000, 199))   For i = 1 To 2000     For j = 1 To 199       KeKKa(i, j) = Data(i, j) + Data(i, j)     Next   Next   Range(Cells(1, 1), Cells(2000, 199)) = KeKKa End Sub エクセル2000のときは1回当り平均して概ね0.7秒位で処理していたのですが、エクセル2003にすると1.4秒位かかってしまいます。処理速度が遅くなってしまうとバージョンアップした意味がないのですが、原因や改善策があればどなたか教えていただけないでしょうか?よろしくお願いします。

  • VBAでのマクロ実行中のオーバーフローについて

    以下のマクロ実行時にたまにオーバーフローが出てしまい マクロが止まってしまうときがあります。 毎回出るのであれば、原因を突き止めやすいのすが、 出なくなると全く出なくなりとても困っています。 もしわかる方がいらっしゃいましたら、御教授して頂けると 幸いです。 内容:データが元々10個単位であり、Sheet1に500×10、 Sheet2に500×10のデータを2次元配列に格納する。 Dim RES_CAM1(1 To 4000, 1 To 10) As Integer Dim RES_CAM2(1 To 4000, 1 To 10) As Integer Sub Macro10() ' ' Dim i, j As Integer .................................................... .................................................... Sheets("Sheet1").Select For i = 1 To 500 For j = 1 To 10 RES_CAM1(i, j) = Cells((i - 1) * 10 + j, 19) ← ☆ Next j Next i Sheets("Sheet2").Select For i = 1 To 500 For j = 1 To 10 RES_CAM2(i, j) = Cells((i - 1) * 10 + j, 19) ← ☆ Next j 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

  • マクロのプロシージャーの修正

    シートの加工場設定マスタの列が最初は、B列の4行目からD列の30行まで あったのですが、B列が不要になったのでB列を削除しました。 下記のようなマクロを記述していますが何処を修正すればよいか 教えてください。 Private bmas(20,3) Sub Kmas_call() Dim i As Integer, j As Integer, k As Integer Windows("加工品.xls").Activate Sheets("加工場設定マスタ").Select For i = 1 To 20 For j = 1 To 3 Bmas(i, j) = Cells(i + 4, j + 1) Next j Next i End Sub

  • エクセル マクロ ループの使い方

    超初心者です。よろしくお願いします。 以前にループのやり方を教えていただきました。 Sub ループ() Dim i As Long For i = 1 To 10 マクロ名 Next i End Sub この10回という回数の部分を変更したいと思うのですが、ここをセルA1に入力されている数字の回数分だけループを繰り返すという仕組みにしたいのですが、どのように書いたらよいでしょうか。

  • エクセルのマクロについて

    お手数ですが誰か教えてください! BのデーターをAに集計するマクロを作ったのですが 処理速度とっても遅いのです。 高速で処理する方法はありませんでしょうか? 私が作ったマクロ Sub 集計() Dim Z As Integer Dim i As Integer Dim X As Integer For Z = 2 To 2000 For i = 2 To 2000 For X = 3 To 20 If Worksheets("A").cells(Z, 1) = Worksheets("B").cells(i, 1) And       Worksheets("A").cells(1, X) = Worksheets("B").cells(i, 14) Then Worksheets("A").cells(Z, X) = Worksheets("B").cells(i, 16) End If Next X Next i Next Z End Sub       どこかが間違っている気がしますがマクロ初心者のため       先に進めません。       どうかご教授よろしくお願い致します。

  • Excel マクロ:変数を複数使う場合

    マクロ初心者です。 For文で、変数を2つ定義し、それぞれが1つずつ増えてくれるような マクロを組みたいのですが、うまくいきません。 例えばA列の並んだ数字を、B列に一個とばしで入力するとして・・・ 例) Dim i As Integer Dim j As Integer For j = 2 To 10 Step 2 For i = 1 To 9 Cells(j, 2).Value = Cells(i, 1).Value Next i, j ではだめですよね。iが1つ増える時に、jも1つ増える、 というようにVBAを組むことが可能なのでしょうか? ど素人な質問ですみませんが、教えてください。

  • シート名をループに

    質問を簡単にする為に以下のマクロがあるとします。 シート名が1~31とあるのですが、これをfor loopで 使うにはinteger等の定義が違うのでしょうか。 Sub bbb() Dim ws As Worksheet Dim 曜日 As String Dim i As Integer For Each ws In Worksheets For i = 1 To 31 If ws.Name = i Then  <----------ここでエラー  (コマンド) End If Next i Next End Sub

  • Excelのマクロについて

    文字列から数値だけを抽出するマクロを見つけたのですが、抽出するデータを選択してから実行しなければなりませんでした。 抽出するデータはAセル以下にしかないので、データを選択しないでも実行できるようにするにはどうしたら良いのでしょうか? 宜しくお願いします。 以下見つけたマクロです。  Sub test()  Dim mydata As String  Dim c As Range  Dim i As Integer  For Each c In Selection   mydata = ""  For i = 1 To Len(c)   If Mid(c, i, 1) >= 0 And Mid(c, i, 1) <= 9 Then   mydata = mydata & Mid(c, i, 1)    End If   Next   c.Offset(0, 1) = mydata   Next  End Sub

  • マクロエラー処理

    下記のマクロを実行すると、If (.Range のところでコンパイルエラー参照が不正または不完全です。というメッセージが出るのですが、どこを修正すればよいのでしょうか 教えてください。 Sub 再表示1() Dim SheetName As String Dim i As Integer Dim LastRow As Integer Dim rng As Range LastRow = 3000 '最終行の番号 Sheets("ACT").Select For i = 6 To LastRow If (.Range("D" & i) = "A310" Or .Range("D" & i) = "A505") And .Range("V" & i) < 0 Then .Cells(i, "W").Resize(1, 3).ClearContents End If Next Stop End With End Sub

専門家に質問してみよう