Programmation VBA

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.

Bonjour king


J'ai lu ton code en vitesse, mais il me semble comprendre que l'erreur doit être sur la ligne

king a écrit :

udtInitVect.Comp(i) = Application.InputBox("Entrez la valeur de la composante " + CStr(i) + " de " + udtInitVect.nom, Type:=1)

a priori l'erreur est consécutive à un oubli d'initialisation et à ta "méthode inversée" de lecture

J"explique

Dans cette partie de ton code...

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

Tu déclares la variable "de comptage" i as long (parfait)

puis tu rentres tout de suite dans une boucle DO/LOOP WHILE

3 Problèmes

  1. lorsque tu entres dans ta boucle => tu as oublié d'initialiser la variable
  2. tu demandes la saisie de "la valeur de la composante" mais => la variable i n'a pas de valeur !!! donc erreur "l'indice n'appartient pas à la sélection"
  3. enfin tu as oublié d'incrémenter i => donc même si le code fonctionnait tu resterais toujours sur la même valeur

Et à mon avis il y a un autre problème c'est ce que je nomme plus haut "boucle inversée"

Lorsque l'on utilise une boucle de ce style "DO/LOOP WHILE condition" que l'on peut traduire par "REPETE/JUSQUA condition" (dans le temps elle se nommait d'ailleurs Repeat/Until) on suppose que la condition est forcément vérifiée lorsque l'on entre dans la boucle.

Dans ton cas il n'y a pas forcément de problème...

Mais en général il vaut mieux utiliser une boucle WHILE condition/WEND que l'on peut traduire par "TANTQUE condition/CONTINUER TANQUE" qui impose que la condition soit vérifié avant le traitement à réaliser dans la boucle et donc tu supprimes une source d'erreur !

en résumé tente en corrigeant ton code comme ci-dessous

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

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

PS/ lorsque tu veux présenter du code dans ton fil utilise les balises [CODE] en cliquant sur le bouton vert du même nom en haut message en ayant sélectionné le code en question avant... cela permettra d'avoir une "présentation" plus claire/comme dans VBA (cf. les miens ci-dessus) ;;)

Bonjour Andrea,

Merci pour ton aide. Mais j'ai fait un copier/coller de ton code, et ça ne marche toujours pas.

j'ai toujours le même message d'erreur.

La boucle s’arrête au début, c'est à dire à i = 1.

Salut Andrea,

En fait le problème se situait au niveau du ReDim.

J'aurais du écrire

ReDim udtInitVect.Comp ( ) au lieu de ReDim Comp ( )  

Merci encore pour ta boucle While.


Sinon tu aurais une idée de comment afficher un vecteur de type udtInitVect.Comp(i) avec MsgBox??

J'ai un problème de syntaxe par rapport à la récurrence.

Bonjour king

king a écrit :

Sinon tu aurais une idée de comment afficher un vecteur de type udtInitVect.Comp(i) avec MsgBox??J'ai un problème de syntaxe par rapport à la récurrence

que veux-tu dire par récurrence ?

La récurrence sur i, vu qu'il y a i composantes pour le vecteur. J'arrive pas à afficher les i composantes dans une seule fenêtre de dialogue avec MsgBox.

(re)

Cela n'a rien à voir avec de la récurrence alors...

Il faut que tu construise les message de la MsgBox avant une boucle, avant de l'afficher

Du style :

msgVect =""
For i = 1 To udtInitVect.NbrElt
[tab][/tab]msgVect = msgVect + ceQueTuVeuxMettre +vbCrLf
Next

MsgBox msgVect

Le vbCrLf pour ajouter un saut de ligne entre chaque composante !

J'ai essayé ça:

Dim msgVect As String

ReDim B.Comp(B.NbrElt)

msgVect = " Nom du vecteur "

    For i = 1 To B.NbrElt

        msgVect = msgVect + B.Comp(i) + vbCrLf

    Next

MsgBox msgVect

Mais il y a un message d'erreur au niveau de la ligne suivante:

msgVect = msgVect + B.Comp(i) + vbCrLf

Et quand je mets la souris dessus, je vois B.Comp(i) = 0.

Une idée??


Erreur 13, Incompatibilité de type

(re)

Tente comme ça ou bien utilise une "conversion" du style str(b.comp(i))

Dim msgVect As String

ReDim B.Comp(B.NbrElt)

msgVect = " Nom du vecteur "

    For i = 1 To B.NbrElt

        [barrer]msgVect = msgVect + B.Comp(i) + vbCrLf[/barrer]
        msgVect = msgVect & B.Comp(i) & vbCrLf

    Next

MsgBox msgVect

J'ai déjà fait ça. Ça marche bien pour la configuration, mais j'ai B.Comp(i)=0.

Du coup au niveau de l'affichage, j'ai le message suivi de 0.

Du genre:

Nom du vecteur

0

0

0

pour un vecteur à 3 composantes.

(re)

ce bout de code est placé où ?

Dans la procédure précédente ou dans une procédure à part ?

En tout cas l'erreur vient de ReDim !

Dans la procédure précédente. Je dois rechanger ce qu'il y a après le ReDim?

(re)

Pas forcément... et d'ailleurs ce ne serait pas très pratique !

Il vaut mieux transmettre ton tableau à la "procédure d'affichage"

en supposant ton tableau déclaré en amont des procédures, c'est à dire visible de toutes les procédures.

Public tablo()

Sub Un()
...
End Sub

Sub Deux()
... ...
End Sub
Sub AfficherTablo(monTablo)
Dim msgVect As String

[barrer]ReDim B.Comp(B.NbrElt)[/barrer]

msgVect = " Nom du vecteur "

    For i = 1 To B.NbrElt

        [barrer]msgVect = msgVect & B.Comp(i) & vbCrLf[/barrer]
        msgVect = msgVect & monTablo..Comp(i) & vbCrLf

    Next

    MsgBox msgVect

End Sub

' et pour afficher tu utilise...

AfficherTablo(leTableau)

Même problème. Je pense que le soucis est que MonTablo.Comp(i) reçoit la valeur 0 quelque soit i.

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

(re)

Et si tu mettais tout cela en PJ pour que je puisse le tester en vrai !

https://forum.excel-pratique.com/annonces/explications-et-regles-a-respecter-t13.html au point 6

Merci Andréa!!

9code.xlsm (19.67 Ko)

Bonjour à tous,

j'ai le même problème d'Erreur de type 9'. J'ai lu et relu les commentaires précédents, mais je n'arrive pas à savoir pourquoi mon code bloque. Pouvez-vous m'aider svp?

Option Explicit

Public i As Integer, j As Integer, k As Integer, m As Integer, n As Integer

Public Country() As String, Variable() As String

Public Tr As Boolean

Sub essai()

m = 0

For i = 0 To 5

m = m + 1

Country(m) = "Pays"

Next i

End Sub

Le problème se pose à partir de Contry(m)="Pays".

Rechercher des sujets similaires à "programmation vba"