Erreur 9 indice n'appartient pas a la sélection

Fermé
Dachrl Messages postés 49 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 3 avril 2016 - 2 avril 2016 à 16:26
f894009 Messages postés 17191 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 20 mai 2024 - 3 avril 2016 à 18:58
Bonjour à tous,

Je me permets de poster pour vous demandez une petite aide sur un code VBA excel. Cela fait 2 jours que je suis bloquée au même endroit et je ne trouve vraiment pas de solutions.

Pour un code ci-joint http://www.cjoint.com/c/FDcosY4EEPY Il me faut globalement rentrer des valeurs dans des vecteurs qui les stockent et qui les réécrits dans une autre page excel.

Mon programme ne fonctionne pas (rien ne s'inscrit sur la feuille excel "output"). Cependant, je ne sais pas d'où vient le problème.

Soit j'utilise cette partie de code (ci-dessous) et j'ai une erreur 9 m'indiquant que l'indice n'appartient pas à la sélection (surligne en jaune la ligne sous for j = 0 to 1), et je ne comprends pas ce que cela signifie.

Et si je mets un "for l = 0 to LR-1", je n'ai plus cette erreur, mais cela ne fonctionne tout de même pas. Le code se lance mais je n'obtiens aucun résultat...

For l = 0 To LR
Workbooks("DAUL_Laura.xlsm").Worksheets("Output").Cells(2 + l, 1) = Dates(l)
For j = 0 To 1
Workbooks("DAUL_Laura.xlsm").Sheets("Output").Cells(2 + l, 2 + j) = Rain(l, j)
Workbooks("DAUL_Laura.xlsm").Sheets("Output").Cells(2 + l, 4 + j) = RTE(l, j)
Workbooks("DAUL_Laura.xlsm").Sheets("Output").Cells(2 + l, 8 + j) = Runoff(l, j)
Next j
Next l


Je commence réellement à être frustrée de ne pas réussir a corriger cette erreur, malgré mes nombreuses recherches Internet.

En vous remerciant par avance.

Laura

A voir également:

7 réponses

eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024 7 219
2 avril 2016 à 23:28
Bonjour,

contrôle les dimension de tes tableaux et les indices utilisés.
Par exemple si :
Dim Rain(1 to 10, 0 to 1)
Avec =Rain(0 , 0) ou =Rain(11 , 0) tu auras l'erreur 9 car 0 et 11 ne sont pas des indices possibles pour la 1ère dimension de Rain().
eric
0
Dachrl Messages postés 49 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 3 avril 2016 4
3 avril 2016 à 10:53
Bonjour et merci pour cette réponse.

Je comprends la logique de ce que vous m'expliquez, mais je n'arrive pas à le mettre en pratique sur mon code.

J'ai notamment essayé d'afficher des résultats intermédiaires pour voir si cela marchait, et cela ne fonctionne pas non plus. Par exemple pour ce code:

 For l = 0 To LR - 1
Dates(l) = Workbooks("DAUL_Laura.xlsm").Worksheets("info").Cells(5+l, 1)
Workbooks("DAUL_Laura.xlsm").Worksheets("test").Cells(1 + l, 1) = Dates(l)
'Rain(LR) = Workbooks("DAUL_Laura.xlsm").Worksheets("info").Cells(5+l, 4)
'PE(LR) = Workbooks("DAUL_Laura.xlsm").Worksheets("info").Cells(5+l, 5)
'Runoff(LR) = Workbooks("DAUL_Laura.xlsm").Worksheets("info").Cells(5+l, 12)
Next l


J'essaie simplement de stocker une colonne de cellules dans un tableau et d'ensuite "copier" cette colonne sur une autre feuille excel et cela ne fonctionne pas non plus... Il y a quelques chose qui m'échappe au niveau du code je pense car dans ma tête cela semble logique... =/

En vous remerciant
0
eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024 7 219
3 avril 2016 à 11:10
Bonjour,

c'est toi qui a déclaré les tableaux donc tu connais leurs limites en index. Ou est la déclaration des dimensions de rain() par exemple ???
Donc quand ça plante tu regardes les valeurs des variables utilisées, tu en as obligatoirement une qui est hors limite. Il y a donc une faille dans ta logique ou dans son application que tu dois corriger.
eric
0
Dachrl Messages postés 49 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 3 avril 2016 4
3 avril 2016 à 11:35
Oui, mon rain() est un tableau de 1 colonne et 366 lignes. Mais dans mon esprit je n'utilise pas ces limites.
Pour moi:
- Je demande de rentrer une colonne excel dans ce tableau
- Je demande de replacer ce tableau dans une colonne excel sur une autre feuille
Donc je ne joue que avec les cellules des feuilles excel, pas avec les dimensions du tableau...

J'ai défini Rain(LR) de la taille de LR (qui compte mon nombre de données de 366) mais ensuite je demande juste au code de lire des colonnes excel et de les déplacer ou stocker... Je ne touche plus à la taille du tableau...

C'est pour ça que je pense qu'au niveau du code, je dois confondre quelque chose entre les cellules et la taille du tableau mais je n'arrive pas à comprendre quoi.
0
f894009 Messages postés 17191 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 20 mai 2024 1 707
3 avril 2016 à 12:14
Bonjour,

Deux Tableaux !!!!!!!!!!!!!!!!!!!!!!!!

H(l) = H(l) + Rain(l) * rainfall_coeff

et

Rain(l, j) = Rain(l, j) * Land_Use_Percentage
0
eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024 7 219
3 avril 2016 à 12:28
Mais dans mon esprit je n'utilise pas ces limites.
Toi peut-être, mais excel oui. Tu as beau être têtu tu as plutôt intérêt à te plier à ses exigences, lui ne cédera pas.
0
f894009 Messages postés 17191 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 20 mai 2024 1 707 > eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024
3 avril 2016 à 12:29
Bonjour eriiic,

Ca flotte ??
0
Dachrl Messages postés 49 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 3 avril 2016 4 > eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024
3 avril 2016 à 12:33
Je ne cherche pas à être têtue... j'essaie réellement de comprendre ce que vous m'indiquez mais ce n'est simplement pas clair dans mon esprit, donc je ne comprends pas ce qui doit être modifié, voilà tout... encore une fois, je suis débutante. Je veux bien modifier et changer tout ce que vous me dites, mais je n'ai aucune idée de par quoi le modifier. Tout est très abstrait.

Je me plierai volontiers a ses exigences, s'il m'indiquait mes erreurs... c'est le problème principal, le code se lance, il n'y a aucun déboggage mais je n'ai aucun résultat donc c'est assez compliqué de comprendre où ça ne va pas.
0
eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024 7 219
Modifié par eriiic le 3/04/2016 à 12:59
Mais je te l'ai déjà dit.
Si les indices de ton tableau vont de 1 à 366 tu ne peux pas utiliser l'indice 0 ou 367 sinon tu as l'erreur 9.
C'est normal qu'il n'en veuille pas s'ils n'existent pas.
Et si ton tableau a 2 dimensions il faut lui indiquer les 2.
Tu ne peux pas programmer si tu ne connais pas les caractéristiques de tes variables au moment de leur utilisation. Elles sont définies lors des Dim et autres Redim ou lors de l'affectation si les dimensions n'ont pas été définies à ce moment là.
Par exemple tu fais :
Dim table as variant ' pas grand chose de défini
table = range("A2:C5").value ' tu te retrouves avec un tableau à 2 dimensions (1 to 4, 1 to 3)
msgbox table(0,1) ' erreur 9
msgbox table(1,4) ' erreur 9
msgbox table(2,3) ' ok
0
Dachrl Messages postés 49 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 3 avril 2016 4 > eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024
3 avril 2016 à 13:08
Là c'est plus clair... pour moi quand je disais de j = 0 à 1 je lui demandais de prendre une case sur la colonne 0 et une case sur la colonne 1... pour moi cela correspondait au déplacement des cellules.

Mais du coup si je redéfinis Rain() avec les bonnes valeurs, comment je fais ensuite pour bouger de cellules en cellules? Car pour moi c'est cette boucle "for j = to" qui le faisait, mais si ce n'est pas ça, alors je ne vois pas comment le faire...

Par exemple quand je faisais:


for k = 1 to LR
codecodecode
next k


Je voulais dire, "on descend de la ligne 1 à la ligne LR (limite de data) et pour chacune de ces lignes on execute la ligne du code". Mais si mon tableau dans le code a des valeurs limites ne correspondant pas a ses lignes, je ne vois pas comment modifier ces boucles "for".
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Dachrl Messages postés 49 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 3 avril 2016 4
3 avril 2016 à 12:29
Bonjour,

l et j correspondent aux lignes et colonnes... c'est uniquement pour indiquer a quel endroit se placer...

Je suis désolée si pour vous cela parait très logique mais je ne suis que débutante en vba, c'est la première fois que je dois me servir de tableaux donc c'est assez compliqué pour moi... et malheureusement ce n'est pas un passe-temps.
0
f894009 Messages postés 17191 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 20 mai 2024 1 707
Modifié par f894009 le 3/04/2016 à 14:17
Bonjour a vous deux,

entre autre anomalies que celle que j'ai citee plus haut

erreur 9:


LR=0 et LP=0, normal vu ce code:
0
eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024 7 219
3 avril 2016 à 14:42
J'ajouterai que ce n'est pas en changeant au hasard que tu obtiendras qq chose de valable.
Tu as à peu près autant de chance d'obtenir ton résultat qu'un singe qui taperait sur un clavier et en sortirait Les Misérables de Victor Hugo.
Quand on ne sait pas on commence par se renseigner, rien n'est inné :
https://www.google.fr/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=variables%20tableau%20vba
0
Dachrl Messages postés 49 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 3 avril 2016 4
3 avril 2016 à 15:16
L'erreur de evapotranspiration = rainfall = ... a été corrigée peu de temps après que j'ai posté sur ce forum, elle ne change rien au reste.

Et chez moi LR = 366 et LP = 366, 366 étant les valeurs des cellules (3,2) et (3,3)...

"Quand on ne sait pas on commence par se renseigner", merci mais j'ai eu des cours qui ne sont restés que dans le général et le simple et ne m'ont pas appris a créer de tableau. Votre lien google me renvoi sur une page où quasiment l'intégralité de ces liens sont en violet signifiant qu'ils ont été consultés auparavant. Donc, comme j'ai indiqué dans mon tout premier message, j'ai passé deux jours entiers a n'écrire aucune ligne de code et à simplement chercher ce qui n'allait pas, mais mon niveau étant (encore une fois) débutant, ce n'est pas évident pour moi de comprendre et surtout de mettre en relation ce que je lis sur Internet avec mon code.

Par ailleurs, eriiic, j'apprécie l'aide et les réponses, mais les réflexions que tu fais commencent a devenir irrespectueuses. VBA est peut-être d'une logique extrême pour toi, ce n'est pas mon cas. Donc oui quand je ne comprends pas, j'essaie de modifier des choses qui pour toi sont "au hasard" mais il est difficile de changer quelque chose de façon "pas au hasard" quand on ne comprend pas tout, et surtout, que le logiciel n'indique pas l'erreur. J'ai fait plusieurs languages dans mes études, et par exemple, C et R indiquent où sont les erreurs ou warnings ce qui permet de corriger le code. Ici VBA lance mon code et rien ne marche. Si on ne m'indique pas d'erreurs, je ne peux pas juste les deviner à mon niveau.

Donc quand on a un cours qui reste général et apprend à nommer une variable simple et qu'on doit tout apprendre de soit-même, des boucles à l'usage des userforms ou des fonctions, et qu'on a une semaine pour rendre un projet qui dépasse complètement ce qui a été vu en cours, on a beau chercher sur Internet, on essaie aussi un peu "au hasard" car Internet ne donne pas toutes les solutions non plus. Et quand on arrive pas seule, ni avec Internet, on se permet de demander de l'aide sur des forums créés pour ce but. Donc c'est très gentil d'avoir essayé de m’aiguiller mais tes explications pour moi sont aussi claires qu'un singe essayant de taper les Misérables sur un clavier. Pardon d'être débutante et stupide et ne de pas comprendre ce que tu me dis, ce que tu interprêtes comme de l'entêtement.
0
eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024 7 219
Modifié par eriiic le 3/04/2016 à 16:18
Ok.
J'ai essayé de t'expliquer ton erreur 9 de 3 façons différentes.
D'autre part as-tu fait ça donné dès le post 3 :
Donc quand ça plante tu regardes les valeurs des variables utilisées, tu en as obligatoirement une qui est hors limite. Il y a donc une faille dans ta logique ou dans son application que tu dois corriger.
Si oui, tu dois savoir pourquoi tu as cette erreur donc je pense que non. Ne soit donc pas surprise qu'on te renvoie sur des liens du B.A.BA pour te permettre de mieux analyser.
Du coup tu remplaces LR par LR-1 sans même savoir ce qu'il valait au moment de l'erreur.
Est-il seulement initialisé correctement ?

Les forums ne sont pas fait pour donner des cours particuliers sur des bases supposées acquises. Oui, la compréhension des index d'un tableaux en fait partie. On ne ferait que répéter ce qui se trouve déjà dans beaucoup de tutos.
Je veux bien croire que tu fais des efforts mais je suis aussi à cours d'imagination pour expliquer, je vais donc m'arrêter là.
Bonne continuation
0
Dachrl Messages postés 49 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 3 avril 2016 4
3 avril 2016 à 16:34
A aucun endroit il n'y a écrit que le forum n'accepte pas les débutants.
Il y a écrit "forum d'assistance" et non "forum d'assistance pour les confirmés". C'est très gentil de ta part de vouloir aider les gens, mais ne répond pas à un message où l'erreur te semble trop simple et que cela t'agace d'aider des débutants. Tu n'est pas pédagogue. Tu expliques des choses en supposant que les gens savent de quoi tu parles, ce n'est pas le cas pour moi donc oui tu me parles chinois, peu importe ta façon d'expliquer, cela ne m'aide pas. Je comprends ce que tu dis dans la forme mais dans le fond pour le mettre en accord avec mon code, non, tu parles chinois. Je te demande pas un cours, mais un exemple avec mon code en me montrant l'erreur et m'expliquant ce qu'il fallait utiliser à la place était plus simple que des pseudo aiguillonnements indiquant simplement l'erreur commise, car cela ne m'aide pas à comprendre ce que je suis sensée faire à la place. Et ce n'est pas demander une rédaction entière de code puisque le code est déjà là et linké dans le premier message mais simplement aider à corriger une erreur au lieu de se contenter de l'expliquer. L'explication, donné 3 fois, je l'ai bien pigé, mais je vois toujours pas comment la résoudre, alors que pour toi c'est évident.
0
eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024 7 219
3 avril 2016 à 17:43
f894009 t'a pseudo-aiguillé aux posts 5 et 12
Je t'ai pseudo-aiguillé plus précisément au post 15.
Alors au lieu de rebondir sur la forme intéresse toi au fond.
Maintenant si tu ne veux toujours pas contrôler la valeur de tes variables et leur initialisation...
Et si tu remplaces une boucle for i=0 to 0 par une autre for i= 0 to -1 tu ne passes plus dans la boucle. Ne met donc pas la faute sur vbe qui ne t'annonce plus d'erreur vu qu'il ne traverse plus ces lignes.
0
Dachrl Messages postés 49 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 3 avril 2016 4
3 avril 2016 à 18:04
Mais j'ai contrôlé les valeurs! Mon fichier excel est ouvert en continu et je ne fais que ça lire et relire le code en essayant de le corriger, mais j'ai beau changer des valeurs, vu que je comprends pas en soit ce qui doit être modifier, je fais en effet des modifications "au hasard". Et ca ne marche pas. Ce n'est même plus un problème d'erreur 9. Le code se lance sans m'indiquer d'erreur. Mais n'affiche pas les résultats. Donc oui, il y a toujours un problème, maintenant je ne suis pas devenu experte en moins de 24 heures donc j'ai beau modifier, tester etc... je ne trouve pas la solution.

Et je ne fais que ça essayer de comprendre le fond... je n'en ai pas rien a faire de ce code mais essaie aussi de comprendre que ce que tu m'expliques, la façon dont c'est expliqué, bien que je comprenne le poste, je n'arrive pas à le mettre en application avec mon code. Et c'est bien le problème depuis le début, je n'arrête pas d'essayer de mettre en application ce que tu me dis, mais clairement il y a un couac puisque je n'y parviens pas.

Pour le poste 5, je vous demande pourquoi est-ce que l et j ne correspondent pas aux colonnes et aux lignes, si ce n'est pas la boucle for qui le fait, et j'obtiens comme réponse que je suis têtue et que je n'essaie pas.......
Et le poste 12 j'y ai répondu donc à un moment il faut arrêter de prétendre que j'ignore ce que vous me dites quand c'est moi qui répond et que vous ignorez ces réponses...
0
eriiic Messages postés 24575 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 26 mai 2024 7 219
3 avril 2016 à 18:57
Contrôler une variable c'est s'arrêter dessus et regarder sa valeur en amenant le curseur dessus (son évaluation s'affiche) ou bien en glissant la variable ou une expression sélectionnée dans la fenêtre d'espions (menu affichage).

Si tu l'avais fait tu aurais vu que LR=0 quand tu attaques ta boucle for.
Si en partant du début du code tu fais une recherche (Ctrl+F) sur LR tu rencontres :
Dim LR As Integer
puis :
Worksheets("info").Cells(3, 2) = LR : tu mets la cellule (3,2) à 0 au lieu (on suppose...) d'initialiser ta variable !!!!
plus bas :
ReDim Dates(LR), Rain(LR), PE(LR), Runoff(LR), H(LR), E(LR), RTE(LR)
tu déclares des tableaux à 1 dimension, alors pourquoi plus bas on lit :
Rain(l, j) = Rain(l, j) * Land_Use_Percentage
alors qu'il ne me semble pas avoir vu entre-temps un redimensionnement à 2 dimensions (?)

Et n'oublie pas de contrôler la ligne surlignée jaune par f894009.
Si tu écris a = b = c tu affectes à a le résultat du test b=c, c'est à dire True ou False. C'est vraiment ce que doit prendre comme valeur ton evapo..._coeff ?

Avoue que les pseudo aiguillonnements te mettaient tout ça sous les yeux et ça aurait dû t'alerter.
Je suppose qu'il doit y avoir encore d'autres erreurs de conception donc apprend à faire en pas à pas (F8) et à contrôler sérieusement le contenu de tes variables aux instants cruciaux...
0
f894009 Messages postés 17191 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 20 mai 2024 1 707
Modifié par f894009 le 3/04/2016 à 19:14
Re,

Restons Zen svp.

Et chez moi LR = 366 et LP = 366, 366 étant les valeurs des cellules (3,2) et (3,3)...

comment LR et LP ont cette valeur car dans tout le code il n'y a aucune ligne qui les ecrivent ??

pour le Tableau Rain que vous affectez en Redim Rain(LR), vous ne pouvez pas l'utilisez en Rain(i,j) car c'est un autre type de tableau

Apres pour LR ou LR-1 faut voir, car normalement nous pouvons definir des tableaux par une autre methode que eriiic a aborde au post 10 et qui sont tres "simple" a utiliser, suffit de le savoir

J'ai commence a modifier votre fichier (pour le fun), mais c'est Rain(i,j) qui me pose probleme (ben oui, je n'ai pas la notice d'utilisation), je pense qu'il faut deux tableaux Rain1 et Rain2, car vous utilisez une boucle de deux. Vu qu'il y a jusqu'a trois boucles imbriquees, faut voir
0