web-dev-qa-db-fra.com

Effacer le contenu des cellules dans VBA en utilisant la référence de colonne

J'essaie d'obtenir un morceau de code pour effacer les données dans certaines cellules, en utilisant les références de colonne. J'utilise le code suivant:

Worksheets(sheetname).Range(.Cells(2, LastColData), .Cells(LastRowData, LastColData)).ClearContents

Pour ce faire, cependant, je reçois une erreur dans la première section .Cells, pourquoi?

10
dojogeorge

Vous pouvez accéder à toute la colonne sous forme de plage à l'aide de l'objet Worksheet.Columns

Quelque chose comme: 

Worksheets(sheetname).Columns(1).ClearContents 

devrait effacer le contenu d'une colonne

Il y a aussi l'objet Worksheet.Rows si vous devez faire quelque chose de similaire pour les lignes


L'erreur que vous recevez est probablement due à un bloc manquant avec.

Vous pouvez en savoir plus sur les blocs ici: Aide de Microsoft

23
Sam

Comme Gary's Student l'a mentionné, vous devez supprimer le point avant Cells pour que le code fonctionne comme vous l'avez écrit à l'origine. Je ne peux pas en être sûr, car vous n’avez inclus que la ligne de code, mais l’erreur que vous avez eu lorsque vous avez supprimé les points pourrait avoir un rapport avec la façon dont vous avez défini vos variables. 

J'ai couru votre ligne de code avec les variables définies comme des entiers et cela a fonctionné:

Sub TestClearLastColumn()

    Dim LastColData As Long
        Set LastColData = Range("A1").End(xlToRight).Column

    Dim LastRowData As Long
        Set LastRowData = Range("A1").End(xlDown).Row

    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).ClearContents

End Sub

Je ne pense pas qu'une instruction With convienne à la ligne de code que vous avez partagée, mais si vous en utilisiez une, la With serait au début de la ligne qui définit l'objet que vous manipulez. Voici votre code réécrit en utilisant une instruction With inutile:

With Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData))
    .ClearContents
End With

Les instructions With sont conçues pour vous éviter de retaper du code et pour faciliter la lecture de votre code. Cela devient utile et approprié si vous faites plus d’une chose avec un objet. Par exemple, si vous souhaitez également transformer la colonne en rouge et ajouter une bordure noire épaisse, vous pouvez utiliser une instruction With comme celle-ci:

With Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData))
    .ClearContents
    .Interior.Color = vbRed
    .BorderAround Color:=vbBlack, Weight:=xlThick
End With

Sinon, vous devez déclarer la plage pour chaque action ou propriété, comme ceci:

    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).ClearContents
    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).Interior.Color = vbRed
    Worksheets("Sheet1").Range(Cells(2, LastColData), Cells(LastRowData, LastColData)).BorderAround Color:=vbBlack, Weight:=xlThick

J'espère que cela vous donne une idée de la raison pour laquelle l'élève de Gary pense que le compilateur peut s'attendre à une With (même si c'était inapproprié) et comment et quand une With peut être utile dans votre code.

1
Instant Breakfast

Je viens de trouver cette méthode très simple pour effacer une feuille entière.

Sub ClearThisSheet()

ActiveSheet.UsedRange.ClearContents

End Sub
1
Don Leverton

Pour effacer toutes les lignes contenant des données, j'utilise deux variables comme celle-ci. J'aime ça parce que vous pouvez l’ajuster à une certaine plage de colonnes si vous avez besoin de ..__ Corbeau faible comme un entier Dim LastRow As Integer

CRow = 1
LastRow = Cells(Rows.Count, 3).End(xlUp).Row

Do Until CRow = LastRow + 1
    Cells(CRow, 1).Value = Empty
    Cells(CRow, 2).Value = Empty
    Cells(CRow, 3).Value = Empty
    Cells(CRow, 4).Value = Empty
    CRow = CRow + 1
Loop
0
Kitten

Pour tous ceux qui, comme moi, ont rencontré ce problème et ont besoin d'une solution qui ne supprime pas les en-têtes, voici le liner qui fonctionne pour moi:

ActiveSheet.Range("A3:A" & Range("A3").End(xlDown).Row).ClearContents

Commence à la troisième rangée - changez à votre convenance.

0
Eric Sloan

Vous avez besoin d'une déclaration With avant cela. Ou transformez les .Cells en Cells

0
Gary's Student

Le problème ne vient pas de l'instruction with, mais de la fonction Range. Elle n'accepte pas la valeur absolue de la cellule. Elle doit ressembler à Range ("A4: B100"). Vous pouvez vous référer au fil suivant pour référence. . 

le code suivant devrait fonctionner .. Convertissez les cellules (1,1) en "A1" et inversement

LastColData = Sheets(WSNAME).Range("A4").End(xlToRight).Column
            LastRowData = Sheets(WSNAME).Range("A4").End(xlDown).Row
            Rng = "A4:" & Sheets(WSNAME).Cells(LastRowData, LastColData).Address(RowAbsolute:=False, ColumnAbsolute:=False)

 Worksheets(WSNAME).Range(Rng).ClearContents
0
Rav

J'ai trouvé cela un moyen facile de nettoyer dans une forme entre la ligne souhaitée et la colonne. Je ne sais pas si c'est ce que vous recherchez. J'espère que ça aide.

Sub sbClearCellsOnlyData()
Range("A1:C10").ClearContents
End Sub
0
Zapata