"Erreur d’exécution 9, l'indice n'appartient pas à la sélection"
Résoluyg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention -
Je suis entrain d’écrire une fonction qui me permet d'initialiser des vecteurs en interagissant avec l'utilisateur en lui demandant:
nom As String 'nom du vecteur NbrElt As Long 'nombre de composantes Comp() As Double 'composantes des vecteurs
La fonction est la suivante:
Function udtInitVect() As udtVecteur
udtInitVect.nom = Application.InputBox("Donner le nom du vecteur", Type:=2)
udtInitVect.NbrElt = Application.InputBox("Donner le nombre de composantes", Type:=1)
ReDim Comp(udtInitVect.NbrElt)
Dim i As Long
Do
udtInitVect.Comp(i) = Application.InputBox("Entrez la valeur de la composante " + CStr(i) + " de " + udtInitVect.nom, Type:=1)
Loop While i <= udtInitVect.NbrElt
End Function
Mon problème est qu'au moment d'entrer la valeur des composantes, il y a affiché:
"Erreur d’exécution 9, l'indice n'appartient pas à la sélection"
Quelqu'un aurait il une idée d’où se situe le problème?
Merci d'avance.
| EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI Merci d'y penser dans tes prochains messages. |
7 réponses
Le souci porte sur l’initialisation interactive d’un vecteur en VBA via un type udtVecteur comprenant nom, NbrElt et Comp, lorsque l’utilisateur saisit les valeurs des composantes après avoir renseigné le nom. Le message d’erreur d’exécution 9 indique que l’indice n’appartient pas à la sélection lors de la saisie des composantes, et la solution proposée est de redimensionner correctement le tableau Comp du vecteur via ReDim udtInitVect.Comp(...). D’autres conseils préconisent Option Explicit et l’harmonisation de l’indexation (1 ou 0) en dimensionnant le tableau avec 1 To NbrElt ou 0 To NbrElt selon le choix. Une nuance utile de la discussion est que l’erreur apparaît souvent lorsque le bas du tableau n’est pas aligné avec l’index utilisé dans la boucle.
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonsoir,
le sujet est en cours de discussion ici: https://forum.excel-pratique.com/viewtopic.php?forum_uri=excel&t=89780&start=
quelle est la déclaration de udtVecteur?
quelle est la valeur de i au moment de l'erreur?
peut-être mieux avec:Loop While i < udtInitVect.NbrElt
tu faisReDim Comp()
, puis tu utilisesudtInitVect.Comp()
, c'est intentionnel? -
Tu aurais une idée de comment afficher un vecteur de type A.Comp(i) avec MsgBox??
J'ai un problème de syntaxe par rapport à la récurrence. -
J'ai essayé ton code, mais il y a un message d'erreur au niveau de la ligne 4.
Je vois affiché A.Comp(i) = 0.
Tu vois pourquoi? -
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Mon code pour initialiser le vecteur:
Function udtInitVect() As udtVecteur
udtInitVect.nom = Application.InputBox("Donner le nom du vecteur", Type:=2)
udtInitVect.NbrElt = Application.InputBox("Donner le nombre de composantes", Type:=1)
ReDim udtInitVect.Comp(udtInitVect.NbrElt)
Dim i As Long
i = 1 ' ajouter pour initialiser le compteur i
While Not (i > udtInitVect.NbrElt)
udtInitVect.Comp(i) = Application.InputBox("Entrez la valeur de la composante " + CStr(i) + " de " + udtInitVect.nom, Type:=1)
i = i + 1 ' ajouter pour passer à la valeur suivante du vecteur
Wend
End Function
Et pour l'afficher:msgVect1 = B.nom + " = "
i = 1 ' ajouter pour initialiser le compteur i
While Not (i > B.NbrElt)
msgVect1 = msgVect1 & vbCrLf & B.Comp(i) & vbCrLf
i = i + 1 ' ajouter pour passer à la valeur suivante du vecteur
Wend
MsgBox msgVect1 -
-
cela affiche les valeurs entrées avec inputbox, ainsi:
Option Explicit Public Type struct nn As String l As Long val() As Double End Type Function popul() As struct popul.l = 3 Dim i As Integer ReDim popul.val(1 To 3) popul.nn = Application.InputBox("nn", Type:=2) For i = 1 To 3 popul.val(i) = Application.InputBox(CStr(i), Type:=1) Next i End Function Sub testinput() Dim s As struct Dim i As Integer Dim msg As String msg = "" s = popul() msg = msg + s.nn + ": " For i = 1 To s.l msg = msg + CStr(s.val(i)) + "," Next i Debug.Print msg End Sub -
-
-
-
aucune idée, j'ai essayé de faire exactement la même chose que toi, le plus fidèlement possible, à part les noms de type et de variable. j’espérais obtenir le même problème, ou que mon exemple ne fonctionne pas chez toi.
je n'ai pas une vue d'ensemble sur ton projet. tu as maintenant chez toi un cas qui fonctionne et un qui ne fonctionne pas.
tu peux soit analyser les différences entre les deux, soit atténuer ces différences, créer des cas intermédiaires, et découvrir à quel moment le comportement change.
à tout hasard: tout est dans un seul module, tu as bien déclaré tout comme moi, avec un type précis?
-
-
Lol, je vais devenir fou!!!
Je pense que je vais faire un copier/coller de ton code et modifier la nomenclature.
Merci.