Pointeurs en VBA

Messages postés
13
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
20 mars 2007
- - Dernière réponse : Nyartaletotep
Messages postés
13
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
20 mars 2007
- 22 mars 2006 à 14:56
Bonjour à tous !

Déjà pour commencer je précise que j'ai fait des recherches tant sur ce site que sur d'autres. J'ai trouvé pas mal d'informations mais je n'arrive pas à coller les morceaux...

Bon je m'explique. Je cherche à faire un truc très simple (j'avais cette fonction sur ma TI92 !):

TOTO = 5

Chaine = "TOTO"

#Chaine = 6

Résultat: TOTO = 6

Bon je donne cette syntaxe (#variable) qui était celle sur ma TI (basic aussi) mais ça fonctionnait très bien.

J'ai trouvé plein d'info qui permettent d'utiliser les API mais aussi les fonctions cachées VarPtr, StrPtr, ObjPtr, CopyMemory et consors. J'arrive bien à récupérer des adresses de variables en Long avec ces fonctions, mais à partir de là je me perds un peu...

Comment faire pour arriver à coder le pointeur avec ces fonctions ? Comment utiliser les adresses ?

Parce que en gros j'utilise beaucoup de variables composéss dans mon code. Ce que j'appelle composées c'est une variable dont le nom est construit à partir de bouts de chaine concaténées récupérés dans un tableau excel. J'utilise ça dans un formulaire très compliqué et ça simplifierait pas mal mon code.

Donc je veux faire ça:

Tant que feuille excel contient ligne <> ""

variable = celluleA & celluleB & celluleC

#variable = valeur

Fin de boucle

J'espère que je me fais bien comprendre :)

Merci de votre aide !
Afficher la suite 

11 réponses

Messages postés
794
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
0
Merci
Salut Nyartaletop,

bien sûr que tu te fais comprendre, il faut lire longtemps, mais tu te fais comprendre.
Je vais donc te présenter une des fonctions de VB les moins utilisées et les moins connues (même pas attirantes)(si ce n'est la moins utilisée, connue...), et pourtant une des plus puissantes (puissance relative au jeu d'instructions VB, bien sûr, déjà bien loti).

Bon trève de suspens, le digne remplaçant de ton # (dont je n'avais d'ailleurs jamais entendu parlé, je ne suis pas venu pour rien) est :
(roulements de tambour)

Function CallByName(Object As Object, ProcName As String, CallType As VbCallType, Args() As Variant) 'qui nous vient de VBA.Interaction

Allez, un exemple :

Public variable As Variant


Private Sub Command1_Click()
Dim celluleA
Dim celluleB
Dim celluleC
'lecture des troncs
celluleA = "va"
celluleB = "riab"
celluleC = "le"
'concaténation du nom de la variable composée
variable = celluleA & celluleB & celluleC
'remplacant du #
CallByName Me, variable, VbLet, "valeur"
'vérification et preuve
MsgBox variable
End Sub

Bon je t'accorde qu'il est moins dense, et qu'on les voit mal, les pointeurs. Mais il sait travailler en lecture/écriture/référence, et sur des variables/propriétés/méthodes, avec une signature qui se termine par un nombre d'arguments variable!

Merci de valider si cela te convient, ça évite aux autres de chercher encore, et surtout ça enrichit la base de solutions validées


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Messages postés
13
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
20 mars 2007
0
Merci
je ne comprends pas j'ai écrit ça:

--------------------------
Public variable As Variant

Private Sub test()

Dim bout1, bout2, bout3

bout1 = "va"
bout2 = "ria"
bout3 = "ble"

variable = bout1 & bout2 & bout3

CallByName Me, variable, VbLet, 5

MsgBox variable

End Sub
--------------------------

mais quand j'éxécute, il me sort une erreur:

Utilisation incorrecte du mot clé Me


Qu'est ce qu'il faut faire ? Me est censé se référencer à quel objet ?
Messages postés
13
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
20 mars 2007
0
Merci
Et je viens de voir un truc, quand je tape:

vba.interaction. il ne me sort pas CallByName dans la liste des méthodes. Ca vient peut être de ça ?

Et merci au fait de ta réponse claire et rapide :)
Messages postés
13
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
20 mars 2007
0
Merci
Bon ben j'ai pigé, j'utilise VBA version 5 et CallByName n'existe pas dans cette version :( Je viens de voir ça en lançant Access 2002 qui utilise VBA 6 et là j'ai la fonction...

Le problème c'est que dans ma boite, on travaille à cheval avec 2 version d'office (97 pour Word/Excel/Powerpoint et 2002 pour Access). J'ai pas le choix de la version de VBA... à moins qu'il existe un moyen de récupérer autrement cette fonction ?

Merci encore
Messages postés
794
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
0
Merci
Salut Nyartaletotep,

excuses-moi d'avoir écorcher ton pseudo cette nuit :)

Me est une référence instanciée de façon implicite dans VB, et correspond, à peu de chose près, à This ou Self dans d'autres languages (à part qu'il ne présente que les implémentations publiques)
Ici, Me référence le formulaire (ou le UserForm) dans lequel se trouve le code, et surtout, pour le CallByName, il faut lui donner l'objet à qui on applique l'appel :

donc pour Me.variable="valeur"
on écrit CallByName Me, variable, VbLet, "valeur"

Notes que Me pourrait aussi référencer une classe, un ThisWorkbook, ou une Feuille.

Il est vrai, qu'en plus, en pleine nuit, emporté par mon entrain, j'ai un peu oublié que tu voulais du VBA. Ceci dit, dans Excel 97, la méthode n'est pas implémentée, par contre, Excel 2000, 2003, XP, elle y est, sinon, VB6.

à+

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Messages postés
13
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
20 mars 2007
0
Merci
Merci de ces explications très claires ! Bon malheureusement j'ai pas le choix je suis obligé d'utiliser VBA d'Excel 97 donc version 5 :(

J'ai trouvé ceci cependant sur le site de Microsoft, ça peut peut être t'interressé, mais je ne comprends pas bien comment ça doit marcher:

http://support.microsoft.com/kb/q202057/

Qu'est ce que tu en penses ?
Messages postés
794
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
0
Merci
Je viens de le télécharger/installé/testé.
Marche bien.

- tu décompactes dans le repertoire de ton choix.
- tu registres la dll "DispTools.dll" avec regsvr32.
- tu ouvre le sample VB, et tu découvres, au pas à pas.
(ah oui, avant d'exécuter, va dans les propriétés de projet, et mets le type de projet sur Exe standard)

En gros, il fait comme le CallByName, mais la syntaxe est plus dense :)
au lieu de :

CallByName Me, variableTemp, VbLet, "valeur"

après avoir exécuté le :

Set objTemp = GetInvoker (Me)

, il te reste à écrire :
objTemp.Call variableTemp, "valeur"
ou :
objTemp.Call "variable", "valeur"
ou :
objTemp.variable = "valeur" 'mais ça, on savait faire, dans ton cas, inutile

Je viens de me rendre compte que l'exemple que je t'avais donné était ambigu (variable membre et variable locale à la fonction de même nom), alors j'ai remplacé la "variable" locale à la fonction, par "variableTemp".

PS: Belle trouvaille, dis donc!

rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Messages postés
794
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
0
Merci
Ahhh,
je crois que tu vas pleurer!
il n'ont pas implémenté l'écriture dans les propriétés!?!


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Messages postés
13
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
20 mars 2007
0
Merci
ah oui pour l'exemple en effet j'avais trouvé ça bizarre que la variable s'appelle "variable" dans les 2 cas... :p

Sinon un grand merci d'éclairer ma lanterne, je ne suis malheureusement pas très doué en anglais :( et en plus je découvre VBA et je suis très pris par le temps. Je vais essayer de faire ce que tu me dis.

Et je continue de chercher, je trouve ça tellement bete qu'il n'y ait pas de pointeur facilement utilisable :( Et je me suis aussi demandé: si j'ai VB5 et VB6 qui cohabitent sur ma machine, il n'est pas possible de référencer une dll de VB6 dans VB5 pour récupérer des fonctions, comme on le fait pour Acrobat ou d'autres trucs ? J'ai cherché un peu dans ce sens mais je ne trouve presque rien...
Messages postés
794
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
12 juin 2012
5
0
Merci
Je ne sais pas si la cohabitation permet cela, peut-être que si, si les dll sont différentes, mais cela reste risqué. M'enfin, il faut essayer!

Par contre, si tu aimes le C++, ils en fournissent les sources, avis aux amateurs et merci d'avance!

PS: le site n'est pas en anglais, il est traduit automatiquement en français approximatif.

"Il y a quelques choses de garder à esprit :
•,
Le Call que méthode ne gère pas a nommé des paramètres.,
----

•,
La méthode Call ne vous permet pas d'attribuer des valeurs à propriétés. Ils peuvent être en lecture seule.,
----

•,
Le wrapper Dispinvoker ne renvoie pas d'information de Type (méthode GetTypeInfoCount renvoie 0, méthode GetTypeInfo renvoie E_NOTIMPL) ,
----

•,
Dispinvoker utilise DISPID_EVALUATE pour l'appel de méthode."


rvblogn<SUP>
</SUP><SUP>Je veux ton bien... et je l'aurais
</SUP>
Messages postés
13
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
20 mars 2007
0
Merci
Non visiblement ça ne marche pas pour la cohabitation... dans la fenetre de référencement je vois bien VBA Office10 mais je ne peux pas le cocher en même tant que VBA Office8 et il est impossible de décocher VBA Office8... J'ai essayé de replacer les dll de la 8 par celles de la 10 mais ça ne marche pas non plus.

Tant pis :( Je vais devoir utiliser une autre méthode que les pointeurs, c'est rageant d'être bloqué à cause de ça mais bon.

En tout cas merci beaucoup de ton aide !

PS: oui je sais pour la traduction mais c'est limite si je comprends pas mieux l'anglais que ce français approximatif :p