Se connecter avec
S'enregistrer | Connectez-vous

Equivalent des adresses et pointeurs en VBA

Dernière réponse : dans Programmation

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.

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

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.

  1. Sub accounts_management()
  2.  
  3. 'Variables et initialisation de celles-ci
  4. Dim name As String 'variable contenant le nom de l'utilisateur
  5. Dim code As String 'variable contenant le code
  6. Dim fct As String 'variable contenant la fonction
  7. Dim i As Integer 'variable servant pr la localisation des lignes
  8.  
  9. name = "NameNULL"
  10. code = "CodeNULL"
  11. fct = "fctNULL"
  12. i = 1
  13.  
  14. ''''''''''''''''''''''
  15. 'Ouverture du fichier'
  16. ''''''''''''''''''''''
  17. 'NB; Regardez si parametrable en debut de fichier comme C++
  18. 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é
  19. ''''''''''''''''''''''''''''
  20. ''Traitement du texte brut''
  21. ''''''''''''''''''''''''''''
  22. ' parcourir les lignes tant que pas atteint la fin du feuillet
  23.  
  24. Sheets(1).Select 'selection du feuillet 1
  25. 'While Not Range("A" & i).Value = ""
  26.  
  27. fct = Left(Range("A" & i), 3)
  28. If (fct = "142") Then
  29. fct = Mid(Range("A" & i), 14, 24)
  30. MsgBox fct
  31. 'instance de l'objet account
  32. Dim ap As New Account
  33. Dim fct2 As String
  34. fct2 = "bisounours"
  35. 'methode check_fct
  36. ap.check_fct (fct) 'bug raison inconnu
  37. 'methode check_code
  38. fct = "AAAAA"
  39. ap.check_code(i,code,fct)
  40. 'methode check_tab
  41.  
  42. End If
  43.  
  44. i = i + 1
  45. 'Wend
  46.  
  47.  
  48.  
  49. ''''''''''''''''''''''
  50. ' Fermeture fichier '
  51. ''''''''''''''''''''''
  52. ActiveWindow.Close
  53.  
  54. 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:
  1. Public Function check_code(i As Integer, code As String, fct As String)
Expert Programmation

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 :
  1. Sub plus_un(i As Integer)
  2. i = i + 1
  3. End Sub
  4.  
  5. Sub test()
  6. Dim i As Integer
  7. i = 0
  8. MsgBox i
  9. plus_un i
  10. MsgBox i
  11. 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.

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)

  1. Public account_tab as string 'variable globale
  2.  
  3. Sub initialize(account_tab as string)
  4. 'initialisation du tableau
  5. End sub
  6.  
  7. Sub check_fct( fct as string)
  8. 'code
  9. End sub
  10.  
  11. sub main()
  12. Dim fct as string
  13. initialize(account_tab)
  14. fct=""
  15. check_fct(fct)
  16. 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 =)
Expert Programmation

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 :
  1. Sub addition(param1 As Integer, param2 As Integer)
  2. MsgBox param1 + param2
  3. End sub
  4.  
  5. Sub main()
  6. addition (1, 2) ' // <-- Erreur
  7. addition 1, 2 ' // <-- Ok, ça fait 3
  8. addition (1+3), 2 ' // <-- Ok, ça fait 6
  9. 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.
Lassé par la pub ? Créez un compte