web-dev-qa-db-fra.com

Comment sélectionner le contenu clair d'une table sans la détruire?

J'ai créé une fonction vba dans Excel 2010 à l'aide de l'aide de personnes présentes. Cette fonction copie le contenu d'une table/formulaire, les trie et les envoie aux tables appropriées.

Maintenant, après avoir exécuté cette fonction, je souhaite que la table d'origine soit effacée. Je peux y parvenir avec le code suivant, en supposant qu'ACell a été défini comme la première cellule du tableau .ACell.ListObject.Range.ClearContents fonctionne correctement, le seul problème est qu'il supprime le tableau ainsi que les valeurs de données.

Y a-t-il un moyen de contourner cela? Je préférerais ne pas avoir à mettre la table en place chaque fois que je saisis des données.

9
SpeedCrazy

Que diriez-vous:

ACell.ListObject.DataBodyRange.Rows.Delete

Cela conservera la structure et les en-têtes de votre tableau, mais effacera toutes les données et les lignes.

EDIT: Je vais juste modifier une partie de ma réponse de votre précédent post , car il fait surtout ce que vous voulez. Cela ne laisse qu'une rangée:

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

Si vous voulez laisser toutes les lignes intactes avec leurs formules et tout le reste, faites simplement:

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

Ce qui est proche de ce que @Readify a suggéré, sauf que les formules ne seront pas effacées.

28
Doug Glancy

Essayez simplement d'effacer les données (pas la table entière, y compris les en-têtes):

ACell.ListObject.DataBodyRange.ClearContents
7
Reafidy

J'utilise ce code pour supprimer mes données mais laisse les formules dans la ligne du haut. Il supprime également toutes les lignes à l'exception de la ligne supérieure et fait défiler la page vers le haut. 

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
1
Brewer

J'ai retravaillé la solution de Doug Glancy pour éviter la suppression de lignes, ce qui peut entraîner un problème #Ref dans les formules. 

Sub ClearList(lst As ListObject)
'clears a listObject while leaving 1 empty row + formulae
    With lst
        If .ShowAutoFilter Then .AutoFilter.ShowAllData
        If .DataBodyRange.Rows.Count = 1 Then Exit Sub
        .DataBodyRange.Offset(1).Rows.Clear
        .DataBodyRange.Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
        .Resize .Range.Rows("1:2")
    End With

End Sub
1
Patrick Honorez