Que fait réellement le jeu de mots-clés dans VBA?

150

J'espère qu'une question facile, mais j'aimerais bien une réponse technique à cela!

Quelle est la différence entre:

i = 4

et

Set i = 4

en VBA? Je sais que ce dernier lancera une erreur, mais je ne comprends pas tout à fait pourquoi.

Jon Artus
la source
4
Fiche d'information ici: stackoverflow.com/a/9924325/17034
Hans Passant

Réponses:

95

setest utilisé pour attribuer une référence à un objet. L'équivalent C serait

 int i;
int* ref_i;

i = 4; // Assigning a value (in VBA: i = 4)
ref_i = &i; //assigning a reference (in VBA: set ref_i = i)
Treb
la source
5
Une référence d'objet VB n'est pas tout à fait la même chose qu'un pointeur C. Et il n'y a pas d'équivalent de "& i" dans VB.
Tomalak
10
Pas tout à fait pareil, non. Mais assez proche pour que je comprenne le concept.
Treb
@Tomalak: Vous pouvez utiliser VarPtr ()
Atmocreations
Ce n'est pas une bonne analogie. Prenez cet exemple ( VBA on the left | C on the right): Dim A, B As Range | Range A, B;. Aller avec votre analogie, A = B | A = B;serait correct (et ce serait en C), mais Set A = B | A = &B;est en fait correct en VBA (et cela échouerait en C). En VBA, A = Bet Set A = Bsont tous les deux équivalents à C A = B;! La distinction se produit ailleurs.
Niko O
77

Dans votre cas, cela produira une erreur. :-)

Setaffecte une référence d'objet. Pour toutes les autres affectations, l' Letinstruction (implicite, facultative et peu utilisée) est correcte:

Set object = New SomeObject
Set object = FunctionReturningAnObjectRef(SomeArgument)

Let i = 0
Let i = FunctionReturningAValue(SomeArgument)

' or, more commonly '

i = 0
i = FunctionReturningAValue(SomeArgument)
Tomalak
la source
44

Depuis MSDN :

Mot-clé Set: Dans VBA, le mot-clé Set est nécessaire pour faire la distinction entre l'affectation d'un objet et l'affectation de la propriété par défaut de l'objet. Étant donné que les propriétés par défaut ne sont pas prises en charge dans Visual Basic .NET, le mot clé Set n'est pas nécessaire et n'est plus pris en charge.

Galvégien
la source
Bien trouvé, mais un lien vers l'article que vous avez trouvé sur MSDN serait encore mieux :)
Neil Barnwell
1
@Neil - le lien est là si vous cliquez sur MSDN dans mon message.
Galwegian
2
Lors de la copie du MSDN, au moins l'article correct. Celui-ci fait référence à VB.NET, pas à VBA.
Tomalak
1
OP pose des questions sur VBA, et bien que les informations sur Set ne soient plus nécessaires pour une utilisation dans .NET sont utiles, c'est un sujet hors sujet et pas utile pour les personnes arrivant ici avec l' Object variable or With block variable not seterreur de VBA :)
AJP
7
Merci beaucoup pour l'extrait de MSDN. Toutes les autres réponses, même celles acceptées, manquent le point. «set» concerne la PROPRIÉTÉ PAR DÉFAUT. Il suffit de lire stackoverflow.com/a/9924325/717732
quetzalcoatl
10

Set est utilisé pour définir des références d'objet, par opposition à l'attribution d'une valeur.

LeppyR64
la source
1

Du haut de ma tête, Set est utilisé pour affecter des objets COM à des variables. En faisant un Set, je soupçonne que sous le capot, il fait un appel AddRef () sur l'objet pour gérer sa durée de vie.

Sean
la source
1
Il n'est pas seulement utilisé pour les objets COM, mais pour tous les objets. La principale raison pour laquelle vous utilisez SET est expliquée par Galwegian.
Ikke
0

Ainsi, lorsque vous souhaitez définir une valeur, vous n'avez pas besoin de "Set"; sinon, si vous faites référence à un objet, par exemple une feuille de calcul / une plage, etc., vous devez utiliser "Set".

Eric Wang
la source
-1

Set est un mot-clé et il est utilisé pour attribuer une référence à un objet dans VBA.

Par exemple, * L'exemple ci-dessous montre comment utiliser Set dans VBA.

Dim WS comme feuille de calcul

Définir WS = ActiveWorkbook.Worksheets ("Sheet1")

WS.Name = "Amit"

Amit Singh
la source