- 締切済み
エクセル マクロ ループ処理の構文について
お世話になります。エクセル初心者です。 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
- skygreen18
- お礼率0% (0/6)
- Visual Basic
- 回答数6
- ありがとう数2
- みんなの回答 (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/17068)
意味不明。補足読んでも同じことを言っているだけ。判らないといわれたら視点を変えて説明するもんだ。 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
関連する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秒位かかってしまいます。処理速度が遅くなってしまうとバージョンアップした意味がないのですが、原因や改善策があればどなたか教えていただけないでしょうか?よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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 上記☆のところでオーバーフローで止まったりします。。。
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- SE・インフラ・Webエンジニア
- マクロのプロシージャーの修正
シートの加工場設定マスタの列が最初は、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に入力されている数字の回数分だけループを繰り返すという仕組みにしたいのですが、どのように書いたらよいでしょうか。
- ベストアンサー
- その他MS Office製品
- エクセルのマクロについて
お手数ですが誰か教えてください! 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 どこかが間違っている気がしますがマクロ初心者のため 先に進めません。 どうかご教授よろしくお願い致します。
- 締切済み
- Visual Basic
- 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を組むことが可能なのでしょうか? ど素人な質問ですみませんが、教えてください。
- ベストアンサー
- オフィス系ソフト
- 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
- ベストアンサー
- オフィス系ソフト
補足
早速ご回答いただき、ありがとうございました。 質問の内容が不明確で申し訳ありませんでした。 今回の質問の内容としては、 For i = istart To iend For j = jstart To jend '実行したい内容 Next Next の部分は変更せずに jstartをどのように入力すれば良いかを教えていただきたいです。 具体的には、i < j の関係は外部入力によって、i > j もしくは、i と j には関係がないといった形で変化するため、For構文(もしくはループ分)の中にiとjの関係を記載できない前提です。 何度も申し訳ありませんが、ご回答いただければ幸いです。