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

Résolu
king -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
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

Résumé de la discussion

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.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. 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 fais
    ReDim Comp()
    , puis tu utilises
    udtInitVect.Comp()
    , c'est intentionnel?
    3
    1. king
       
      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
      1. king > king
         
        tu proposes de faire ReDim udtInitVect.Comp( ) ??
        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > king
         
        oui, je propose de faire ReDim udtInitVect.Comp( )
        0
      3. king > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        MERCI BEAUCOUP!!!!
        C'est au niveau du ReDim que se situait le problème. Ma boucle marche correctement maintenant.
        0
      4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > king
         
        si tu n'as pas mis
        option explicit
        en début de code, je suggère de l'ajouter.
        0
  2. king
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      par exemple:
      dim message as string
      message=""
      for i =0 to 
      message=message+A.Comp(i)
      next i
      msgbox message
      0
      1. king > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Erreur d'exécution 13, Incompatibilité de type
        0
  3. king
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      message=message+cstr(A.Comp(i))
      ou
      message=message&A.Comp(i)
      0
    2. king > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      J’avais déjà essayé les 2, et ça affiche 000
      0
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je pense que Application.InputBox("...", Type:=1) te retourne 0.
      0
    4. king > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Ah ouais. Et qu'est ce que je fais dans ce cas?
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      as-tu essayé avec des nombres entiers?
      0
  4. king
     
    Tu penses que ça aurait un impact sur le probléme?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. king
     
    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      et si tu affiches dans la fonction udtInitVect()?
      0
      1. king > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Je viens de le faire, ça ne change rien.
        0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      quelle version de VBA, quelle application, quelle version.
      et tu as bien "option explicit"?
      0
    3. king
       
      Oui j'ai bien mis Option Explicit au debut.
      J'utilise Excel 2010.
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > king
         
        et tu as:
        dim B as udtVecteur
        B=udtInitVect()

        j'ai testé avec Excel2016, pas eu de soucis.
        0
  7. king
     
    Ça affiche bien les valeurs entrées avec Application.InputBox et non 0??
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
    2. king
       
      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
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > 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.
      0
    4. king
       
      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
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > 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?
      0
  8. king
     
    Lol, je vais devenir fou!!!
    Je pense que je vais faire un copier/coller de ton code et modifier la nomenclature.
    Merci.
    0
    1. king
       
      J'ai enfin un programme qui marche!! Merci encore!!!
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > king
         
        content pour toi, je reste perplexe: pourquoi cela ne marchait-il pas dès le départ?
        bonne continuation!
        0