これらのソリューションのほとんどが対処できないという条件があります。私はそれを処理するためにPatrickHonorezのソリューションを修正しました。元の関数が期待していたより多くのデータをときどきクリアしていたときに髪を抜いていたので、これを共有する必要があると感じました。
この状況は、テーブルに1つの列しかなく.SpecialCells(xlCellTypeConstants).ClearContents
、一番上の行の内容をクリアしようとしたときに発生します。この状況では、1つのセルのみが選択され(1つの列しかないテーブルの一番上の行)、SpecialCellsコマンドは選択された範囲ではなくシート全体に適用されます。私に起こっていたのは、私のテーブルの外にあったシート上の他のセルもクリアされていたということでした。
私はいくつか掘り下げて、MathieuGuindonからのこのアドバイスを見つけました:
RangeSpecialCellsClearContentsはシート全体をクリアします
Range({any single cell})。SpecialCells({whatever})はシート全体で機能するようです。
Range({複数のセル})。SpecialCells({whatever})は、指定されたセルで機能しているようです。
リスト/テーブルに列が1つしかない場合(行1)、このリビジョンはセルに数式があるかどうかを確認し、ない場合はその1つのセルの内容のみをクリアします。
Public Sub ClearList(lst As ListObject)
'Clears a listObject while leaving 1 empty row + formula
' https://stackoverflow.com/a/53856079/1898524
'
'With special help from this post to handle a single column table.
' Range({any single cell}).SpecialCells({whatever}) seems to work off the entire sheet.
' Range({more than one cell}).SpecialCells({whatever}) seems to work off the specified cells.
' https://stackoverflow.com/questions/40537537/range-specialcells-clearcontents-clears-whole-sheet-instead
On Error Resume Next
With lst
'.Range.Worksheet.Activate ' Enable this if you are debugging
If .ShowAutoFilter Then .AutoFilter.ShowAllData
If .DataBodyRange.Rows.Count = 1 Then Exit Sub ' Table is already clear
.DataBodyRange.Offset(1).Rows.Clear
If .DataBodyRange.Columns.Count > 1 Then ' Check to see if SpecialCells is going to evaluate just one cell.
.DataBodyRange.Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
ElseIf Not .Range.HasFormula Then
' Only one cell in range and it does not contain a formula.
.DataBodyRange.Rows(1).ClearContents
End If
.Resize .Range.Rows("1:2")
.HeaderRowRange.Offset(1).Select
' Reset used range on the sheet
Dim X
X = .Range.Worksheet.UsedRange.Rows.Count 'see J-Walkenbach tip 73
End With
End Sub
私が含めた最後のステップは、ジョン・ウォーケンバッハに起因するヒントであり、J-Walkenbach tip 73
最後のセルを自動的にリセットすると呼ばれることもあります