Pardonnez-moi, je suis nouveau en VBA.
Parfois j'utilise
Dim r as Range
r = Range("A1")
D'autres fois j'utilise
Set r = Range("A1")
Quelle est la différence? Et quand devrais-je utiliser quoi?
Pardonnez-moi, je suis nouveau en VBA.
Parfois j'utilise
Dim r as Range
r = Range("A1")
D'autres fois j'utilise
Set r = Range("A1")
Quelle est la différence? Et quand devrais-je utiliser quoi?
Il n'y a aucune raison d'utiliser set
sauf en cas de référence d'objet. Il est bon de ne l'utiliser que dans ce contexte. Pour tous les autres types de données simples, utilisez simplement un opérateur d'assignation. Il est conseillé de dim
(dimensionner) TOUTES les variables cependant :
Des exemples de types de données simples seraient integer
, long
, boolean
, string
. Ce ne sont que des types de données et n'ont pas leurs propres méthodes et propriétés.
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Ce que je veux"
Un exemple d'objet
serait une Range
, une Worksheet
, ou un Workbook
. Ils ont leurs propres méthodes et propriétés.
Dim myRange as Range
Set myRange = Feuille1.Range("A1")
Si vous essayez d'utiliser la dernière ligne sans Set
, VB renverra une erreur. Maintenant que vous avez déclaré un objet
, vous pouvez accéder à ses propriétés et méthodes.
maChaine = myRange.Value
Dim
déclare la variable.
Dim r As Range
Set
définit la variable sur une référence d'objet.
Set r = Range("A1")
Cependant, je ne pense pas que c'est ce que vous demandez vraiment.
Parfois j'utilise:
Dim r as Range r = Range("A1")
Cela ne fonctionnera jamais. Sans Set
, vous recevrez l'erreur d'exécution #91 La variable objet ou le bloc With n'est pas défini. Cela est dû au fait que vous devez utiliser Set
pour affecter une valeur de variable à une référence d'objet. Ensuite, le code ci-dessus fonctionnera.
Je pense que le code ci-dessous illustre ce sur quoi vous demandez vraiment. Supposons que nous ne déclarons pas de type et que r
soit de type Variant
à la place.
Public Sub test()
Dim r
debug.print TypeName(r)
Set r = Range("A1")
debug.print TypeName(r)
r = Range("A1")
debug.print TypeName(r)
Donc, voyons ce qui se passe ici.
r
est déclaré en tant que Variant
`Dim r` ' TypeName(r) renvoie "Empty", qui est la valeur pour un variant non initialisé
r
est défini sur le Range
contenant la cellule "A1"
Set r = Range("A1") ' TypeName(r) renvoie "Range"
r
est défini sur la valeur de la propriété par défaut de Range("A1")
.
r = Range("A1") ' TypeName(r) renvoie "String"
Dans ce cas, la propriété par défaut d'un Range est .Value
, donc les deux lignes de code suivantes sont équivalentes.
r = Range("A1")
r = Range("A1").Value
Pour en savoir plus sur les propriétés d'objet par défaut, veuillez consulter "Membre par défaut d'une classe" de Chip Pearson.
En ce qui concerne votre exemple Set
:
Parfois j'utilise
Set r = Range("A1")
Cela ne fonctionnerait pas sans déclarer d'abord que r
est un objet Range
ou Variant
... en utilisant l'instruction Dim
- sauf si vous n'avez pas activé Option Explicit
, ce que vous devriez. Toujours. Sinon, vous utilisez des identifiants que vous n'avez pas déclarés et ils sont tous implicitement déclarés comme Variants.
Dim: vous définissez une variable (ici: r est une variable de type Range)
Set: vous définissez la propriété (ici: définissez la valeur de r sur Range("A1") - ce n'est pas un type, mais une valeur).
Vous devez utiliser set avec des objets, si r était un type simple (par exemple, int, string), alors vous écririez simplement :
Dim r As Integer
r=5
Selon l'aide VBA sur l'instruction SET, elle définit une référence à un objet. Ainsi, si vous modifiez une propriété, l'objet réel changera également.
Dim newObj as Object
Set var1=Object1(même type que Object)
Set var2=Object1(même type que Object)
Set var3=Object1(même type que Object)
Set var4=Object1(même type que Object)
Var1.property1=NouvelleValeurDePropriete
les autres propriétés de Var changent également, donc :
Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NouvelleValeurDePropriete`
en fait, tous les vars sont les mêmes !
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.