1

ある条件で、別の行ベースのすぐ下に行を挿入しようとしていました。これで、このコードは多くのシートをループします。1枚のシートでは問題なく動作しますが、次のシートで同じ機能を実行しようとするとエラーが表示されます。誰でも問題を解決するのを手伝ってくれますか? 私が使用していたコードを以下に示します。

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
4

2 に答える 2

2

Selectエラーが発生する理由は、アクティブ シートの範囲しかできないためです。コードをそのまま修正するには、ループa.Activateの前に追加します。For

さらに良いことに、まったくしないSelectでください。

于 2012-11-17T19:42:35.050 に答える
1

あなたのコードは Sheets(1) が sheets("Sheet1") に等しいと仮定していますが、これは常にそうであるとは限りません。次のようなコードを使用することをお勧めします。

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

コードは変更前に何も選択しないので、かなり高速です。

乾杯

于 2012-11-19T09:32:02.227 に答える