- 締切済み
エクセル マクロ ループ処理の構文について
お世話になります。エクセル初心者です。 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
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- cj_mover
- ベストアンサー率76% (292/381)
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)
お邪魔します。 求めるものへの理解に自信はありませんが、 例えば、こんなことがしたいのではないかな?と。 /// 新規シートでテストしてみてください。 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 の置き換えるということなのかもしれません。 私の読み違えであれば、スルーして下さって結構ですが、 どう違うのか補足があれば、他の回答も付きやすくなるかと思います。
- umekihajime
- ベストアンサー率23% (13/55)
補足および他の方の回答に対する反応から余計にわからなくなってしまいました。 例えばNo.3の回答に示されるコードでは不十分ですか? 不十分であるならば、何がどのように不十分か補足頂けると嬉しいです。
- kmee
- ベストアンサー率55% (1857/3366)
すみません。やはり何を求めているのかがわかりません。 > 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/17069)
意味不明。補足読んでも同じことを言っているだけ。判らないといわれたら視点を変えて説明するもんだ。 For j = jstart To jend '実行したい内容 Next のくり返しが先に繰り返し1セット実行される。 1通り終われば次の i で1通り実行される。 >具体的には、i < j の関係は外部入力によって、i > j もしくは、i と j には関係がないといった形で変化するため は事実上の問題であって、処理が3類型のどれかでは困るなら、 >実行したい内容 のコードで手当てしないよいけないだけでは。 具体的にはどんなケースですか。ソートのアルゴリズムなどそんなことがあったような。 対照的で同じパターンになって無駄とか言う場合か? 質問者の頭の中を、文章やデータで吐き出すのが質問文だと思うが。
- umekihajime
- ベストアンサー率23% (13/55)
質問の意味が読み取れない部分がありますが、 下記のような感じでしょうか? istart = 1 iend = 50 For i = istart To iend jstart = i+1 jend = iend+1 For j = jstart To jend '実行したい内容 Next Next
補足
早速ご回答いただき、ありがとうございました。 質問の内容が不明確で申し訳ありませんでした。 今回の質問の内容としては、 For i = istart To iend For j = jstart To jend '実行したい内容 Next Next の部分は変更せずに jstartをどのように入力すれば良いかを教えていただきたいです。 具体的には、i < j の関係は外部入力によって、i > j もしくは、i と j には関係がないといった形で変化するため、For構文(もしくはループ分)の中にiとjの関係を記載できない前提です。 何度も申し訳ありませんが、ご回答いただければ幸いです。