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


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)

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)

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.


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.


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.


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


-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"

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.