[RESOLU] A quoi font référence les variables dans une macro?

alienox

XLDnaute Occasionnel
Bonjour le forum,

Je viens vers vous car à la suite de plusieurs recherches, de cours suivis en ligne, de vidéo, acheter des livres, etc..., ils disent tous la même chose soit il y a un truc que je ne comprends pas, soit j'ai omis quelques choses

Voilà avec un exemple:

Code:
Sub Macro1()
Dim Mavariable as integer
Mavariable= 2
Jusqu'ici, c'est bon, je le lis comme cela : " je déclare MaVariable sous forme d'entiers et MaVariable est égale à2"

Ensuite si:
Code:
Dim i, j, T
Ici ces variables sont déclarées en Variant, ça c'est ok, mais à quoi font référence ces variables?
Parce que ici on ne dit pas i=blabla , j=blablabla et T= quelle chose.

Autre exemple:
Code:
Dim k, p, o, q, ctrl
Dim prépa, toq, cout
Dim cuis

For Each ctrl In UsfFT.Frame1.Controls
    k = k + ctrl.Value
Next ctrl
If k = 0 Then

Exit Sub
End If

For Each p In UsfFT.Frame2.Controls
If p.Value = True Then Prépa = Trim(p.Caption)
Next p

For Each q In UsfFT.Frame3.Controls
If q.Value = True Then Toq = Trim(q.Caption)
Next q

For Each o In UsfFT.Frame4.Controls
If o.Value = True Then Cout = Trim(o.Caption)
Next o

For Each ctrl In UsfFT.Frame5.Controls
If ctrl.Value = True Then Cuis = Cuis & " " & Trim(ctrl.Caption)
Next ctrl

Ici à quoi font référence tous les dim déclarés?


j'ai en cours une construction d'une macro récupérée et à adapter avec plein de variables et je ne comprends pas?

Merci de m'aider

Bonne journée
 
Dernière édition:
G

Guest

Guest
Re : A quoi font référence les variables dans une macro?

Bonjour,

Dans la déclaration de variables tu demandes au moteur VB de préparer un espace prêt à recevoir une valeur ou la référence à un objet (pour les variables objets ou variant).

Donc dans Dim i, j, T

3 espaces mémoires vont être préparer pour accueillir ultérieurement trois valeurs (ou références d'objet puisque déclarées sans type)

Quand tu déclares des types variants, ils sont initialisés avec la valeur Empty (vide), les string avec la valeur "", integer avec 0 etc.

Prends une macro quelconque mets un stop après la déclaration des variables et lance là
quand elle est arrêtée, Affichage/Variables locales
Et tu verras leur Type/contenu en face de leur nom

Déroule ton programme par F8 (en pas à pas) ou rajoute des stop (F9) sur les lignes d'initialisation et tu les verras évoluer.

A+
 

alienox

XLDnaute Occasionnel
Re : A quoi font référence les variables dans une macro?

Bonjour Hasco,

J'ai compris que le fait de déclarer une variable, permettait d'allouer un espace de mémoire, J'ai suivi ta procédure.
Par contre, je ne vois pas bien l'intérêt, à quoi fait référence, comme dans l'exemple ci-dessus, à i, j, toq, prépa etc.... i, j, T etc, quelles valeurs ont-elles?

Merci, désolé mais je suis débutant, et j'aime comprendre les choses....
 
G

Guest

Guest
Re : A quoi font référence les variables dans une macro?

Bonjour,

Je t'ai commenté la première boucle for en espérant que tu comprennes, le reste est sur le même modèle.

Code:
'Pour chaque control référencé par la variable 'ctrl' dans la collection
'des control du Frame nommé 'Frame1' appartenant au userFom  nommé 'UsfFT'
For Each ctrl In UsfFT.Frame1.Controls
    'La Variable k doit sommer sa propre valeur avec la valeur du contrôle
    k = k + ctrl.Value
Next ctrl
A la sortie la variables k contient la somme des valeurs de chaque controle contenu dans le frame (cadre) 'Frame1'
A+
 

alienox

XLDnaute Occasionnel
Re : A quoi font référence les variables dans une macro?

Donc en gros,
Tout ce qui ce trouve dans la Frame1 (checkbox, listbox, etc...), la variable ctrl "liste" tous ces contrôles et le K récupère les données

Alors pourquoi k=k + ctrl.value

Et comment excel sait cela sans lui avoir dit que ctrl était la frame1, que k récupère les données de la frame1

Enfin si j'ai bien compris :confused:

A+
 
G

Guest

Guest
Re : A quoi font référence les variables dans une macro?

Re,

k=k+1 ajoute 1 à la valeur de k (Nouvelle valeur=Ancienne valeur +1)

Je répète:

For Each ctrl In UsfFT.Frame1.Controls

VEUT DIRE: Boucle sur chaque control référencé par la variable 'ctrl' dans la collection
'des controles du Frame nommé 'Frame1' appartenant au userFom nommé 'UsfFT'
Ajoute la valeur de ctrl à k
Next 'Veut DIRE : passe au prochain ctrl

A+
 
Dernière modification par un modérateur:

alienox

XLDnaute Occasionnel
Re : A quoi font référence les variables dans une macro?

Re,

Ce que je ne comprends pas c'est la relation entre ctrl et k dans cet exemple, comment l'établit-on?

la variables k contient la somme des valeurs de chaque contrôle contenu dans le frame, comment peut-on ajouter une sommes des valeurs à une collection (ctrl)?

ça revient à dire d'ajouter des choux et des carottes????

Comment est référencé la variable ctrl dans la collection de la frame?

Franchement ton explication me paraît clair mais non logique (ce n'est pas toi qui n'es pas logique mais le principe de ce truc), pourtant j'essaie d'y mettre du mien.....

Ou alors j'ai encore rien compris, je suis dans le vague....

Tout comme cet exemple :
Code:
For Each o In UsfSelection.Frame3.Controls
If o.Value = True Then Cout = o.Caption
Next o
If Cout <> "" Then
Critere = Critere & "(Feuil1!G2=""" & Cout & """) * "
End If

For Each ctrl In UsfSelection.Frame4.Controls
If ctrl.Value = True Then

Critere = Critere & "(find(""" & ctrl.Caption & """,Feuil1!H2)) *"
End If
Next ctrl

Critere = "=" & Critere & "1"
Sheets("cachée").Range("A2").Value = Critere

a+:confused:
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : A quoi font référence les variables dans une macro?

Bonjour

repars plus simplement déjà pour comprendre ce qu'est une variable :)

Par exemple tu veux parcourir toutes les cellules de A1 à A10 et multiplier la valeur de chaque cellule par 2
Tu pourrais très bien écrire
range("B1")=range("A1")*2
range("B2")=range("A2")*2
...
range("B10")=range("A10")*2

tu vois ici que tu as une partie constante dans les adresses : A et B (les colonnes) et une partie variable (ah tiens !) qui est le N° de ligne.
Tu peux donc demander à excel de faire varier une variable de 1 à 10 :

Dim i as integer
for i = 1 to 10 'i prendra successivement toutes les valeurs entières entre 1 et 10, par pas de 1, sauf si tu précises le pas (step, par exemple step 2)

Range("B" & i)=range("A"& i)*2
next i

Quand excel lit cette ligne de code, il remplace i par sa valeur. LE signe & sert à concaténer les deux bouts de code :
Range("B" & 1) devient range("B1")

c'est exactement la même chose pour les controles.
Tu ne commences pas par le plus facile pour te lancer dans l'apprentissage du VBA :)
 
G

Guest

Guest
Re : A quoi font référence les variables dans une macro?

Re,

K dans ton exemple plus haut était déclaré sans type particulier.
Sans avoir le classeur sous les yeux je suppute que les différents contrôles du Frame reçoivent des valeurs numériques.
ctrl référençant en cours de boucle un de ces control et ayant une 'propriété' Value
si ctrl contient 12
si au départ k = vide
au premier passage de boucle
k = k +ctrl.Value
k est donc égal à 12
Au second passage de boucle ctrl référencie le control suivant. Si ce control contient 10
k=k + ctrl.Value
k est donc égal = 22 (12 + ctrl.value) (12 +10)
and so...

Au lieu de t'abîmer sur de tels exemple, à partir de tes bouquins construis tes propres exemples, simples, avec une variable.
Code:
Sub TonExemple()
Dim MaVariable as Integer
Dim i as Integer
For i = 1 to 10
MaVariable=MaVariable + 2 * i
Next

MsgBox MaVariable
End Sub

Je ne sais quoi ajouter.

A+
 
Dernière modification par un modérateur:

alienox

XLDnaute Occasionnel
Re : A quoi font référence les variables dans une macro?

Explication parfaite,
Dans ton exemple i=a quelque chose, jusqu'ici tout va bien et j'ai compris, mais c pour les autres quand il n'y a pas signe =
K dans ton exemple plus haut était déclaré sans type particulier.
Sans avoir le classeur sous les yeux je suppute que les différents contrôles du Frame reçoivent des valeurs numériques.
Exact, k est déclaré sans type particulier (sans =), les frames reçoivent des valeurs num et des checkbox.

ctrl référençant en cours de boucle un de ces control et ayant une 'propriété' Value
Et comme déterminer un de ces contrôles avec la propriété value, ou trouve-t-on cela?

J'aime les choses compliquées pour le rendre simple à mes yeux :p

Je peux te joindre le fichier si tu veux

Merci
 
G

Guest

Guest
Re : A quoi font référence les variables dans une macro?

Re,

Code:
Et comme déterminer un de ces contrôles avec la propriété value, ou trouve-t-on cela?

Dans l'aide excel ou l'explorateur d'objets (F2)
Et en apprenant petit à petit.
Presque tous les objets dans VBA ont une propriété value, qui est dite propriété par défaut pour la plupart d'entre eux. Propriété par défaut veut dire que K = ctrl.Value est égal à k = ctrl (sans value) mais il est bon, surtout en début d'apprentissage de spécifier le .Value pour lever toute ambiguïté.

Pour les TextBox, la proprité par défaut est la propriét Text si bien que
MonText = TextBox1.Text est égal à MonText=TextBox1

Mais encore une fois, avant de passer aux subtilités de vba, maîtrise les bases.
A+
 

Misange

XLDnaute Barbatruc
Re : A quoi font référence les variables dans une macro?

Je ne peux que plussoyer à ce que dit Hasco sur le fait de commencer par des codes plus lisibles que ceux d'un formulaire.
La notion de boucle, de variable de collections, d'objet, de range n'est pas intuitive au début. Si tu compliques en ajoutant les particularités d'un formulaire, tu risques de faire une salade assez indigeste.

OU alors commence par un formulaire bien bien plus simple ! Tu en as un exemple sur excelabo, avec un tuto pas à pas pour comprendre déjà la logique.

Quand on dit
dim k
sans préciser le type, c'est la même chose que de dire
dim k as variant
 

alienox

XLDnaute Occasionnel
Re : A quoi font référence les variables dans une macro?

Bonjour Misange,
Et merci Hasco,

Merci pour ces éclaircissements, enfin bon, pour des personnes qui comprenne cela parait logique mais pour les autres il faut passer par l'apprentissage, je fais mon nécessaire et c'est pas simple....

J'ai compris quelques trucs, je verrai bien par la suite....

@Misange
Quand on dit
dim k
sans préciser le type, c'est la même chose que de dire
dim k as variant
Ca je l'avais bien compris :D

Mais ce que je ne comprenais pas, était pourquoi déclarer une variable, ici K, ou autres (voir code plus haut) sans avoir a lui dire à quoi elle correspond, c'est ça que j'ai du mal à saisir, pourquoi déclarer des variables x, y, z ou w sans leur affecter des valeurs (x= ou w= etc...), quel est la logique la dedans?
Je sais pour vous ces logiques........

A+
 
G

Guest

Guest
Re : A quoi font référence les variables dans une macro?

Bonjour,

pourquoi déclarer une variable, ici K, ou autres (voir code plus haut) sans avoir a lui dire à quoi elle correspond

Ce sont des habitudes de programmeur, il y en a qui ne déclare aucune variable, d'autres, dont je fais partie qui les déclarent toutes, d'autres encore une partie seulement. Tout cela avec ou sans typage.

Personnellement je déclare et type toutes mes variables. Cela permet, quand on y revient bien plus tard de savoir tout de suite à quoi correspond telle ou telle variable, cela permet de signaler beaucoup d'erreur, lors de la 'compilation' (moment où le moteur va interprété le code en langage machine), cela permet l'utilisation de la complétion en tapant son code, une utilisation efficace de la fenêtre des variables, de la fenêtre espion, la fenêtre de debogage etc. De plus nous avons, aujourdhui la chance de n'être pas trop limité en mémoire vive donc nous pouvons leur donner des noms longs et explicites.

VBA est un langage permissif, d'autres langages sont bien plus strictes et lèverait une erreur dès l'omission d'une déclaration de variable.

Bonne journée
A+
 
Dernière modification par un modérateur:

Misange

XLDnaute Barbatruc
Re : A quoi font référence les variables dans une macro?

C'est une très bonne habitude à prendre que de déclarer ses variables et d'essayer (au moins !) de les typer.
Il est parfois NORMAL qu'une variable soit de type variant parce qu'elle est destinée à contenir soit du texte, soit des nombres ou encore que ce qu'elle contient change de nature au cours de la procédure.
Mais dans la majorité des cas une variable reçoit un type de donnée unique.
Ce n'est pas toujours facile de déterminer le type d'une variable, surtout quand on débute.
Quand dans le code on rencontre une erreur faisant référence au type de variable comme
"erreur d'exécution 13 incompatibilité de type"
C'est qu'une des variables est déclarée comme date par exemple et qu'on essaie d'y faire entrer un texte.
Dans ce cas, la solution que je trouve la plus pratique c'est de supprimer la déclaration du type de variable (donc laisser dim k mais supprimer le as ...) et de voir si le code passe. Si c'est le cas, revenir sur cette variable et essayer de comprendre et de trouver le bon type.

Quelques bonnes habitudes :
1) écrire Option Explicit en haut de module. Cela OBLIGE à déclarer toutes les variables (mais pas à les typer, juste à les déclarer.
2) déclarer toutes les variables en haut de procédure (ou de module quand elles sont communes à plusieurs macros). Cela aide grandement quand il faut débugger le type d'erreur indiqué plus haut
3) mettre toujours une majuscule ou plus dans un nom de variable (sauf les i, j k... qui servent juste de n° d'incrémentation dans les boucles) par exemple DateDepart au lieu de datedepart. De la sorte, quand tu écris dans le code datedepart, excel le transforme automatiquement en DateDepart et tu sais en un clin d'oeil que c'est OK alors que si tu écris datedépart, excel ne transforme pas et tu sais qu'il y a un pb.
4) Utiliser des noms de variables qui te parlent mais éviter les noms à rallonge quand même. Sinon on se retrouve avec des lignes de codes super longues, fractionnées sur plusieurs lignes, difficiles à comprendre et à modifier par la suite. A l'inverse, utiliser des noms trop courts oblige à mémoriser qu'on a mis par exemple la date de départ dans V34... pas très intuitif. Donc c'est comme en tout, il faut un juste équilibre.
5) Typer tant que l'on peut donc les variables
6) Ne pas hésiter à mettre un commentaire à côté de la déclaration de variable quand il peut y avoir une ambiguité (genre c'est la date de départ du colis et pas celle de la facture)
7) Commenter son code, surtout au début et encore plus si ce code est appelé à être repris plus tard ou par d'autres


Je suis d'accord avec toi que ce n'est pas très intuitif tout ça mais encore une fois tu es parti pour apprendre sur un exemple qui m'a l'air d'être vraiment complexe pour quelqu'un qui découvre le VBA. Pourquoi ce choix ?
J'ai encore en souvenir ma première usine à gaz, qui est le premier classeur avec des formulaires que j'avais essayé de créer. Un truc invraisemblable ou j'avais voulu gérer des trucs bien trop compliqués. Je n'étais jamais allée au bout et j'avais fini par tout refaire en repartant de 0 quelques années plus tard car la logique même de ma construction n'était pas adaptée. Depuis j'ai compris la leçon : travailler par modules. Faire un petit truc qui fonctionne parfaitement. Ajouter ensuite une fonctionnalité, la tester et ensuite ajouter encore autre chose. La technique de la mayonnaise : si tu mets toute l'huile d'un coup elle foire.

Mon conseil : lance toi sur un développement que tu fais toi. Un truc simple. C'est la meilleure façon de comprendre la logique derrière tout ça.
Il n'y a pas une seule façon d'écrire un code, bien loin de là. On reconnait sans problème la patte de certains programmeurs connus, comme on reconnait l'écriture d'un romancier. Mais on n'apprend pas à écrire une langue en commençant par des vers de poésie :)
 

Discussions similaires

Réponses
5
Affichages
180

Statistiques des forums

Discussions
312 184
Messages
2 086 008
Membres
103 089
dernier inscrit
johnjohn1969