- ベストアンサー
VBAでループ処理を行いたい
- VBAで指定行をスキップしてループ処理を行いたいです。具体的には、Retsu_01の処理を15ずつずらして、Retsu_02の処理を行いたいです。
- Excelの特定のセルに日付が入力されている場合に、隣のセルの背景色を変更する処理を行いたいです。
- ループ処理の中で特定の条件に合致する場合に処理を行いたいです。具体的には、指定したセルが日付であり、その隣のセルが空白の場合に、別のセルの背景色を変更する処理です。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ANo.3です。 勘違いしていた部分がありましたのでコードを訂正します。 Sub SAMPLE_work() Dim Gyo_01 As Integer, Retsu_01 As Integer For Gyo_01 = 3 To 1300 For Retsu_02 = 10 To 23 nStart = Retsu_02 * 16 - 134 For Retsu_01 = nStart To (nStart + 14) If TypeName(Cells(Gyo_01, Retsu_01).Value) <> "Date" Then 'ここの処理は? ElseIf Cells(Gyo_01, Retsu_01).Value >= Date And Cells(Gyo_01, Retsu_01 + 1).Value = "" Then Cells(Gyo_01, Retsu_02).Interior.ColorIndex = 20 End If Next Retsu_01 Next Retsu_02 Next Gyo_01 End Sub
その他の回答 (4)
- bunjii
- ベストアンサー率43% (3589/8249)
>For Retsu_01 = 26 To 41 >’★ ↑このループの次の処理を 42 to 57 ・ 58 to 73 ....と15づつズラシテ処理したい。 外側の「For Gyo_01 = 3 To 1300 ・・・・ Next Gyo_1」ループとの関係は? 「指定行飛ばしてLOOP処理したい。」との希望が何を意味しているかが分かりません。 フローチャートを書いて仕事の流れを明確にしないと無駄な悪足掻きをすることになります。 >For Retsu_02 = 10 To 23 >’★ ↑この数値はRetsu_01の1回の処理につき一つづつ増加(画像のG1.G2.G3.....) G1~G16をRetsu_01のループで条件に見合うとき塗りつぶしを行っているようですが、無駄なチェックをしているようです。 >Next Retsu_●● '★ ←これがをどうしたら良いかわかりません Next Retsu_02 が必要です。 尚、Next Retsu_01 も提示のコードにはありませんので追加が必要でしょう。 他に「ElseIf Cells(Gyo_01, Retsu_01).Value = Date And Cells(Gyo_01, Retsu_01 + 1).Value = "" Then」の論理式「Cells(Gyo_01, Retsu_01).Value = Date」は再確認が必要かと思います。(タイプミス?または値の勘違い?) 当方で動作確認した範囲で添削した結果は次のとおりです。 Sub SAMPLE() Dim Gyo_01 As Integer, Retsu_01 As Integer For Gyo_01 = 3 To 1300 For Retsu_01 = 26 To 41 If TypeName(Cells(Gyo_01, Retsu_01).Value) <> "Date" Then ElseIf TypeName(Cells(Gyo_01, Retsu_01).Value) = "Date" And Cells(Gyo_01, Retsu_01 + 1).Value = "" Then For retsu_02 = 10 To 23 Cells(Gyo_01, retsu_02).Interior.ColorIndex = 20 Next retsu_02 End If Next Retsu_01 Next Gyo_01 End Sub 但し、「指定行飛ばしてLOOP処理したい。」との要望は意味不明のため加味されていません。
- mt2015
- ベストアンサー率49% (258/524)
出所が解らないExcelブックは怖いのでダウンロードしていません。 こういう事がやりたいのでしょうか? Sub SAMPLE_work() Dim Gyo_01 As Integer, Retsu_01 As Integer For Gyo_01 = 3 To 1300 For Retsu_02 = 10 To 23 For Retsu_01 = Retsu_02 To (Retsu_02 + 15) 'ここで良いのかな? If TypeName(Cells(Gyo_01, Retsu_01).Value) <> "Date" Then 'ここの処理は? ElseIf Cells(Gyo_01, Retsu_01).Value = Date And Cells(Gyo_01, Retsu_01 + 1).Value = "" Then Cells(Gyo_01, Retsu_02).Interior.ColorIndex = 20 End If Next Retsu_01 Next Retsu_02 Next Gyo_01 End Sub
補足
連絡ありがとうございます。 不慣れなもので、申し訳ございません。 上手く処理できませんでしたが、近いと思います。 勉強不足で原因もわかりません。 グループ01の計算は以下で出来ます。 Dim Gyo_01 As Integer, Gyo_02 As Integer For Gyo_01 = 3 To 1300 For Retsu_01 = 26 To 39 If TypeName(Cells(Gyo_01, Retsu_01).Value) <> "Date" Then ElseIf Cells(Gyo_01, Retsu_01).Value >= Date And Cells(Gyo_01, Retsu_01 + 1).Value = "" Then Cells(Gyo_01, 10).Interior.ColorIndex = 20 End If Next Retsu_01 Next Gyo_01 グループ02.03..と13迄処理を続けたいです。 G1 検索範囲 26 To 39 反映セル 10 G1 検索範囲 42 To 57 反映セル 11 G1 検索範囲 58 To 73 反映セル 12 ・・・・ G1 検索範囲 234 To 249 反映セル 23 お力添えをお願いいたします。
- HohoPapa
- ベストアンサー率65% (455/693)
現コードを生かすなら Sub SAMPLE() Dim Gyo_01 As Integer, Retsu_01 As Integer Dim BlocCount as integer BlocCount = 0 For Gyo_01 = 3 To 1300 For Retsu_01 = 26 To 249 if ((Retsu_01 - 10) mod 16 = 0) then BlocCount = BlocCount + 1 end if for Retsu_02 = (BlocCount-1 + 10) To (BlocCount-1 + 10 + 13) Next Retsu_02 Next Retsu_01 Next Gyo_01 End Sub といった感じでしょうか。 動作確認はしていません。悪しからず。
補足
現コードをいかさなくても問題ありません。 勉強不足につきそもそもの定義が違う可能性があります。 グループ01の計算は以下で出来ます。 Dim Gyo_01 As Integer, Gyo_02 As Integer For Gyo_01 = 3 To 1300 For Retsu_01 = 26 To 39 If TypeName(Cells(Gyo_01, Retsu_01).Value) <> "Date" Then ElseIf Cells(Gyo_01, Retsu_01).Value >= Date And Cells(Gyo_01, Retsu_01 + 1).Value = "" Then Cells(Gyo_01, 10).Interior.ColorIndex = 20 End If Next Retsu_01 Next Gyo_01 グループ02.03..と13迄処理を続けたいです。 G1 検索範囲 26 To 39 反映セル 10 G1 検索範囲 42 To 57 反映セル 11 G1 検索範囲 58 To 73 反映セル 12 ・・・・ G1 検索範囲 234 To 249 反映セル 23 お力添えをお願いいたします。
Swith Case は使え・・While Wend で良いと 処理しようと、終いと50回まわす場合は For loop_i=0 to 49 ってやるけど、条件が合うなら入る・・・って言うのは For 使わない。
補足
連絡ありがとうございます。 「Swith Case」勉強してみます。 今後ともよろしくお願いいたします。
補足
迅速に対応頂きありがとうございます。 勉強になりました。