"Erreur d’exécution 9, l'indice n'appartient pas à la sélection" [Résolu/Fermé]

Signaler
-
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
-
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.

7 réponses

Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

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.
tu proposes de faire ReDim udtInitVect.Comp( ) ??
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 > king
oui, je propose de faire ReDim udtInitVect.Comp( )
>
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

MERCI BEAUCOUP!!!!
C'est au niveau du ReDim que se situait le problème. Ma boucle marche correctement maintenant.
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 > king
si tu n'as pas mis
option explicit
en début de code, je suggère de l'ajouter.
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.
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
par exemple:
dim message as string
message=""
for i =0 to 
message=message+A.Comp(i)
next i
msgbox message
>
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

Erreur d'exécution 13, Incompatibilité de type
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?
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
as-tu essayé avec des nombres entiers?
>
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

Je n'utilise que des entiers positifs
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 > king
alors pourquoi pas
Comp() As Long
?
J'ai essayé, mais toujours même problème.
Mon A.Comp(i) reçoit la valeur 0 quelque soit i.
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 > king
partage de nouveau ton code, et donne quelques infos : quelle version de VBA, quelle application, quelle version.
et essaie avec un programme tout simple qui ne fait que Application.InputBox
Tu penses que ça aurait un impact sur le probléme?
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
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
et si tu affiches dans la fonction udtInitVect()?
>
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

Je viens de le faire, ça ne change rien.
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
quelle version de VBA, quelle application, quelle version.
et tu as bien "option explicit"?
Oui j'ai bien mis Option Explicit au debut.
J'utilise Excel 2010.
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 > king
et tu as:
dim B as udtVecteur
B=udtInitVect()

j'ai testé avec Excel2016, pas eu de soucis.
Ça affiche bien les valeurs entrées avec Application.InputBox et non 0??
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 > king
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.
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?
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 > king
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?
Oui exactement comme toi, il n'y a que les noms qui changent.

Public Type udtVecteur

nom As String
NbrElt As Long
Comp() As Double

End Type



Je pense que la différence est que tu fixes le nombre des composantes dès le départ, alors que moi je demande à l'utilisateur de me la fournir.
Je vais continuer à chercher.

Merci beaucoup d'avoir pris le temps de m'aider. Merci beaucoup.
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 > king
maintenant je demande aussi le nombre de composantes, et le comportement reste bon:
Option Explicit
Public Type struct
    nn As String
    l As Long
    val() As Double
    End Type
Function popul() As struct
    Dim combien As Long
    Dim i As Integer
    popul.nn = Application.InputBox("nn", Type:=2)
    combien = Application.InputBox("combien", Type:=1)
    popul.l = combien
    ReDim popul.val(1 To combien)
    For i = 1 To combien
        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
Lol, je vais devenir fou!!!
Je pense que je vais faire un copier/coller de ton code et modifier la nomenclature.
Merci.
J'ai enfin un programme qui marche!! Merci encore!!!
Messages postés
12722
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 > king
content pour toi, je reste perplexe: pourquoi cela ne marchait-il pas dès le départ?
bonne continuation!