Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 8.1 : Excel 2013)
任意の行挿入について
投稿日時: 19/05/08 12:59:52
投稿者: eco2019

A行にI01と記されていれば、その行から3行挿入したいです。
 
どのようにすればよいでしょうか?
 
宜しくお願い致します。
 
 
Sub test()
 
 LastRow = Cells(Rows.Count, 1).End(xlUp).Row
 
 For n = 1 To LastRow
 
   p1 = Range("A" & n).Row
   p2 = Range("A" & n + 3).Row
 
 If Range("A" & p1) = "I01" Then
 
  Range(Cells(p1, 1), Cells(p2, 1)).Select
 
  Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
 
  End If
 
    Next n
 
End Sub

回答
投稿日時: 19/05/08 14:15:04
投稿者: Suzu

引用:
A行にI01と記されていれば、その行から3行挿入したいです。

 
ここが問題なのでしょうか?
 
当該行の上ではなく、下に3行入れたい?
 
であれば、p1、p2 をそれぞれ +1 すれば良いのでは?
 
Range(Cells(p1 + 1, 1), Cells(p2 + 1, 1)).Select

回答
投稿日時: 19/05/08 15:08:01
投稿者: Suzu

1セルづつ総当たりを行わなくとも Find を使えばもっと速くできるでしょう。
Findは Range オブジェクトを返しますので、Offset と Resizeを使っています。
 
Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).Find の場合、
Afterを指定しないと、A1を起点に検索を始めます。
このとき、A1に検索対象が入っていても検索されるのは、1周後になるので。。Afterを指定しています。
 
 
Sub sample()
  Dim rng As Range
  Dim i As Long
  
  Set rng = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).Find(What:="I01", After:=Cells(Rows.Count, 1).End(xlUp))
  If Not rng Is Nothing Then
    i = rng.Row
    Do
' 動作確認の際には、下記のコメントアウトを外し確認してみましょう。
' rng.Offset(1).Resize(3).Select
      rng.Offset(1).Resize(3).EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
      Set rng = rng.Offset(3)
      Set rng = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).FindNext(rng)
    Loop While (rng.Row > i And Not rng Is Nothing)
  End If
End Sub

回答
投稿日時: 19/05/08 16:35:00
投稿者: WinArrow
投稿者のウェブサイトに移動

Suzu さんレスのFINDを推奨します。。
 
ループで総当たり検索する場合
 
上からではなく、下から検索します。
 
For n = LsstRow to 1 Step -1
    If Cells(n, "A").value = "I01" Then
    省略
    End If
Next n
 
 
理由
LastRow が 100だった場合
3行挿入すると、表は103行になりますが、
LAstRowの値が増えることはないので、
結果として、100までしか処理されません。

投稿日時: 19/05/09 09:42:21
投稿者: eco2019

Suzuさん、WinArrowさん、お世話になりました。
 
Find を使えば速いですね。有難うございました。