Nyartaletotep
Messages postés13Date d'inscriptionmardi 21 mars 2006StatutMembreDernière intervention20 mars 2007
-
21 mars 2006 à 18:03
Nyartaletotep
Messages postés13Date d'inscriptionmardi 21 mars 2006StatutMembreDernière intervention20 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.
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 22 mars 2006 à 00:52
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>
Nyartaletotep
Messages postés13Date d'inscriptionmardi 21 mars 2006StatutMembreDernière intervention20 mars 2007 22 mars 2006 à 11:09
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 22 mars 2006 à 11:23
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>
rvblog
Messages postés792Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention12 juin 20127 22 mars 2006 à 12:22
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>
Nyartaletotep
Messages postés13Date d'inscriptionmardi 21 mars 2006StatutMembreDernière intervention20 mars 2007 22 mars 2006 à 12:42
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...
Nyartaletotep
Messages postés13Date d'inscriptionmardi 21 mars 2006StatutMembreDernière intervention20 mars 2007 22 mars 2006 à 14:56
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