"Erreur d’exécution 9, l'indice n'appartient pas à la sélection"

Résolu/Fermé
king - Modifié par NHenry le 25/02/2017 à 21:17
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 27 févr. 2017 à 23:12
Bonjour,

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.
A voir également:

7 réponses

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié par yg_be le 25/02/2017 à 21:48
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 fais
ReDim Comp()
, puis tu utilises
udtInitVect.Comp()
, c'est intentionnel?
3
udtVecteur est du type:

Public Type udtVecteur

nom As String
NbrElt As Long
Comp() As Double

End Type

Et l'erreur apparait à i = 0.
Pour i = 0, une valeur de la composante est bien demandée, mais ça bloque tout de suite après et affiche le message d'erreur.
0
tu proposes de faire ReDim udtInitVect.Comp( ) ??
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > king
26 févr. 2017 à 11:16
oui, je propose de faire ReDim udtInitVect.Comp( )
0
king > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
26 févr. 2017 à 12:00
MERCI BEAUCOUP!!!!
C'est au niveau du ReDim que se situait le problème. Ma boucle marche correctement maintenant.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > king
Modifié par yg_be le 26/02/2017 à 11:21
si tu n'as pas mis
option explicit
en début de code, je suggère de l'ajouter.
0
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.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
26 févr. 2017 à 12:21
par exemple:
dim message as string
message=""
for i =0 to 
message=message+A.Comp(i)
next i
msgbox message
0
king > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
26 févr. 2017 à 14:09
Erreur d'exécution 13, Incompatibilité de type
0
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?
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
26 févr. 2017 à 14:13
message=message+cstr(A.Comp(i))
ou
message=message&A.Comp(i)
0
king > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
26 févr. 2017 à 14:26
J’avais déjà essayé les 2, et ça affiche 000
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
26 févr. 2017 à 14:39
je pense que Application.InputBox("...", Type:=1) te retourne 0.
0
king > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
26 févr. 2017 à 14:42
Ah ouais. Et qu'est ce que je fais dans ce cas?
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
26 févr. 2017 à 14:57
as-tu essayé avec des nombres entiers?
0
Tu penses que ça aurait un impact sur le probléme?
0

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
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
26 févr. 2017 à 20:11
et si tu affiches dans la fonction udtInitVect()?
0
king > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
26 févr. 2017 à 20:22
Je viens de le faire, ça ne change rien.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
26 févr. 2017 à 20:33
quelle version de VBA, quelle application, quelle version.
et tu as bien "option explicit"?
0
Oui j'ai bien mis Option Explicit au debut.
J'utilise Excel 2010.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > king
26 févr. 2017 à 21:59
et tu as:
dim B as udtVecteur
B=udtInitVect()

j'ai testé avec Excel2016, pas eu de soucis.
0
Ça affiche bien les valeurs entrées avec Application.InputBox et non 0??
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
26 févr. 2017 à 23:11
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
0
Ton code affiche bien le message final pour toi?
Parce que je viens de le tester, et il n' y a rien d'affiché en sortie.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > king
27 févr. 2017 à 14:21
as-tu activé la visualisation de la fenêtre d'Exécution? c'est nécessaire pour voir ce qu'affiche debug.print
tu peux aussi faire msgbox de msg.
0
En effet, je vais de le tester avec MsgBox et ça marche très bien.
Nos codes sont assez similaires je trouve.
Qu'est ce qui cloche avec le mien d’après toi?
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > king
27 févr. 2017 à 16:56
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?
0
Lol, je vais devenir fou!!!
Je pense que je vais faire un copier/coller de ton code et modifier la nomenclature.
Merci.
0
J'ai enfin un programme qui marche!! Merci encore!!!
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > king
27 févr. 2017 à 23:12
content pour toi, je reste perplexe: pourquoi cela ne marchait-il pas dès le départ?
bonne continuation!
0