2

このスクリプトは「機能」しますが、2回実行した場合に限ります。なぜこれが起こっているのか誰かが知っていますか?特殊なタイプに対処することは、いくぶん悪夢でした。それが私だけなのか、既知の問題なのかはわかりません。Windows7でExcel2010を使用します。コードを2回繰り返してみましたが、役に立ちませんでした。これをDoUntilに入れてみましたが、最初に実行したときに常に永久ループに陥ります。2回目の実行がうまくいくように見える理由がわかりません

'Remove all Blank Cells

    On Error Resume Next
    For i = Cells.SpecialCells(xlCellTypeBlanks).Count To 1 Step -1
    Cells.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    Next i

  If Cells.SpecialCells(xlCellTypeBlanks).Count = 0 Then 
     ActiveWorkbook.Close (True)
4

2 に答える 2

4

編集:「specialcells」範囲を削除してもシートのUsedRangeプロパティがリセットされないこと、およびそれが問題につながる可能性があることを示すために回答を更新しました。

Activesheet.UsedRangeコメントアウトの呼び出しの有無にかかわらず、シート上でこのサブを複数回実行してみてください...

Sub Tester()
    Dim rng As Range

    On Error Resume Next
    Set rng = ActiveSheet.Cells.SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0

    If Not rng Is Nothing Then
        Debug.Print "have empty cells"
        rng.EntireRow.Delete
        ActiveSheet.UsedRange
    Else
        Debug.Print "no empty cells"
    End If

End Sub

保存して再度開くと、UsedRangeもリセットされるようです...

EDIT2あなたはこれを使うのに非常に注意するべきです!その行に空白以外のセルがある場合でも、行全体が削除されます。特定のタイプのデータレイアウトでは問題ありませんが、他のタイプでは問題ありません。特定の状況下では、「削除」を呼び出すときに「重複する選択でそのコマンドを使用できません」というエラーが表示される場合もあります。

于 2012-08-16T19:50:30.680 に答える
0

@TimWilliamsの答えはよりエレガントであると言ってこれに注意しますが、これを試すことができます:

Sub Deletes()

Dim rng As Range
Set rng = ActiveSheet.UsedRange

' Check each cell in the range and if its value is empty, delete the row
For Each Cell In rng
  If Cell.Value = "" Then
    Cell.EntireRow.Delete
  End If
Next Cell

' Close
ActiveWorkbook.Close

End Sub
于 2012-08-16T19:50:53.183 に答える