Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Bonjour,
au détour d'un fil qui dirigeait vers ce doc permettant de se familiariser avec les variables tableau en VBA, j'ai copié une macro fournie dans ce fichier pour présenter l'expression Redim dans un fichier test (ci-joint) pour tenter d'en comprendre le fonctionnement (la macro est celle présente dans le fichier au "III-A. Redim").
Apparemment, il doit manquer quelque chose dans mon fichier pour que cela fonctionne correctement (cf. macro à tester).
Je pensais que la macro me construisait le tableau mais apparemment ce n'est pas le cas.
Que faut-il ajouter ou modifier pour que mon test fonctionne et pourquoi ?
Merci
Bonsoir David,
Si tu redimensionnes le tableau en cours de procédure, les données qu'il contenait précédemment sont effacées, à moins que tu ne fasses suivre l'instruction Redim du mot clé Preserve
Re
merci kjin de t'intéresser à ma question.
En fait, en tentant de déchiffrer la macro, je pensais que celle-ci me créait le tableau de toute pièce. Est-ce la cas ou dois-je créer un tableau pour que cela fonctionne ?
Si tu redimensionnes le tableau en cours de procédure, les données qu'il contenait précédemment sont effacées, à moins que tu ne fasses suivre l'instruction Redim du mot clé Preserve
Ceci veut-il donc dire que la macro ne me créé pas un tableau d'elle-même comme j'ai cru le comprendre.
Si c'est le cas, quelle est la procédure à suivre ?
J'ai tenté dans le fichier joint de créer un tableau pour tester la procédure mais cela n'a rien changé à son fonctionnement.
Peux-tu STP me placer une exemple simple sur mon fichier test pour que j'en comprenne le fonctionnement ?
Re,
Ta macro fonctionne parfaitement bien (par contre, moi je n'avais pas compris ta question 🙄), il faut cependant lui indiquer quoi faire de ce tableau une fois créé.
J'espère que l'exemple sera plus parlant
A+
kjin
Sub Test()
'Déclare la variable
Dim NomTableau() As String
Dim i As Integer
'Définit la taille du tableau
ReDim NomTableau(5)
'Boucle sur les éléments du tableau pour le remplir
'avec les lettres A,B,C,D,E et F
For i = 0 To UBound(NomTableau)
NomTableau(i) = Chr(65 + i)
Next i
'Renvoie la lettre A
MsgBox "Premier élément du tableau: " & NomTableau(0)
'Redéfinit et réduit la taille du tableau.
ReDim NomTableau(3)
'Renvoie une chaîne vide: les anciens éléments ont été effacés
'lorsque la taille du tableau a été redéfinie.
MsgBox "Premier élément du tableau: " & NomTableau(0)
End Sub
Bien vue pour le preserve
Le Ubound sert généralement a lire un tableau car il te donne le nombre d'élément qu'il contient. Il est utile dans la création de tableau dynamique.
Ici tu fait un redim 5. Tu le définie statiquement.
Alors le Ubound est inutile pour l'écriture
Note : le premier élément d'un tableau dynamique n'est pas 0 mais LBound
Voici le code proposé
Code:
Sub Test()
'Déclare la variable
Dim NomTableau() As String
Dim i As Integer
Dim debut#, fin#
'Définit la taille du tableau
'ReDim NomTableau(5) pas bon
'ReDim NomTableau(0) ' initialisation nécessaire
'avec les lettres A,B,C,D,E et F qui ne commence pas nécessairement a 0
debut = 2 'ici devrait être un calcul quelconque
fin = 7 'ici devrait être un calcul quelconque
For i = debut To fin
ReDim Preserve NomTableau(debut To i) 'agrandi le tableau dynamiquement
NomTableau(i) = Chr(63 + i)
Next i
'2 Boucles aux choix
For i = LBound(NomTableau) To UBound(NomTableau)
MsgBox "élément " & i - 1 & " du tableau: " & NomTableau(i)
Next i
For i = 0 To UBound(NomTableau) - LBound(NomTableau)
MsgBox "élément " & i + 1 & " du tableau: " & NomTableau(LBound(NomTableau) + i)
Next i
'Redéfinit et réduit la taille du tableau.
ReDim Preserve NomTableau(LBound(NomTableau) To 3)
'Renvoie une chaîne vide: les anciens éléments ont été effacés
'lorsque la taille du tableau a été redéfinie.
MsgBox "Premier élément du tableau: " & NomTableau(LBound(NomTableau)) & " - a l'indice : " & LBound(NomTableau)
End Sub
Ahhh et depuis QUAND 😕
On ne m'a pas mis au courant, zut de zut 😀
Non mais ça va pas la tête, c'est vrai, si et seulement si, on utilise l'instruction : OPION BASE 1
"La limite inférieure des tableaux est définie par l'instruction Option Base. La valeur peut être 0 ou 1. La base par défaut est 0 si l'instruction n'est pas spécifiée dans le module. Option Base doit être placée tout en haut du module, avant toute procédure ou déclaration. Celle ci est valable uniquement pour le module où elle est située."
Cette intruction est rarement utilisée 🙄
Edit : suite à une remarque judicieuse de Maitre PierreJean que je salue
Le premier élément d'un tableau n'est pas forcément 0 (Dim tableau(3 to 10, 10 to 100)
)
En revanche LBound() retourne toujours le plus petit indice disponible pour la dimension indiquée d'un tableau
Personnellement, je me serait trompé en interprétant "" comme vide alors qu'en fait cela te permet apparemment de récupérer les valeurs sous forme de chaîne de texte.
Si j'ai commis des erreurs ou approximations dans mon raisonnement, dis-le-moi STP.
Je vais continuer de lire le doc pour voir ce que j'en comprends🙄
Ceci dit, je trouve que le VBA n'est pas évident et vraiment différent du "langage formules" même si cela doit demander un certain temps d'adaptation et de pratique (comme pour les formules d'ailleurs !).
A+
Edit : bonjour et merci à Habitude (je regarde tes explications et je reviens si j'ai des questions) et à Bruno que je salue😉.
'ReDim NomTableau(0) ' initialisation nécessaire
'avec les lettres A,B,C,D,E et F qui ne commence pas nécessairement a 0
debut = 2 'ici devrait être un calcul quelconque
fin = 7 'ici devrait être un calcul quelconque
?
Si je place option base 0 et ReDim NomTableau(5), mon tableau comportera bien 6 valeurs, alors pourquoi passer par la définition ci-dessus ?
'Redéfinit et réduit la taille du tableau.
ReDim Preserve NomTableau(LBound(NomTableau) To 3)
'Renvoie une chaîne vide: les anciens éléments ont été effacés
'lorsque la taille du tableau a été redéfinie.
MsgBox "Premier élément du tableau: " & NomTableau(LBound(NomTableau)) & " - a l'indice : " & LBound(NomTableau)
End Sub
Bonjour,
@Bruno, merci j'aurais été très ennuyé vis à vis de David 😀
David, tu n'as pas commencé par le plus simple, mais ce qui parait compliqué au premier abord ne le sera plus dans qq temps, alors courage.
J'ai essayé à travers l'exemple de te montrer comment gérer les entrées/sorties
La variable txt n'était là que pour afficher le résultat dans la msgbox, et il fallait donc la réinitialiser, donc la vider (txt=""), après chaque exemple.
Par ailleurs, j'en ai profité pour utiliser la fonction "Transpose" (comme le formule) pour transposer en colonne un tableau en ligne.Sans la tranposition, il aurait fallu écrire
Note
Tu peux passer en mode pas à pas dans VBE
Met le curseur sur la macro et appuie sur la touche F8, la première ligne sera surlignée en jaune, puis appuie successivement sur F8 pour passer aux lignes suivantes
Auparavant, dans le menu Affichage, active Fenêtre variables locales, de cette manière, dans la fenêtre qui s'affiche, tu verras les valeurs que prennent successivement les variables au fur et à mesure du déroulement de ta macro.
N'hésite pas à revenir
A+
kjin
Re,
merci Kjin pour tes explications et encouragements. Mon but pour l'instant n'est pas tant de produire du code VBA que d'arriver à comprendre les codes qui sont proposés sur des fils qui m'intéresse. Ceci dit, sait-on jamais, si j'arrive à en comprendre la logique, je m'y mettrais peut-être mais pour l'instant c'est pas gagné😱
Par quoi me conseille-tu de commencer ?
Je suis tombé sur le doc indiqué au détour d'un fil. Le problème, c'est que certains codes proposés ne sont pas opérationnels tels quels.
J'ai déjà du mal à les comprendre, alors s'il faut en plus les compléter, cela devient très compliqué.
Je commence à regarder les pages VBA sur le site de JB que que connais déjà car il m'a été fort utile pour me former aux formules, mais si tu as d'autres sites à me conseiller, je suis preneur😉.
Tu peux passer en mode pas à pas dans VBE
Met le curseur sur la macro et appuie sur la touche F8, la première ligne sera surlignée en jaune, puis appuie successivement sur F8 pour passer aux lignes suivantes
Auparavant, dans le menu Affichage, active Fenêtre variables locales, de cette manière, dans la fenêtre qui s'affiche, tu verras les valeurs que prennent successivement les variables au fur et à mesure du déroulement de ta macro.
Une petite intervention, juste pour rectifier une HORREUR
Ahhh et depuis QUAND 😕
On ne m'a pas mis au courant, zut de zut 😀
Non mais ça va pas la tête, c'est vrai, si et seulement si, on utilise l'instruction : OPION BASE 1
"La limite inférieure des tableaux est définie par l'instruction Option Base. La valeur peut être 0 ou 1. La base par défaut est 0 si l'instruction n'est pas spécifiée dans le module. Option Base doit être placée tout en haut du module, avant toute procédure ou déclaration. Celle ci est valable uniquement pour le module où elle est située."
Cette intruction est rarement utilisée 🙄
Edit : suite à une remarque judicieuse de Maitre PierreJean que je salue
Le premier élément d'un tableau n'est pas forcément 0(Dim tableau(3 to 10, 10 to 100)
merci Habitude pour ton exemple.
Voilà les passages que j'ai du mal à analyser :
à quoi sert le "#" ?
Pourquoi ?
Si je place option base 0 et ReDim NomTableau(5), mon tableau comportera bien 6 valeurs, alors pourquoi passer par la définition ci-dessus ?
Pourquoi les éléments du tableau n'ont pas été conservés alors que tu as utilisé "Preserve" associé à "Redim" ?
A+
En déclarant NomTableau(5)
Tu déclare un tableau de 6 éléments effectivement. Ni plus ni moins qui. de 0 a 6.
Mais comme je croyais que tu voulais rendre la taille du tableau dynamique.
On parle d'un tout autre niveau de programmation. Soit par LBound et UBound, il n'est pas bon de réserver de la mémoire inutilement.
Ta 2ieme question je ne suis pas sur. Car j'ai fait des tests et le Preserve conserve bien les éléments du tableau.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD