104 votes

Quelle est la différence entre dim et set en VBA

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?

89voto

Michael Points 830

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

76voto

ckuhn203 Points 1236

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.

  1. r est déclaré en tant que Variant

    `Dim r` ' TypeName(r) renvoie "Empty", qui est la valeur pour un variant non initialisé
  2. r est défini sur le Range contenant la cellule "A1"

    Set r = Range("A1") ' TypeName(r) renvoie "Range"
  3. 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.

12voto

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

5voto

Justin Niessner Points 144953

Dim déclare simplement la valeur et le type.

Set affecte une valeur à la variable.

1voto

Soroush Points 1

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.com

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.

Powered by:

X