Ajouter des info dans un tableau

Résolu
cs_Fabian123 Messages postés 180 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 22 novembre 2013 - 27 févr. 2008 à 14:05
cs_Fabian123 Messages postés 180 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 22 novembre 2013 - 3 mars 2008 à 10:47
Bonjour à toutes et tous,

Voilà ma question:

j'ai créé un tableau (dim Stock) dans lequel j'ai inséré deux noms d'article.

à partir de ce tableau j'ai créé un petit code qui me permet à l'utilisateur, lorsqu'il tape le numéro de ligne du tableau, d'afficher le nom de l'article.

Est-il possible de créer un code qui permettrait à l'utilisateur, à partir d'un textBox et d'un bouton de commande, d'ajouter des articles à ce tableau. (il entrerait donc un nom d'article, par exemple verre, dans le TextBox et lorsqu'il clique sur le boutonCommand "Ajouter", le nom de l'article (verre dans notre exemple) va s'ajouter dans mon tableau Dim Stock_Articles (voir le code ci-dessous)

je ne sais pas si j'ai été assez clair, je vous laisse ci-dessous le code que j'ai fait:

Merci d'avance

Private Sub CommandButton1_Click()




'reférences articles
Dim Stock_Articles(200) As String
Stock_Articles(0) = "pain"
Stock_Articles(1) = "chocolat"
Stock_Articles(2) = "eau"

Dim i As Integer
i = CInt(TextBox1.Text)

TextBox2= (Stock_Articles(i))

End Sub

25 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 févr. 2008 à 15:08
Salut,
Sache aussi que ReDim Stock_Articles(200) EFFACE le contenu d'un tableau. c'est pour cela que tu n'ajoute que à l'indice 0

@+: Ju£i?n
Pensez: Réponse acceptée
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 févr. 2008 à 16:59
Salut
Oui bien sûr.
Pour cela, il suffit de savoir quel index donner à cette donnée.
Il faut donc faire une recherche du premier article vide pour s'y installer :
   For r = 0 To UBound(Stock_Articles)
      If Stock_Articles(r) = "" Then
         Stock_Articles(r) = maTextBox.Text
         Exit For
      End If
   Next r

Si ton tableau avait été défini dynamiquement, on aurait pu faire autrement avec un ReDim Preserve
mais pas sûr que cela fonctionne sous VBA - Regarde dans l'aide

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
27 févr. 2008 à 18:00
Bonjour,

Oui jack le
ReDim Preserve fonctionne en VBA





Fabian123 avec le code ci-dessous ton tableau sera dimenssionné dynamiquement



Dim Stock_Articles() As String


Dim TableSize As Long,

TableSize =
UBound(Stock_Articles)


For r = 0 To
TableSize


      If Stock_Articles(r) = "" Then
         Stock_Articles(r) = maTextBox.Text
         Exit For
    Else If  r =
TableSize Then 'le exit for a la ligne precedente nous empechera de passer par la si la derniere ligne est vide
       
TableSize
=
TableSize
+ 1

        ReDim Preserve Stock_Articles (TableSize) 'et redimensioné ici si besoin
        Stock_Articles (TableSize) = maTextBox.Text
    End If
Next r

A+
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 févr. 2008 à 09:17
Salut,
Le problème qui va se poser après c'est que tu n'a pas testé si l'élément existait déjà dans ton tableau ou non (peu être important).

Je pense que, dans ton cas , l'utilisation d'un objet collection serait plus appropriée.

@+: Ju£i?n
Pensez: Réponse acceptée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Fabian123 Messages postés 180 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 22 novembre 2013
28 févr. 2008 à 09:20
Merci Beaucoup pour l'aide que vous m'apportez!!

J'ai essayé le code de bigfish_le vrai mais lorsque je teste le userform il m'affiche l'erreur suivante:
" erreur d'execution '9' : l'indice n'appartient pas à la sélection"

je vous joint le code tel que je l'ai encodé... (encore merci pour votre aide...)

'pour ce petit programme, j'ai créé un "userform" dans lequel j'ai placé trois TextBox (1,2 et 3) ainsi que deux
'CommandButton(1 et 2). lorsque j'introduis une valeur (de 0 à 2 dans l'exemple ci-dessous) et que je clique sur
'le commandButton1, il m'affiche le nom de l'article dans le textBox2. (voir le code du CommandButton1_Click.
'Lorsque j'introduit un nom d'article dans le TextBox3 et qu'ensuite je clique sur le commandButton2 il m'ajoute
'l'article dans mon tableau Stock_Articles.





Private Sub CommandButton1_Click()




'reférences articles

Dim Stock_Articles(200) As String
Stock_Articles(0) = "pain"
Stock_Articles(1) = "chocolat"
Stock_Articles(2) = "eau"



Dim i As Integer
i = CInt(TextBox1.Text)



TextBox2 = (Stock_Articles(i))



End Sub





Private Sub CommandButton2_Click()



Dim Stock_Articles() As String
Dim TableSize As Long
TableSize = UBound(Stock_Articles)
For r = 0 To TableSize
      If Stock_Articles(r) = "" Then
         Stock_Articles(r) = TextBox3.Text
         Exit For
         'le exit for a la ligne precedente nous empechera de passer par la si la derniere ligne est vide    Else: If r TableSize Then TableSize TableSize + 1
        ReDim Preserve Stock_Articles(TableSize)  'et redimensioné ici si besoin
        Stock_Articles(TableSize) = TextBox3.Text
    End If
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 févr. 2008 à 09:25
Re,
- Sur quelle ligne il te donne l'erreur?

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_Fabian123 Messages postés 180 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 22 novembre 2013
28 févr. 2008 à 10:22
Salut jrivet,

excuse moi de ne pas avoir pensé à préciser la ligne... (je suis novice et pour le moment je tâte beaucoup!)

voici la ligne qui pose problème: (en rouge, souligné)

Private Sub CommandButton2_Click()




Dim Stock_Articles() As String
Dim TableSize As Long




TableSize = UBound(Stock_Articles) ->(c'est la ligne qui pose probleme)





For r = 0 To TableSize
      If Stock_Articles(r) = "" Then
         Stock_Articles(r) = TextBox3.Text
         Exit For
         'le exit for a la ligne precedente nous empechera de passer par la si la derniere ligne est vide    Else: If r TableSize Then TableSize TableSize + 1
        ReDim Preserve Stock_Articles(TableSize)  'et redimensioné ici si besoin
        Stock_Articles(TableSize) = TextBox3.Text
    End If
Next r



End Sub
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 févr. 2008 à 10:31
Salut,

En fait c'est normal.
Il faut que tu saches que:

- La Variable Stock_Articles de la procédure CommandButton1_Click est DIFFERENTEde celle de la procédure CommandButton1_Click

- Lors de la déclaration d'un tableau comme tu l'as faite
Dim Stock_Articles() as string , il n'a AUCUNE dimension . Voila donc pourquoi UBound() te retourne une erreur

- Si tu souhaites travailler sur le meme tableau dans les deux procédure, tu dois déclarer ton tableau en haut de ta page de code:

'reférences articles
Dim Stock_Articles(200) As String

Private Sub CommandButton1_Click()
Dim i As Integer
   Stock_Articles(0) = "pain"
   Stock_Articles(1) = "chocolat"
   Stock_Articles(2) = "eau"

   i = CInt(TextBox1.Text)
   TextBox2.Text = (Stock_Articles(i))

End Sub<hr />

Private Sub CommandButton2_Click()
Dim TableSize As Long
   TableSize = UBound(Stock_Articles)
   For r = LBound(Stock_Articles) To TableSize
       If Stock_Articles(r) = vbNullString Then
           Stock_Articles(r) = TextBox3.Text
           Exit For
           'le exit for a la ligne precedente nous empechera de passer par la si la derniere ligne est vide
       Else           If r TableSize Then TableSize TableSize + 1
           ReDim Preserve Stock_Articles(TableSize)  'et redimensioné ici si besoin
           Stock_Articles(TableSize) = TextBox3.Text
       End If
   Next
End Sub , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_Fabian123 Messages postés 180 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 22 novembre 2013
28 févr. 2008 à 10:53
Merci beaucoup pour le temps que tu consacre à mon problème et merci pour tes conseils!

J'ai reproduis le code comme tu me l'a conseillé, mais maintenant, lorsque je nomme un article dans mon TextBox3 et que je clique sur le CommandButton2 (il est donc sensé ajouter le nom de l'article dans le tableau Stock_Articles) il m'affiche un message d'erreur qui me dit : "erreur de compilation : tableau déjà dimensionné" lorsque je clique sur "ok" (du message d'erreur) il me renvoie sur la ligne
ReDim Preserve Stock_Articles
qui se trouve dans le code du commandButton2...

J'ai essayé de supprimer le '200' que j'avais mis entre parenthèse dans mon tableau (première ligne) mais si je fais ça, il me renvoie à la première erreur que je t'avais expliqué dans le message précédent...)

Je devrais peut être revoir tout ça et travailler avec les objets collections comme tu me l'a conseillé... (il ne me reste plus qu'a retourner dans l'aide de visual basic!! hihi)

Encore merci pour ton aide
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 févr. 2008 à 11:00
Re,
Ah oui effectivement j'ai oublier de préciser.

Si tu déclares un tableau avec une dimension comme tu le fais:

'reférences articles
Dim Stock_Articles(200) As String
Il te sera IMPOSSIBLE de le redimensionner.

Il te faut donc le déclarer comme suit Dim Stock_Articles() As String puis lui donner une dimension dans  par exemple CommandButton1_Click()

Soit:
'reférences articles
Dim Stock_Articles() As String

Private Sub CommandButton1_Click()
Dim i As Integer
    Redim Stock_Articles(2)
   Stock_Articles(0) = "pain"
   Stock_Articles(1) = "chocolat"
   Stock_Articles(2) = "eau"

   i = CInt(TextBox1.Text)
   TextBox2.Text = (Stock_Articles(i))

End Sub
NOTE: Il est mieux de lui donner un dimension au démarrage de l'appli, ici si tu es dans Excel, a l'ouverture du classeur

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_Fabian123 Messages postés 180 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 22 novembre 2013
28 févr. 2008 à 11:28
Je me doutais bien que je devais declarer le tableau sans dimension;

ça marche nickel pour le commandbutton1, qui m'affiche bien le nom de l'article en fonction du numero de reference encodé.

Mais, pour l'ajout d'un article dans le tableau Stock_Articles, il refuse de fonctionner...snif!
en changeant le code comme tu me l'a conseillé dans ton dernier message, il me renvoie la même erreur que précédemment :
" erreur d'execution '9' : l'indice n'appartient pas à la sélection"
et il me renvoie à la ligne :
TableSize = UBound(Stock_Articles) ->(c'est la ligne qui pose probleme)

c'est un peu logique qu'il n'appartient pas à la sélection puisque il est sensé le créer.. non?
j'ai du mal à comprendre!
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 févr. 2008 à 11:39
Salut, peu tu reposter le code actuellement utilisé?

@+: Ju£i?n
Pensez: Réponse acceptée
0
cs_Fabian123 Messages postés 180 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 22 novembre 2013
28 févr. 2008 à 12:04
oui voici le code (et encore merci pour ton aide!)

'pour ce petit programme, j'ai créé un "userform" dans lequel j'ai placé trois TextBox (1,2 et 3) ainsi que deux
'CommandButton(1 et 2). lorsque j'introduis une valeur (de 0 à 2 dans l'exemple ci-dessous) et que je clique sur
'le commandButton1, il m'affiche le nom de l'article dans le textBox2. (voir le code du CommandButton1_Click.
'Lorsque j'introduit un nom d'article dans le TextBox3 et qu'ensuite je clique sur le commandButton2 il m'ajoute
'l'article dans mon tableau Stock_Articles.






'reférences articles

Dim Stock_Articles() As String





Private Sub CommandButton1_Click()
Dim i As Integer
    ReDim Stock_Articles(2)
    Stock_Articles(0) = "pain"
    Stock_Articles(1) = "chocolat"
    Stock_Articles(2) = "eau"



   i = CInt(TextBox1.Text)
   TextBox2.Text = (Stock_Articles(i))



End Sub




 



Private Sub CommandButton2_Click()
Dim TableSize As Long
   TableSize = UBound(Stock_Articles)
   For r = LBound(Stock_Articles) To TableSize
       If Stock_Articles(r) = vbNullString Then
           Stock_Articles(r) = TextBox3.Text
           Exit For
           ReDim Preserve Stock_Articles(TableSize)  'le exit for a la ligne precedente nous empechera de passer par la si la derniere ligne est vide
       Else           If r TableSize Then TableSize TableSize + 1
             'et redimensioné ici si besoin
           Stock_Articles(TableSize) = TextBox3.Text
       End If
   Next
End Sub
0
cs_Fabian123 Messages postés 180 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 22 novembre 2013
28 févr. 2008 à 13:57
C'est encore moi, j'ai un peu chipotté avec le code et je suis arrivé à une solution (en tout cas il ne me met plus d'erreurs!)


j'ai supprimé les lignes que j'avais créé dans le CommandButton1 (pain, chocolat, eau).


en faisant cela, lorsque je lance mon petit progr. j'encode le nom d'un article dans mon textBox3, je clique sur le CommandButton2 (ajouter). Puis, si j'introduit '0' dans mon premier textbox et que je clique sur mon CommandButton1 (afficher)  il m'affiche bien le nom de l'article que je viens d'encoder...


Mais, le probleme est que je ne sais encoder que sur la ligne '0' du tableau, je ne sais pas rajouter d'autres articles... (ou est mon erreur?)


je vous laisse ce-dessous le code pour que ca soit plus clair pour vous!

'pour ce petit programme, j'ai créé un "userform" dans lequel j'ai placé trois TextBox (1,2 et 3) ainsi que deux
'CommandButton(1 et 2). lorsque j'introduis une valeur (de 0 à 2 dans l'exemple ci-dessous) et que je clique sur
'le commandButton1, il m'affiche le nom de l'article dans le textBox2. (voir le code du CommandButton1_Click.
'Lorsque j'introduit un nom d'article dans le TextBox3 et qu'ensuite je clique sur le commandButton2 il m'ajoute
'l'article dans mon tableau Stock_Articles.






'reférences articles
Dim Stock_Articles() As String





Private Sub CommandButton1_Click()
Dim i As Integer





   i = CInt(TextBox1.Text)
   TextBox2.Text = (Stock_Articles(i))



End Sub




 



Private Sub CommandButton2_Click()
Dim TableSize As Long
    ReDim Stock_Articles(200)
    TableSize = UBound(Stock_Articles)
    For r = LBound(Stock_Articles) To TableSize
       If Stock_Articles(r) = vbNullString Then
           Stock_Articles(r) = TextBox3.Text
           Exit For
           ReDim Preserve Stock_Articles(TableSize)  'le exit for a la ligne precedente nous empechera de passer par la si la derniere ligne est vide
       Else           If r TableSize Then TableSize TableSize + 1
             'et redimensioné ici si besoin
           Stock_Articles(TableSize) = TextBox3.Text
       End If
   Next
End Sub
0
cs_Fabian123 Messages postés 180 Date d'inscription vendredi 18 janvier 2008 Statut Membre Dernière intervention 22 novembre 2013
28 févr. 2008 à 15:28
Merci Julien,


si j'enlève la ligne ReDim Stock_Articles(200), il me retourne la meme erreur (execution '9')...

j'essaye d'aborder le probleme autrement, j'enregistre les données de la textbox dans un fichier .txt et de là j'essayerai de récuperer les infos enregistrer dans le fichier .txt pour les afficher dans un nouveau textbox...

mais bon évidemment j'ai déjà des soucis ()

j'arrive seulement à enregistrer sur une seule ligne... (donc j'ecrase mes données, je ne les mets pas à la suite l'une de l'autre...)

mais j'ai créé un autre post ou je pose la question...

Ton aide précieuse est la bienvenue!!!
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 févr. 2008 à 15:32
Salut,
Non ne change pas de maniere en cour de route. tu n'apprendras pas sinon.
IL faut que tu trouves l'endroit ou placer le Redim pour qu'il ne soit executer qu'une fois!!!

Essaie de le mettre dans l'événement Activate du UserForm

@+: Ju£i?n
Pensez: Réponse acceptée
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
28 févr. 2008 à 16:57
Salut,

permetetez de repartir a partir du code que Fabian123 a poster apres ma reponse car il y beaucoup de et d'erreure generees par ses modifs alors que le bout de code que je lui est donné marche tres bien.

voici ou tu en etait :

Private Sub CommandButton1_Click()

'reférences articles
Dim Stock_Articles(200) As String 'tu dimension ton tabeleau ici une premiere fois dans le sub donc ton tableau n'existera qu'ici
Stock_Articles(0) = "pain"
Stock_Articles(1) = "chocolat"
Stock_Articles(2) = "eau"

Dim i As Integer
i = CInt(TextBox1.Text)

TextBox2 = (Stock_Articles(i))

End Sub

Private Sub CommandButton2_Click()

Dim Stock_Articles() As String 'a partir d'ici ton precedent tableau n'existe plus mais si il avait existé il serait ecraser par cette nouvelle decalaration
Dim TableSize As Long
TableSize = UBound(Stock_Articles)
For r = 0 To TableSize
      If Stock_Articles(r) = "" Then
         Stock_Articles(r) = TextBox3.Text
         Exit For    Else: If r TableSize Then TableSize TableSize + 1
        ReDim Preserve Stock_Articles(TableSize)
        Stock_Articles(TableSize) = TextBox3.Text
    End If

comme ceci cela ne peu pas marcher

maintenant essayes ce qui suit:

Option explicit
Dim Stock_Articles() As String

Private Sub CommandButton1_Click()
    Dim i As Integer
    'reférences articles
    Redim Stock_Articles(2)
    Stock_Articles(0) = "pain"
    Stock_Articles(1) = "chocolat"
    Stock_Articles(2) = "eau"

    i = CInt(TextBox1.Text)
    TextBox2 = (Stock_Articles(i))
End Sub

Private Sub CommandButton2_Click()

    Dim TableSize As Long
    TableSize = UBound(Stock_Articles)
    if TableSize = 0 then Redim Stock_Articles(0) 'ici on regarde si le bouton2 a ete utilisé avant le bouton1 si c'est le cas le tableau
    'n'aura jamais ete redimensionné donc on le redimension a une ligne pour pouvoir commencé
    For r = 0 To TableSize 'cette boucle sert a verifier si une ligne du tableau est vide
        If Stock_Articles(r) = "" Then 'si une ligne est vide on l'utilise
             Stock_Articles(r) = TextBox3.Text
             Exit For
        Else If r = TableSize Then 'si pas de ligne vide on redimension le tableau pour ajouter une ligne
            TableSize = TableSize + 1
            ReDim Preserve Stock_Articles(TableSize) 'le preserve est absolument obligatoire pour conserver les valeur deja dedans
            Stock_Articles(TableSize) = TextBox3.Text
        End If
   Next r
End Sub

essayes sans rien toucher et dit moi ce qui ce passe (precisement c'est a dire le message d'erreur et la ligne ou ce trouve l'erreur)

A+
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
28 févr. 2008 à 17:06
... desolé pour les fautes ... oublier de relire

Version corrigée de la plus mauvaise partie :

permetetez moi de repartir du code que Fabian123 a posté
apres ma reponse, car il y beaucoup d'erreures generées par ses
modifs alors que le bout de code que je lui ai donné marche tres bien.

voici ou tu en etais :

A+
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 févr. 2008 à 17:50
Re,
>[auteur/BIGFISHLEVRAI/510670.aspx bigfish_le vrai] : Si tu appuies sur le bouton 2 avant le 1 tu auras une erreur car c'est ce qu'on disait UBound sur un tableau NON dimensionne donne une erreur.

@+: Ju£i?n
Pensez: Réponse acceptée
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
28 févr. 2008 à 19:40
...
 Salut jrivet ! regarde bien !

d'ou cette ligne :
    if TableSize = 0 then Redim Stock_Articles(0) 'ici on regarde si le bouton2 a ete utilisé avant le bouton1 si c'est le cas le tableau
    'n'aura jamais ete redimensionné donc on le redimension a une ligne pour pouvoir commencé

 

A+
0
Rejoignez-nous