web-dev-qa-db-fra.com

2 façons de "ClearContents" dans VBA Excel, mais 1 fonctionne correctement. Pourquoi?

Bonsoir mes amis:

Je pense à deux façons d'effacer un contenu dans une plage définie de cellules d'un projet VBA (sous MS Excel):

  1. Worksheets("SheetName").Range("A1:B10").ClearContents
  2. Worksheets("SheetName").Range(Cells(1, 1), Cells(10, 2)).ClearContents

Le problème est que la deuxième manière me montre une erreur ' 1004 ' lorsque je ne regarde pas la feuille de calcul actuelle "SheetName" (en d'autres termes, lorsque je n'ai pas "SheetName" comme ActiveSheet).

La première façon de fonctionner parfaitement dans n'importe quelle situation.

Pourquoi cela arrive-t-il? Comment puis-je utiliser la "Deuxième manière" sans ce bug?

10
Asrhael

C'est parce que vous n'avez pas qualifié Cells(1, 1) avec un objet de feuille de calcul, et il en va de même pour Cells(10, 2). Pour que le code fonctionne, il devrait ressembler à ceci:

Dim ws As Worksheet

Set ws = Sheets("SheetName")
Range(ws.Cells(1, 1), ws.Cells(10, 2)).ClearContents

Alternativement:

With Sheets("SheetName")
    Range(.Cells(1, 1), .Cells(10, 2)).ClearContents
End With

EDIT: L'objet Range héritera de la feuille de calcul des objets Cells lorsque le code sera exécuté à partir d'un module standard ou d'un formulaire utilisateur. Si vous exécutez le code à partir d'un module de code de feuille de calcul, vous devez également qualifier Range, comme suit:

ws.Range(ws.Cells(1, 1), ws.Cells(10, 2)).ClearContents

ou

With Sheets("SheetName")
    .Range(.Cells(1, 1), .Cells(10, 2)).ClearContents
End With
12
tigeravatar

En effet, vous ne qualifiez pas complètement votre objet de cellules. Essaye ça

With Worksheets("SheetName")
    .Range(.Cells(1, 1), .Cells(10, 2)).ClearContents
End With

Notez le DOT avant les cellules?

10
Siddharth Rout

Pour l’adressage numérique des cellules, cochez la case S1O1 dans les paramètres MS Excel. C’est le deuxième onglet à partir du haut (c’est-à-dire les formules), quelque part au milieu de la page dans ma version hongroise.

Si activé, il gère l’adressage VBA dans les deux styles, à savoir Range ("A1: B10") et Range (Cells (1, 1), Cells (10, 2)). Je suppose qu'il ne gère que le style Range ("A1: B10"), s'il n'est pas activé.

Bonne chance! 

(Notez que Range ("A1: B10") représente un carré 2x10, tandis que Range (Cells (1, 1), Cells (10, 2)) représente 10x2. L'utilisation de numéros de colonne au lieu de lettres n'affectera pas l'ordre d'affichage. .)

0