2017-02-23 33 views
1

我想要創建一個循環,在列「J」中搜索條件「1」,然後當它找到時,它在該列上方插入一行。在if循環中插入行

這是我到目前爲止有:

Sub MySub() 

Dim r As Long, endRow As Long 

endRow = 50 ' loop through 50 rows 
For r = 1 To endRow 'Loop through tab and search for my criteria 
    If Cells(r, Columns("J").Column).Value = "1" Then 'Found 
     'Select the current row 
     Rows(r).Select 
     Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 
    End If 
Next r 

End Sub 

這將創建50個新行的第一個「1」,發現上面的,我無法弄清楚如何解決它,所以它只會造成1排,上面它找到的所有「1」。

任何幫助,將不勝感激。

+1

你需要循環向後 –

回答

4

嘗試下面的代碼,它是一個litle清潔劑,不需要SelectSelection

而不是使用Cells(r, Columns("J").Column)可以使用Range("J" & r),對眼睛」

也更容易一點的,實行向後循環For r = endRow To 1 Step -1

代碼

Sub MySub() 

Dim r As Long, endRow As Long 

endRow = 50 ' loop through 50 rows 
For r = endRow To 1 Step -1 'Loop BACKWARDS tab and search for my criteria 
    If Range("J" & r).Value = "1" Then 'Found 
     Rows(r).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 
    End If 
Next r 

End Sub 
0

只是增加一個解釋給Shai的回答,以便你能理解正在發生的事情以及爲什麼向後循環工作。

您需要向後循環,因爲發生的情況是當您在J列中找到「1」值並插入一行時,您插入的行將您所有其他數據向下推動一行,因此您繼續擊中同一行一遍又一遍,它每次都觸發條件。

因此,例如,假設r = 1,單元格J1 =「1」,所以插入一行。這會導致單元格J1中的值被下推到第2行,因爲剛剛插入的空行現在位於第1行。因此,對於循環的下一次迭代,r = 2,現在您再次計算剛纔的值評估過去在單元格J1中。所以你插入一個新行,現在這個值再次被推下到第3行。所以在你的下一個循環迭代中,r = 3,你將再次評估相同的值。你會繼續這樣做,直到你達到你的循環的上限。這就是爲什麼你有50個新的行。

向後循環(即 - 從行50循環,從第1行第1行,而不是到行50)解決了這個問題,因爲現在當您插入新行,剛剛籤被下推在J列的值,但你的循環在行中向上移動。

因此,例如,在循環的第一次迭代中,r = 50,如果單元格J50 =「1」,則插入一行。所以再次,行被推下來,現在單元格J50中的值現在在單元格J51中。但是,現在你可以向後遍歷行。你的下一個循環迭代將是r = 49。第49行將是您剛剛插入的空行,因此單元格J49將不符合您的條件。所以你會去循環的下一個循環,r = 48。

我建議在你的循環中設置一個斷點,然後使用F8單步執行一行代碼,以查看這兩個循環所描述的情況。

0

你可以用AutoFilter()方法Range對象做一次拍攝:

Dim rng As Range 

    With Range("J1", Cells(Rows.Count, "J").End(xlUp)) '<--| reference column J range from row 1 (header) down to last not empty row 
     .AutoFilter Field:=1, Criteria1:="1" '<--| filter column J cells with "1" content 
     If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then Set rng = .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).EntireRow '<--| '<--| if any cell found other then header then store it in 'rng' range 
    End With 
    ActiveSheet.AutoFilterMode = False 
    If Not rng Is Nothing Then rng.Insert 
+0

@Nick,你通過它得到什麼? – user3598756