FORUM Tom's Hardware » Programmation » VB / VBA / VBS » Equivalent des adresses et pointeurs en VBA
 

Equivalent des adresses et pointeurs en VBA

Il y a 343 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : Equivalent des adresses et pointeurs en VBA
 
Plus d'informations

Re-bonjour  :sweat:  
Décidément j'ai du mal avec VBA ( habitué a developpé en C/C++ ne connaissant VBA que depuis hier), je voudrais en faites changer la valeur d'une variable via une methode. Pour se faire j'aurais besoin de connaitre les équivalents de * (pointeur) et &(adresse) (du C/C++) pour le VBA.Malgré des recherches googles... avec VBA , adresse et variable ..  :pfff:  
 
Pour résumer ma fonction,
Jai une chaine de caractere fct comportant 24 caracteres.
Le but de la methode du module de classe est de reprendre fct, de comparer son contenu avec un tableau( initialiser dans la classe ) et de modifier le contenu de fct afin de pouvoir le reutiliser dans mon module
 
Voici la partie concerné, en local sans faire appel a une methode/objet , elle marche.
 

Code :
  1. Public Function check_fct(fct As String)
  2. 'methode permettant de donner le nom complet de la fonction
  3. Dim j As Integer 'iterateur pour account_tab
  4. Dim fct_comp As String 'chaine de caracteres a comparer avec fct
  5. j = 0
  6. fct_comp = ""
  7. Do
  8.    fct_comp = Left(Account_tab(j), 24) 'On met les 24 premiers caracteres de la ligne du tableau dans fct_comp
  9.    If (fct = fct_comp) Then 'Si fct est equivalent a fct comp alors
  10.         fct = Account_tab(j) 'fct = a la chaine de caracteres contenu dans la ligne du tableau account_tab
  11.         j = 15 'on met directement j a 16 pour sortir de la boucle
  12.    End If
  13.    j = j + 1 'on incremente j de 1
  14. Loop Until (j > 15) 'revient a do si j est strictement inferieur a 16
  15. End Function

zeb
Profil : Modérateur libre
Plus d'informations

Deux mots-clefs à étudier : ByRef, ByVal.


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Probleme 1
Hmm apres un bref coup do'eil sur ces mots-clefs, si j'ai bien compris si je veux modifier une variable passer en parametres je dois lui mettre "by ref" et si je ne veux pas qu'elle soit modifier je dois lui mettre "byval". Cependant il est dit aussi que si rien n'est ecrit, alors le parametre est compté comme passé "by ref". Hors je veux tenir comtpe de sa valeur et le modifier.
Probleme2
Un peu a part mais ca m'evitera de recréer un topic:
J'ai comme tu me l'a fait remarquer dans le topic précédent que j'avais oublié de mettre new afin d'instancier mon objet ap.
Cependant je ne comprend pas pourquoio je ne puis utiliser ma méthode seul.
 

Code :
  1. Sub accounts_management()
  2. 'Variables et initialisation de celles-ci
  3. Dim name As String 'variable contenant le nom de l'utilisateur
  4. Dim code As String 'variable contenant le code
  5. Dim fct As String 'variable contenant la fonction
  6. Dim i As Integer 'variable servant pr la localisation des lignes
  7. name = "NameNULL"
  8. code = "CodeNULL"
  9. fct = "fctNULL"
  10. i = 1
  11. ''''''''''''''''''''''
  12. 'Ouverture du fichier'
  13. ''''''''''''''''''''''
  14. 'NB; Regardez si parametrable en debut de fichier comme C++
  15. Workbooks.Open Filename:="C:\Documents and Settings\gauthig\My Documents\142G 14062007 SOD output.xls"  ' Note , placer le fichier a traiter exactement a l'emplacement indiqué
  16. ''''''''''''''''''''''''''''
  17. ''Traitement du texte brut''
  18. ''''''''''''''''''''''''''''
  19. ' parcourir les lignes tant que pas atteint la fin du feuillet
  20. Sheets(1).Select 'selection du feuillet 1
  21. 'While Not Range("A" & i).Value = ""
  22.    
  23.     fct = Left(Range("A" & i), 3)
  24.     If (fct = "142" ) Then
  25.         fct = Mid(Range("A" & i), 14, 24)
  26.         MsgBox fct
  27.         'instance de l'objet account
  28.         Dim ap As New Account
  29.         Dim fct2 As String
  30.         fct2 = "bisounours"
  31.         'methode check_fct
  32.         ap.check_fct (fct) 'bug raison inconnu
  33.         'methode check_code
  34.         fct = "AAAAA"
  35.         ap.check_code(i,code,fct)
  36.         'methode check_tab
  37.        
  38.     End If
  39.     i = i + 1
  40. 'Wend
  41. ''''''''''''''''''''''
  42. ' Fermeture fichier  '
  43. ''''''''''''''''''''''
  44. ActiveWindow.Close
  45. End Sub


 
Il s'avere que je veuille passer en parametres ces variables ci ( corectement défini en theorie dans ma classe) afin d'en modifier certaines. Le pb etant que le debugger me dit la chose suivante :
"Erreur de compilation" Attendu: =
 
Tout début du code:

Code :
  1. Public Function check_code(i As Integer, code As String, fct As String)

zeb
Profil : Modérateur libre
Plus d'informations

Premier point. Ben, oui, tu sais donc lire un manuel. C'est bien.
Moi ausi. Mais comme je n'ai confiance qu'en ce que je vois, je fais :

Code :
  1. Sub plus_un(i As Integer)
  2.   i = i + 1
  3. End Sub
  4. Sub test()
  5.   Dim i As Integer
  6.   i = 0
  7.   MsgBox i
  8.   plus_un i
  9.   MsgBox i
  10. End Sub


Et je le constate de mes yeux-vu !
 
Second point. Et pourquoi ne pas créer plusieurs topics !?
Sinon, pour en revenir au VB, Il ne me semble pas que ce langage connaisse la notion de méthode de classe.
 
Donc une méthode doit être exécutée relativement à un objet instancié.
 
Une procédure (sub) en VB n'utilise pas de parenthèses pour présenter ces paramètres.
 
Une fonction (function) en VB renvoie toujours un résultat. L'interpréteur exige une variable pour l'y stocker.


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Alors le pb est résolut, le module de classe n'était tout simplement pas adapté a ce que je cherchais a faire et jai tout developpé comme dans ton exemple dans des modules ce qui m'a nettement facilité la vie.
Cad ( pr ceux qui tomberait sur le topic et cherchant une reponse )
( c'est juste un exemple sur la mise en forme)
 

Code :
  1. Public account_tab as string 'variable globale
  2. Sub initialize(account_tab as string)
  3. 'initialisation du tableau
  4. End sub
  5. Sub check_fct( fct as string)
  6. 'code
  7. End sub
  8. sub main()
  9. Dim fct as string
  10. initialize(account_tab)
  11. fct=""
  12. check_fct(fct)
  13. end sub


 
Et dernier point pour ceux qui chercherait un equivalent d'adresse, on m'a dit via msn qu'il fallait utiliser un long pour employer une adresse.
 
Merci Zeb de m'avoir éclairer dans la pénombre du VBA =)

zeb
Profil : Modérateur libre
Plus d'informations

NONONONONONON !
 
Lignes 13 et 14, tu mets des parenthèses autour des paramètres. Il ne faut pas. Sauf au sens mathématique, pour préciser la priorité entre deux opérations (arithmétique, booléenne, etc.)
 
Exemple :

Code :
  1. Sub addition(param1 As Integer, param2 As Integer)
  2.   MsgBox param1 + param2
  3. End sub
  4. Sub main()
  5.   addition (1, 2) ' // <-- Erreur
  6.   addition 1, 2 ' // <-- Ok, ça fait 3
  7.   addition (1+3), 2 ' // <-- Ok, ça fait 6
  8. End Sub


 
On@MSN ne dit pas que des conneries, mais ne dit pas tout. Le passage par référence est implicite en VB comme vu plus haut.
Pour interfacer du VB avec des fonctions écrites en C (DLL, API) on utilise en général le type Long, c'est vrai, là où la fonction attend une adresse, puisqu'un Long fait 32 bits, comme une adresse.


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...

Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » VB / VBA / VBS » Equivalent des adresses et pointeurs en VBA
 

Annonces Google
Publicité
Les ressources relatives