2012-11-17 64 views
1

我試圖在某種情況下在另一行底下插入一行。現在這段代碼將循環遍歷許多表單。它適用於1張紙,但是當它試圖爲下一張紙執行相同的功能時,它會顯示錯誤。任何人都可以幫助我解決問題。我使用的代碼如下:使用VBA條件插入

Sub test() 
Dim a As Worksheet 
Dim lngRow As Long 
Dim s As String 
Dim z As Variant 
s = "Sheet1,Sheet2" 
z = VBA.Split(s, ",") 
For Each i In z 
Set a = Sheets(i) 
For lngRow = a.UsedRange.Rows.Count To 1 Step -1 
If UCase$(a.Cells(lngRow, 2).Value) = "R" Then 
a.Range("A" & CStr(lngRow + 1)).Select 
Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove 
End If 
Next lngRow 
Next i 
End Sub 

錯誤是此行中來:

a.Range("A" & CStr(lngRow + 1)).Select 

回答

2

你得到一個錯誤的原因是,你只能Select活動工作表的範圍。要按原樣修復您的代碼,請在For循環之前添加a.Activate

更好的是,根本不需要Select

+0

謝謝克里斯!你的回答很有魅力。 – Beta

1

您的代碼假定表格(1)等於工作表(「工作表1」),這可能並非總是如此。最好使用如下代碼:

Sub Test1() 
Dim aSht As Variant, SafeShts As String 
Dim lngrow As Long 

SafeShts = LCase("Sheet3 , Sheet4") 'Write here sheets to be unaffected 

For Each aSht In ThisWorkbook.Sheets 
    If InStr(SafeShts, LCase(aSht.Name)) < 1 Then 'Current sheet not within safe sheets 
     For lngrow = aSht.UsedRange.Rows.Count To 1 Step -1 
      If UCase(aSht.Cells(lngrow, 2)) = "R" Then 
       aSht.Cells(lngrow + 1, 1).EntireRow.Insert xlShiftDown, xlFormatFromLeftOrAbove 
      End If 
     Next 
    End If 
Next 

End Sub 

代碼在更改前不會選擇任何內容,因此它的速度非常快。

乾杯

+0

謝謝Apostilos55!我已經修改了基於Chris答案的代碼。但你的努力真的很感激。 – Beta

+1

User697363,不要着急。上面的代碼不會選擇/激活任何東西(如Chris所建議的),所以它更快。再加上我在頂部提到的假設。只需在SafeShts字符串中編寫要避免的表單名稱並運行即可。 – Apostolos55

+0

謝謝Apostolos55!我希望我能標記兩個答案是正確的。但既然這是不可能的,我已經標記了克里斯的答案是正確的,我堅持這一點。但我非常感謝你的幫助。 – Beta