2017-06-20 14 views
0

以下は実行しているコードです。私が望むものが得られるかどうかは分かりません。
しかし、不思議なことに、コードの実行には時間がかかりすぎています。
私はそれを1時間待っていました。
私はコードにいくつかのエラーがあるはずだと思いました。
誰もがこれについていくつかの光を当てることができますか?VBA:見つかったセルの前に新しい行を挿入

Set x = Workbooks.Open("C:\Users\Desktop\testing.xlsx") 

For Each ws In x.Worksheets 
If ws.Name <> "Master" Then 
    lrow = ws.Cells(Rows.Count, "A").End(xlUp).Row 
    Set rng = ws.Range(Cells(1, 1), Cells(lrow, 1)) 
    For Each Acell In rng 
     If (Acell.Value = "Sum") Then 
      Acell.Offset(-1, 0).EntireRow.Insert 
     End If 
    Next Acell 
End If 
Next ws 

「マスター」シート以外のブックのすべてのシートについて、Col Aの「合計」語を探しています。

+0

"sum"という単語が列に複数回表示されますか? – Hank

+1

行を削除または挿入する場合(特に現在の行の前)は、常に最後の行から最初の行に逆順に移動する必要があります。 –

+1

そして、あなたはワークシートに**常に 'Cells.'、' Rows'、 'Range'などを指定してください。' ws.Cells'、 'ws.Rows'、' ws.Range '。 **ワークシートの認定を行わずに使用しないでください。**あなたがワークシートを修飾しない場合、Excelは常にあなたが代わりに 'ActiveSheet'を意味すると仮定します(これはほとんど間違っています)。理解を深めるために[VBAベストプラクティス:ワークシートを想定しない](https://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices/9218/never-assume-the-worksheet)をお読みください。 –

答えて

0

For Eachループの代わりに、For i = lRow to 1 Step -1を使用して、iを使用して、各行にアクセスします。If ws.Cells(i, 1) = "Sum" Then ws.Rows(i).Insert

下からループすると、行の挿入/削除は上の行(まだ処理されていない行)だけでなく、下の行(すでに処理済み)に影響しません。

Dim iRow As Long, lRow As Long 
Dim ws As Worksheet 
Dim x As Workbook 

Set x = Workbooks.Open("C:\Users\Desktop\testing.xlsx") 

For Each ws In x.Worksheets 
    If ws.Name <> "Master" Then 
     lRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 
     For iRow = lRow To 1 Step -1 'walk through rows from last row (lRow) to first row going upwards (Step -1) 
      If ws.Cells(iRow, 1) = "Sum" Then 
       ws.Rows(iRow).Insert xlDown 'insert new row and move other rows down 
       Exit For 'if there is only one "Sum" you can exit for here (to shorten the run time) 
          'if there are more that one "Sum" in a sheet then remove that line. 
      End If 
     Next iRow 
    End If 
Next ws 
+1

よく説明してくれてありがとうございます。それは私に多くの助けになる! – Santa

0

行を挿入してループを続行すると、「挿入」によって再度1行下にプッシュされている「合計」-rowになります。したがって、あなたのコードは、おそらくない最善の解決策...(もし内側)このコードを試してみてください永遠に...行の後の行の後の行の後に

を行を挿入しますが、それは動作します:そこ以来

lastrow = ws.Cells(Rows.Count, "A").End(xlUp).Row 
R = 1 
Do Until R > lastrow 
    If (ws.Cells(R, 1).Value = "Sum") Then 
     ws.Cells(R, 1).EntireRow.Insert 
     R = R + 1    ' Jump one extra step (to skip the inserted row) 
     lastrow = lastrow+ 1 ' The last row is increased due to the inserted row 
    End If 
    R = R + 1 
Loop 
+1

下から上へ(上方に)ループすることで回避できます。特に、「合計」が底部に位置し、最初に一致した後にループを終了できるように1回だけ発生する場合、これはより速くなる可能性があります。関連する: –

0

列内に1つの合計だけです

Set x = Workbooks.Open("C:\Users\Desktop\testing.xlsx") 

For Each ws In x.Worksheets 
If ws.Name <> "Master" Then 
    lrow = ws.Cells(Rows.Count, "A").End(xlUp).Row 
    Set rng = ws.Range(Cells(1, 1), Cells(lrow, 1)) 
    For Each Acell In rng 
     If (Acell.Value = "Sum") Then 
      Acell.Offset(-1, 0).EntireRow.Insert 
     exit for 
     End If 
    Next Acell 
End If 
Next ws 

このコードを試してください。

0

個々のワークシートをセルの親ワークシートとして使用せずに、ワークシートをループしています。修飾された親ワークシートがなければ、各セルは単にデフォルトでActiveSheetになります。あなたは、行1で開始しているとA1が和であるならば、あなたは、行0の行を挿入しようとしている

For Each ws In x.Worksheets 
    If ws.Name <> "Master" Then 
     with ws 
      lrow = .Cells(.Rows.Count, "A").End(xlUp).Row 
      Set rng = .Range(.Cells(1, 1), .Cells(lrow, 1)) 
      For Each Acell In rng 
       If Acell.Value = "Sum" Then 
        Acell.Offset(-1, 0).EntireRow.Insert 
       End If 
      Next Acell 
     end with 
    End If 
Next ws 

ノートには、行ゼロはありません。

+0

.Cellsで定義されている場合は必要な範囲です。](https://stackoverflow.com/questions/36368220/is-the-in-range-necessary-when-defined-by-cells) – Jeeped

-2

は、あなたが手動にワークブックの計算を設定しようとしたことがあり、私はこれが役に立ったと評価してい私は、シートの負荷とワークブックですべてのシートを作業する傾向があるので、式の負荷を持っています。

File>Options>Formulas 

次に、ワークブックの計算を手動に設定しますが、自動化したい場合はこの設定にしてください。

Sub Macro1() 
' 
' Macro1 Macro 
' 
' Keyboard Shortcut: Ctrl+e 
' 
    calcu 
    'your code here 

    ActiveWorkbook.Application.Calculation = xlCalculationAutomatic 

End Sub 

「=

Function calcu() 

    Dim xlCalc As XlCalculation 

    xlCalc = Application.Calculation 
    ActiveWorkbook.Application.Calculation = xlCalculationManual 
    On Error GoTo CalcBack 
    Exit Function 

CalcBack: 
    ActiveWorkbook.Application.Calculation = xlCalc 

End Function 

私はどこか、スタック内からこれを得たが、あなたはこれをしなかった1、感謝しているので、もし私が、そのポストを忘れてしまいました。 :)

+0

計算は実際の問題とは何の関係もないと思います。 –

+0

もう一度見てみると、ユーザーはすべてのシートのすべてのセルをループしているようです。あなたはRange.Findを使うのがずっと良いと思いますか? – xtoybox

関連する問題