Comprendre les variables tableau

david84

XLDnaute Barbatruc
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
 

Pièces jointes

  • test_tableau.xlsm
    14.8 KB · Affichages: 126
  • test_tableau.xlsm
    14.8 KB · Affichages: 125
  • test_tableau.xlsm
    14.8 KB · Affichages: 127

kjin

XLDnaute Barbatruc
Re : Comprendre les variables tableau

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
Code:
ReDim Preserve NomTableau(3)
A+
kjin
 

david84

XLDnaute Barbatruc
Re : Comprendre les variables tableau

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 ?

Merci
 

kjin

XLDnaute Barbatruc
Re : Comprendre les variables tableau

Re,
Ta macro fonctionne parfaitement bien (par contre, moi je n'avais pas compris ta question :rolleyes:), il faut cependant lui indiquer quoi faire de ce tableau une fois créé.
J'espère que l'exemple sera plus parlant
A+
kjin
 

Pièces jointes

  • david.xls
    43 KB · Affichages: 131
  • david.xls
    43 KB · Affichages: 131
  • david.xls
    43 KB · Affichages: 129

Habitude

XLDnaute Accro
Re : Comprendre les variables tableau

ton code
Code:
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
 
C

Compte Supprimé 979

Guest
Re : Comprendre les variables tableau

Bonjour le fil,

Une petite intervention, juste pour rectifier une HORREUR
Note : le premier élément d'un tableau dynamique n'est pas 0 mais LBound
Ahhh et depuis QUAND :confused:
On ne m'a pas mis au courant, zut de zut :D

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 :rolleyes:

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

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

david84

XLDnaute Barbatruc
Re : Comprendre les variables tableau

Re,
bonjour Kjin, merci pour ton exemple et voici ce que j'en ai compris :
1) La macro initiale issu de
ne me permettait pas d'afficher le tableau créé car il manquait pour récupérer les valeurs :
'Boucle à nouveau sur les éléments du tableau pour cette fois
'récupérer les valeurs
For i = 0 To UBound(NomTableau)
txt = txt & NomTableau(i)
Next

et
Range("A1").Resize(UBound(NomTableau) + 1) = Application.Transpose(NomTableau)
pour me les afficher.

'(*)Note le + 1 à cause de l'Option Base 0 car
'la plus grande dimension est 5 mais correspond au 6e élément
Ok, cela je l'avais noté dans le doc mais c'est bien de me le préciser;)

2) Le rôle de Preserve qui, associé à Redim permet redimensionner le tableau tout en préservant les anciennes valeurs.

NB : je note au passage le
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:rolleyes:

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;).
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Comprendre les variables tableau

Re,

merci Habitude pour ton exemple.
Voilà les passages que j'ai du mal à analyser :
Dim debut#, fin#
à quoi sert le "#" ?
'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
Pourquoi
'ReDim NomTableau(5) pas bon
?
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
Pourquoi les éléments du tableau n'ont pas été conservés alors que tu as utilisé "Preserve" associé à "Redim" ?
A+
 

kjin

XLDnaute Barbatruc
Re : Comprendre les variables tableau

Bonjour,
@Bruno, merci j'aurais été très ennuyé vis à vis de David :D
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
Code:
Range("A1").Resize(1, UBound(NomTableau) + 1) = NomTableau

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
 

david84

XLDnaute Barbatruc
Re : Comprendre les variables tableau

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é:eek:
tu n'as pas commencé par le plus simple
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.
Merci du conseil.
A+
 

Habitude

XLDnaute Accro
Re : Comprendre les variables tableau

Bonjour le fil,

Une petite intervention, juste pour rectifier une HORREUR

Ahhh et depuis QUAND :confused:
On ne m'a pas mis au courant, zut de zut :D

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 :rolleyes:

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)

A+

Tu as oublié le de mettre en "gras" le mot dynamique qui est le mot le plus important de cette phrase.
Car ce mot implique qu'il n'y a pas de base.

Et tu parle d'horreur alors que ton texte ce contredit.

cite : "Non mais ça va pas la tête, c'est vrai, si et seulement si, on utilise l'instruction : OPION BASE 1"

cite : "Le premier élément d'un tableau n'est pas forcément 0 (Dim tableau(3 to 10, 10 to 100)"
 

Habitude

XLDnaute Accro
Re : Comprendre les variables tableau

Re,

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.
 

MJ13

XLDnaute Barbatruc
Re : Comprendre les variables tableau

Bonjour à tous

Ah un sujet intéressant, les tableaux :eek:.

Je regarderai plus tard car ça m'intéresse.

Va t'on avoir un match Bruno-Habitude.

Attention Bruno, Habitude, il est plutôt du genre doué :p.
 

Discussions similaires

Réponses
16
Affichages
557

Statistiques des forums

Discussions
312 428
Messages
2 088 345
Membres
103 821
dernier inscrit
Lorient56