17

私はここの人々の助けを借りて構築したExcel2010のvba関数を持っています。この関数は、テーブル/フォームの内容をコピーして並べ替え、適切なテーブルに送信します。

この関数を実行した後、元のテーブルをクリアしたいと思います。ACellがテーブルの最初のセルとして定義されていると仮定すると、次のコードでこれを実現できます。 ACell.ListObject.Range.ClearContents正常に動作します。唯一の問題は、テーブルとデータ値が削除されることです。

これを回避する方法はありますか?データを入力するたびにテーブルを設定する必要はありません。

4

7 に答える 7

43

どうですか:

ACell.ListObject.DataBodyRange.Rows.Delete

これにより、テーブルの構造と見出しは保持されますが、すべてのデータと行がクリアされます。

編集:私はあなたの前の投稿からの私の答えのセクションを変更するつもりです、それはほとんどあなたが望むことをするので。これにより、1行だけが残ります。

With loSource
   .Range.AutoFilter
   .DataBodyRange.Offset(1).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
   .DataBodyRange.Rows(1).Specialcells(xlCellTypeConstants).ClearContents
End With

すべての行を数式などでそのままにしておきたい場合は、次のようにします。

With loSource
   .Range.AutoFilter
   .DataBodyRange.Specialcells(xlCellTypeConstants).ClearContents
End With

これは、数式をクリアしないことを除いて、@Readifyが提案したものに近いものです。

于 2012-04-19T03:05:51.753 に答える
9

データをクリアしてみてください(ヘッダーを含むテーブル全体ではありません)。

ACell.ListObject.DataBodyRange.ClearContents
于 2012-04-19T03:12:13.470 に答える
4

Doug Glancyのソリューションを作り直して、行の削除を回避しました。これにより、数式で#Refの問題が発生する可能性があります。

Sub ListReset(lst As ListObject)
'clears a listObject while leaving row 1 empty, with formulae
    With lst
        If .ShowAutoFilter Then .AutoFilter.ShowAllData
        On Error Resume Next
        With .DataBodyRange
            .Offset(1).Rows.Clear
            .Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
        End With
        On Error GoTo 0
        .Resize .Range.Rows("1:2")
    End With
End Sub
于 2018-12-19T17:07:55.943 に答える
2

これらのソリューションのほとんどが対処できないという条件があります。私はそれを処理するために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 最後のセルを自動的にリセットすると呼ばれることもあります

于 2019-06-17T03:40:03.143 に答える
1

このコードを使用してデータを削除しますが、数式は一番上の行に残します。また、一番上の行を除くすべての行を削除し、ページを一番上までスクロールします。

Sub CleanTheTable()
    Application.ScreenUpdating = False
    Sheets("Data").Select
    ActiveSheet.ListObjects("TestTable").HeaderRowRange.Select
    'Remove the filters if one exists.
    If ActiveSheet.FilterMode Then
    Selection.AutoFilter
    End If
    'Clear all lines but the first one in the table leaving formulas for the next go round.
    With Worksheets("Data").ListObjects("TestTable")
    .Range.AutoFilter
    On Error Resume Next
    .DataBodyRange.Offset(1).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
    .DataBodyRange.Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
    ActiveWindow.SmallScroll Down:=-10000

    End With
Application.ScreenUpdating = True
End Sub
于 2016-02-04T16:44:45.830 に答える
0

通常、テーブルの内容をクリアしたいだけの場合は、非常に単純なものを使用します。

Sub Clear_table()
Range("Table1").ClearContents
End Sub

明らかに、複数のページを持つワークブックがある場合は、それに対応するようにコードを変更することをお勧めします。

Sub Clear_table()
Worksheets("Sheet1").Range("Table1").ClearContents
End Sub
于 2021-06-11T10:34:07.917 に答える
0

ヘッダーと数式を除くテーブル全体を削除する場合は、次の方法を試すことができます。

Sub DeteteTableExceptFormula()
    Dim tb As ListObject
    Set tb = activeworksheet.ListObjects("MyTable")
    tb.DataBodyRange.Delete
End Sub
于 2021-06-16T09:20:28.723 に答える