VBA : ParamArray n'est pas ByRef ?????????

dionys0s

XLDnaute Impliqué
Bonjour le forum,

je chercher à créer une fonction de réinitialisation de n'importe quelle variable (utile pour les variables publiques principalement), et je pensais utiliser un truc du genre :
VB:
Public Function ClearPublicVar(ParamArray PublicVar() As Variant) As Boolean

  Dim Var As Variant

  If UBound(PublicVar) > LBound(PublicVar) Then
    For Each Var In PublicVar
      If VarType(Var) = vbArray Then
        Erase Var
      ElseIf VarType(Var) = vbBoolean Then
        Var = False
      ElseIf VarType(Var) = vbByte Then
        Var = 0
      ElseIf VarType(Var) = vbCurrency Then
        Var = 0
      ElseIf
        etc...
      End If
    Next Var
  End If

End Function

Je voulais utiliser le ParamArray pour réinitialiser autant de variables voulues d'un coup, mais visiblement ça ne fonctionne pas. Existe-t-il une méthode alternatives ?

D'avance merci,

dionys0s
 

Dranreb

XLDnaute Barbatruc
Re : VBA : ParamArray n'est pas ByRef ?????????

Bonsoir.
Comme ça ça a l'air de marcher:
VB:
Public Sub ClearPublicVar(ParamArray PublicVar() As Variant)
Dim P As Long
For P = LBound(PublicVar) To UBound(PublicVar)
   Select Case VarType(PublicVar(P))
      Case Is >= vbArray: Erase PublicVar(P)
      Case vbBoolean: PublicVar(P) = False
      Case vbDouble, vbLong, vbInteger, vbByte: PublicVar(P) = 0
      End Select: Next P
End Sub
Sub test()
Dim X As Boolean, Y As Double
X = True
Y = 3.141592
ClearPublicVar X, Y
MsgBox X & ", " & Y
End Sub
Je pense qu'avec un For Each il prends une copie de chaque paramètre.
 
Dernière édition:

dionys0s

XLDnaute Impliqué
Re : VBA : ParamArray n'est pas ByRef ?????????

Bonjour Dranreb, bonjour Laurent,
Bonjour le forum,

Laurent, j'avais consulté cette page avec, et effectivement, ils ne précisent pas plus l'aspect ByRef/ByVal de ParamArray.
Dranreb c'est parfait ! ça fonctionne très bien ! Merci beaucoup !
Maintenant je me demande bien pourquoi lorsque je passe en paramètre un tableau dimensionné en tête de module Public TABLO() as integer, il ne s'arrête sur aucune VarType (et donc pas le vbArray)...
 

Dranreb

XLDnaute Barbatruc
Re : VBA : ParamArray n'est pas ByRef ?????????

vbArray = 8192 soit &H2000
La fonction VarType ne renvoie jamais la valeur pour la constante vbArray elle-même. Elle est toujours ajoutée à une autre valeur pour indiquer un tableau d'un type particulier. La constante vbVariant n'est renvoyée que lorsqu'elle est associée à vbArray pour indiquer que l'argument de la fonction VarType est un tableau de type Variant. Par exemple, la valeur renvoyée pour un tableau de nombres entiers est le résultat de vbInteger + vbArray, ou 8194. Si un objet possède une propriété par défaut, VarType (object) renvoie le type de celle-ci.
En somme VarType renvoie avant tout le type de donnée de la chose, combiné par un OU inclusif à &H2000 s'il s'agit d'un tableau d'éléments de son espèce.
Au point que vbVariant (12 alias &HC) ne peut se retrouver que dans vbArray + vbVariant (8204 alias &H200C)
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : VBA : ParamArray n'est pas ByRef ?????????

Bonsoir à tous

Pourquoi pas tout simplement ?
Code:
Sub testII()
Dim X As Boolean, Y As Double
X = True
Y = 3.141592
MsgBox X & ", " & Y
X = 0:  Y = 0
MsgBox X & ", " & Y
End Sub
Et j'ai du mal à comprendre la finalité de la chose ?
Sauf erreur de ma part, qu'on réinitialise ou pas les variables à chaque exécution du code,
on aura toujours : X=True et Y=3.141592 non ??
 

Dranreb

XLDnaute Barbatruc
Re : VBA : ParamArray n'est pas ByRef ?????????

C'est sûr que l'utilité de cette procédure là en particulier m'a paru assez discutable aussi.
Mais il m'a semblé que la question portait surtout sur l'exploitabilité d'un ParamArray.
Ça m'a été bien agréable d'avoir pu écrire une Property Let ￾Étalage fonctionnant à l'inverse de la fonction Array, capable de distribuer à une série de variables élémentaires les termes de la solution d'un système d'équations.
VB:
Property Let Étalage(ParamArray Éléments() As Variant, ByVal VArray As Variant)
Dim N As Long: For N = 0 To Min(UBound(Éléments), UBound(VArray)): Éléments(N) = VArray(N): Next N
End Property
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonsoir.
Une procédure Property Let est faite pour être spécifiée à gauche du signe égal d'une affectation.
On peut en effet lui attribuer une valeur. Celle ci est récupérée dans la procédure sous la forme du dernier paramètre formel, qui n'est est pas réellement un, puisqu'il ne se spécifie pas à l'appel, vu que c'est l'expression donnée après le signe égal.
S'il n'y a pas d'autre paramètre avant ce dernier, on ne spécifie devant le égal que le nom de la procédure.
Il peut exister une Property Get portant le même nom, qui fonctionne comme une Function.
Ces deux types de procédures sont souvent utilisées dans les modules de classe pour en définir les propriétés.
 

dionys0s

XLDnaute Impliqué
Bonsoir,

je crois que je comprends un peu (je traficotte un peu les classes depuis quelques mois), mais je cherchais ce que faisait concrètement votre exemple.

Mais donc l'idée c'était de dire qu'on pouvait écrire quelque chose comme ça ?
VB:
Property Let Propriété(ParamArray Arguments() As Variant, Propriété As Variant)
  'Blabla
End Property

Property Get Propriété(ParamArray Arguments() As Variant) As Variant
  'Blabla
End Property
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui, et ça permet ensuite d'écrire auxsi bien :
Propriété(A, B, C) = X
que :
X = Propriété(A, B, C)
Bien sûr on veillera à ce que dans la Let A, B, C soient initialisés d'après X de telle sorte que la Get avec les mêmes A, B, C redonne le même X.

Autre exemple sans vrai paramètre :
VB:
Property Get PressePapier() As String
On Error Resume Next
With New MSForms.DataObject: .GetFromClipboard: PressePapier = .GetText: End With
If Err Then MsgBox "Pas de données récupérées", vbCritical, "PressePapier"
End Property
Property Let PressePapier(ByVal Z As String)
With New MSForms.DataObject: .SetText Z: .PutInClipboard: End With
End Property
(Donne l'impression que le presse papier de Windows est comme une variable en lecture/écriture qui s'appellerait PressePapier: PressePapier = "toto" pour Copier, R = PressePapier pour coller dans R)
 
Dernière édition:

Discussions similaires

Réponses
14
Affichages
815
Réponses
19
Affichages
2 K

Membres actuellement en ligne

Statistiques des forums

Discussions
314 190
Messages
2 107 002
Membres
109 735
dernier inscrit
Mounskad