- ベストアンサー
【Excelマクロ】もっと頭の良い書き方って無いかな?
5行空白列があったらそこで処理を終わりたいんですが、もっといい書き方はないでしょうか? 下記が私の考えた頭の悪いやり方です。 Sub macro() Dim i As Integer For i = 1 To 1000 If Cells(i, 1) = "" Then If Cells(i + 1, 1) = "" Then If Cells(i + 2, 1) = "" Then If Cells(i + 3, 1) = "" Then If Cells(i + 4, 1) = "" Then If Cells(i + 5, 1) = "" Then MsgBox (i - 1 & "行目で終わりです") Exit For End If End If End If End If End If End If Next End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
5行空白列があったらそこで処理を終わりたいんですね? お書きになったのでは6行空白がないと終わらないような・・・・。 こんな書き方もあります。 Sub test01() For i = 1 To 1000 If Application.WorksheetFunction.CountA(Range(Cells(i, 1), Cells(i + 4, 1))) = 0 Then MsgBox (i - 1 & "行目で終わりです") Exit For End If Next End Sub
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #2 さん、ご指摘のように、 >5行空白列があったら コードは、空白は6行という数になっていますね。私は、コードに従いました。 15行目が空白で、それから、20行目までが空白なら、6行空白という計算になります。 i =15, i+5 =20 Cells(i, 1) = "" Cells(i + 5, 1) = "" ------------------------------------------ Sub Test02() Dim i As Long Dim Rw1 As Long, Rw2 As Long i = 1 If Cells(i, 1) <> "" Then Rw1 = Cells(i, 1).Row Do Rw2 = Cells(i, 1).End(xlDown).Row '>6 は、6行以上 If Rw2 - Rw1 > 6 Or Rw2 > 1000 Then Exit Do Rw1 = Rw2: i = Rw2 Loop If Rw1 <> 0 Then MsgBox Rw1 & "行目で終わりです。", 64 Else MsgBox "最終行が見つかりませんでした。", 48 End If End Sub ------------------------------------------
お礼
完璧です。
- imogasi
- ベストアンサー率27% (4737/17069)
左辺の連続複数セルを指定して空白か聞くのは難しいですね とりあえず ●<繰り返しループ法>で Sub test01() Dim rg As Range i = 1 For Each rg In Range(Cells(i, "A"), Cells(i + 4, "A")) If rg = "" Then Else MsgBox "処理" End End If Next MsgBox "終了" End End Sub ーー ●<エクセル関数法> エクセル関数を利用するのも良いかもしれない。 Sub test02() i = 1 x = WorksheetFunction.CountBlank(Range(Cells(i, "A"), Cells(i + 4, "A"))) If x = 5 Then MsgBox "終了" End Else MsgBox "処理" End End If End Sub
お礼
(^0_0^)ナルホド いろいろな書き方があるんですね。
- kuroooooo
- ベストアンサー率47% (8/17)
if文のところもFor Nextにすればスッキリすると思います。 後、判定も for j = 5 to 0 step -1で 5行目から判定すれば効率がよいかもです。
お礼
非常に参考になりました。 ありがとうございました。