cs_Fabian123
Messages postés180Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention22 novembre 2013
-
27 févr. 2008 à 14:05
cs_Fabian123
Messages postés180Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention22 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"
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 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
cs_Fabian123
Messages postés180Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention22 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
cs_Fabian123
Messages postés180Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention22 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
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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]
cs_Fabian123
Messages postés180Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention22 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)
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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
cs_Fabian123
Messages postés180Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention22 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!
cs_Fabian123
Messages postés180Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention22 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
cs_Fabian123
Messages postés180Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention22 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
cs_Fabian123
Messages postés180Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention22 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...
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 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)
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 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.
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 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.
bigfish_le vrai
Messages postés1835Date d'inscriptionvendredi 13 mai 2005StatutMembreDernière intervention20 novembre 201315 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é