| Bonsoir Masterseb,
Voici ma saisie :
if textbox11 = "" then
msgbox "pas de n° d'article..."
textbox11.SetFocus
else
TextBox15.Value = TextBox14.Value * TextBox13.Value
end if
Le problème : lorsque je valide même en ayant saisi une valeur dans textbox11, j'ai la msgbox qui apparaît.
Comme je n'ai pas réussi à mettre la dernière conditon
Else: TextBox15.Value = "" j'ai un beug plus loin dans le programme.
Si j'explique mon problème "en français" :
si la textbox13 est différente de vide alors ma textbox11 doit être différente de vide, sinon j'affiche la msgbox et je peux reprendre ma saisie.
Si la textbox 13 et la 11 sont différentes de vide alors ma textbox15 correspond à la textbox13.value*textbox14.value. (textbox14 alimenté auto par la textbox11)
Si la texbox13 est vide, alors textbox15 reste vide. Cette commande est importante, sinon un beug apparaît plus loin dans le programme.
Lorsque j'ai saisi la valeur de la textbox11 et la textbox13, j'utilise un bouton qui copie les valeurs dans les lignes du tableau de mon userform et remet la ligne à 0.
Il s'agit d'une sorte de bon de commande.
A+ linette 44 Répondre à linette44 | 3 masterseb, le 17 avr 2007 à 01:27:23Bonsoir Linette, voici la transcription exacte de ce que tu m'a écris en français. J'espère que c'est ce dont tu as besoin.
If TextBox13.Value <> "" Then
If TextBox11.Value <> "" Then
TextBox15.Value = TextBox13.Value * TextBox14.Value
Else
MsgBox "pas de n° d'article"
End If
else
textbox15.Value = ""
Textbox11.SetFocus
End If
je n'ai bien entendu pas tenu compte de la copie des valeurs dans ton tableau et de la remise à zéro.
a+ seb Répondre à masterseb | Bonsoir Masterseb,
J'ai donc inséré les nouvelles instructions :
quand je ne saisis pas de valeur dans textbox11, j'ai le message, c'est donc OK.
par contre, quand je reviens dans ma textbox11, que je fais ma saisie et que je clique sur le bouton OK qui vide la ligne et copie les valeurs dans mon tableau, j'ai un beug et la textbox15 n'est pas alimentée
Voici les instructions appliquées au bouton OK
Private Sub CommandButton3_Click()
Application.ScreenUpdating = False
Dim var1 As Currency
Dim var2 As Currency
' Recherche la ligne vide et recopie les valeurs de la ligne de saisie
For i = 16 To 241
If Commande("textbox" & i).Value = "" Then
Controls("TextBox" & i).Text = TextBox11.Text
Controls("TextBox" & i + 1).Text = TextBox12.Text
Controls("TextBox" & i + 2).Text = TextBox13.Text
Controls("TextBox" & i + 3).Text = TextBox14.Text
Controls("TextBox" & i + 4).Text = TextBox15.Text
' Calcule le total de la commande
var1 = TextBox15.Value>>>>>> LE BEUG EST REPERE ICI
var2 = TextBox246.Value
TextBox246.Value = var1 + var2
J'essaie d'améliorer ce programme qui a été réalisée par une autre personne mais n'ayant que quelle notion de VBA, c'est pas facile...
Merci de ton aide.
A+
Linette 44 Répondre à linette44 | 5 masterseb, le 18 avr 2007 à 01:30:49Bonsoir Linette, le bug qui se passe à la ligne var1 est tout à fait logique si textbox15 n'a pas été alimenté. Ce qui est beaucoup plus bizarre, c'est que la double condition fonctionne chez moi et alimente le textbox15 sans problème et dans tous les cas de figure. Donc je vais te poser la question suivante : cette double condition est-elle dans ton événement commandbutton3_click ou plutot dans l'événement textbox13_exit. J'ai besoin de savoir l'événement dns lequel il se trouve.
Cordialement. Seb Répondre à masterseb | Bonsoir Seb,
Cette double condition n'existait pas et c'est ce que j'essaie de mettre en place.
Je l'ai placée dans l'évènement textbox13
Cordialement
Linette44 Répondre à linette44 | 7 masterseb, le 18 avr 2007 à 12:31:28C'est bien ce qu'il me semblait. la double condition se trouve dans un événement du textbox13 et c'est bien pour ça que textbox15 ne s'alimente pas automatiquement. En fait, il s'agit d'une incohérence dans ta programmation.
Preuve : fait les opérations suivantes et tu verras :
1) oublie de mettre qque chose dans le textbox11
2) tu reçois le message en sortant du textbox13
3) tu ajoute une référence dans le textbox11
4) tu retourne dans le textbox13 et tu remet la même valeur qu'il y avait
5) tu quitte la textbox13 et tu verras que la textbox15 s'alimentera.
c'est du au fait que la double condition ne fonctionne qu'à la mise à jour ou à la sortie de ta textbox13.
lorsque tu remet à jour textbox11, tu dois, selon ta programmation, recommencer l'événement textbox13 pour vérifier si toutes les conditions sont remplies et alimenter textbox15.
Je cherche et je te recontacte pour savoir la meilleure solution à cette incohérence.
a+ Répondre à masterseb |
| 8 masterseb, le 18 avr 2007 à 14:45:32Salut Linette, voilà ce que je te propose :
conserve ta double condition telle quelle et rajoute ceci...
On Error Resume Next
TextBox15.Value = TextBox13.Value * TextBox14.Value
>>> dans l'événement change de textbox11
ET
On Error Resume Next
If TextBox11 = "" Then
TextBox15.Value = ""
Else
TextBox15.Value = TextBox13.Value * TextBox14.Value
End If
>>> dans l'événement change de textbox13
ENSUITE
assure toi que ta double condition se trouve bien dans l'événement Exit de Textbox13
Tu auras l'effet escompté selon ton raisonnement.
Je dois quand même te prévenir que si par exemple tu oublie de mettre un quantité (dans ce cas tu voulais que textbox15 soit = ""), tu auras quand même un bug lors de ton transfert de données dans le tableau.
Enfin, essaie ce que je t'ai envoyé et recontacte moi pour me dire quoi.
aa+ Répondre à masterseb | 9 linette44, le 22 avr 2007 à 22:23:11Bonsoir Seb,
Ce week end, j'ai bossé pour essayer d'avancer le programme. Mais je rencontre pas mal de problème car je n'ai pas assez des connaissances. J'essaie de ruser en utilisant des macros.... j'espère que je vais y arriver.
J'ai fait les modifications que tu m'as indiquées et cela fonctionne. Par contre, comme tu le fais remarquer j'ai un bug si on oublie de renseigner les quantités. Ce qui me pose problème car ce n'est pas moi qui utiliserai ce programme. Mon raisonnement n'est peut être pas bon. Penses-tu qu'il y aurait un moyen de mettre un message si les quantités (tetbox13) ou le n° (textbox11) ne sont pas renseignés et d'éviter le bug ?
Merci beaucoup pour toutes les infos que tu m'as déjà données
A+
Linette44 Répondre à linette44 | 10 masterseb, le 22 avr 2007 à 23:13:13Salut Linette, normalement, le gros du problème est résolu. Il faut savoir que ton bug survient lors de l'export des données vers ton tableau par le clic d'un bouton je présume. Dès lors, on peut empêcher cet export si les 2 conditions ne sont pas respectées (On sait que quand les deux conditions ne sont pas respectées, textbox15 reste vide. En code, voila ce que ca fera (attention je rajoute du commentaire à coté, ne le recopie pas dans ton code).
Tu mets le code suivant dans l'événement clic bouton qui exporte dans le tableau :
On Error Resume Next >>>> Empêche les bugs
If TextBox15.value = "" Then
msgbox "Vérifiez que le n° d'article et la quantité aient bien été introduits..."
else
RESTE DE TON CODE >>> Insère bien tout le code
End If >>> à ne pas oublier
En résumé, cette condition t'empêche d'exporter si Textbox15 est vide.
Seule chose à bien vérifier, le code de la remise à zéro de tes textbox11 à 15 doit se trouver dans l'événement bouton clic d'export dans le tableau pour ne pas que l'utilisateur doivent réinsérer toutes les données en cas dde mesbox ci-dessus.
insère ceci et tu n'auras plus de problème. Tu peux me poser toutes les questions que tu désire pour la suite si tu as encore le moindre problème, même pour un autre sujet.
Bien à toi
Seb Répondre à masterseb | 11 linette44, le 23 avr 2007 à 23:48:55Bonsoir Seb,
Impeccable pour le code que tu m'as transmis. J'avance petit à petit.
Comme tu me proposes de continuer à m'aider, voici la question du soir :
j'ai essayé de mettre une barre de défilement verticale dans un Userform "Commande". J'ai sélectionné dans propriété scrollbars mais cela ne suffit pas d'après mes recherches.
J'ai trouvé ce code sous Internet
Private Sub UserForm_Initialize()
With ScrollBar1
.Min = 0 'Valeur mini
.Max = 100 'Valeur maxi
'Spécifie la distance de déplacement intervenant lorsque l'utilisateur
'clique entre le curseur de défilement et la flèche de défilement.
.LargeChange = 10
'Spécifie le déplacement se produisant lorsque l'utilisateur clique sur
'les flèches de défilement dans le contrôle ScrollBar
'(La valeur par défaut = 1)
.SmallChange = 5
End With
End Sub
Private Sub ScrollBar1_Change()
Label1 = ScrollBar1.Value
End Sub
En saisissant ce code, j'ai un bug sur la ligne Commande.Show
Peux-tu m'aider ?
Merci à toi
A+
Linette 44 Répondre à linette44 | 12 masterseb, le 24 avr 2007 à 00:59:06Salut Linette, là il y a un problème car chez moi, avec ce code, tout fonctionne parfaitement. Je n'ai même pas besoin du code que tu as trouvé sur Internet car les propriétés du scrollbar fonctionnent. Afin de vérifier si c'est bien la source de ton problème, va dans le code et met des ' devant les lignes pour les réduire à commentaire. exécute le show de ton form Commande. Si tu as encore le bug, c'est que ce n'est pas du au scrollbar.
A+
Seb Répondre à masterseb | Bonsoir,
Le scrollbar fonctionne, comme c'était la première fois que je l'utilisais je n'avais pas tout compris...
Je continue d'avancer doucement dans mon programme.
Un bouton est créé pour modifier une ligne de commande en cas d' erreur de saisie sur N°article (textbox11) ou quantité (textbox13). Si l'erreur est sur la dernière ligne, pas de problème. Par contre, si je dois remonter sur la 3ème ligne par exemple, toutes les lignes saisies après la 3ème sont effacées.
Penses-tu que l'on peut créer un bouton qui permettrait de remonter sans effacer les saisies réalisées et après la modification de se repositionner sur la dernière ligne vierge pour continuer la saisie ?
Voici le code qui est saisi :
Private Sub CommandButton16_Click()
' Correction de la ligne
Dim var1 As Currency
Dim var2 As Currency
For i = 16 To 436
If Commande("textbox" & i).Value = "" Then
If Controls("TextBox" & i - 5).Text = "" Then GoTo 10
TextBox11.Text = Controls("TextBox" & i - 5).Text
TextBox12.Text = Controls("TextBox" & i - 4).Text
TextBox14.Text = Controls("TextBox" & i - 2).Text
TextBox13.Text = Controls("TextBox" & i - 3).Text
TextBox15.Text = Controls("TextBox" & i - 1).Text
Controls("TextBox" & i - 5).Text = ""
Controls("TextBox" & i - 4).Text = ""
Controls("TextBox" & i - 3).Text = ""
Controls("TextBox" & i - 2).Text = ""
Controls("TextBox" & i - 1).Text = ""
var1 = TextBox15.Value
var2 = TextBox246.Value
TextBox246.Value = var2 - var1
End If
Next i
10
Y = CommandButton16.Top
CommandButton16.Move 396, Y - 12
End Sub
cordialement
Linette 44 Répondre à linette44 |
| Bonjour Seb,
Je rencontre un nouveau problème :
Dans une combobox2, je sélectionne un N° de commande (j'ai renseigné l'info Rowsource pour trouver la source de données).
Une fois la selection faite, je voudrais alimenter différentes textbox correspondant à cette commande (nom, total commande...).
Par exemple la textbox15 = nom
Voici le code saisi, mais il bug sur la ligne Set c=.Find
Private Sub ComboBox2_Change()
If ComboBox2.Value <> 0 Then
Sheets("liste").Range ("b2:b399")
Set c = .Find(ComboBox2.Text, LookIn:=xlValues)
If Not c Is Nothing Then
firstAdress = c.Address
c.Select
End If
ActiveCell.EntireRow.Select
TextBox15.Value = ActiveCell.EntireRow.Cells(1, 2)
End Sub
As-tu une idée du problème ?
Merci
A+
Linette44 Répondre à linette44 |
| 15 masterseb, le 2 mai 2007 à 01:24:27Salut Linette,
je vois que tu as urilisé la méthode Find en reprenant l'exemple donné par l'aide microsoft vba. Je doit cependant te signaler que même leur exemple bug.
Enfin, voyons ton problème. J'avoue ne pas avoir bien compris ton code, probablement parce que je n'ai pas une vue d'ensemble.
En résumant, voilà ce que j'ai compris :
- tu charges ton combobox2 des données reprises dans les cellules b2:b399.
-Ensuite, tu cherche à alimenter en fonction de ta sélection combobox2 le textbox15, du nom qui correspond à ton numéro de commande, un peu à la façon de la fonction recherche verticale dans excel.
Ai je bien compris ?
en ce qui me concerne, je créerais des combobox pour tout. Lors de l'initialize de ton userform, tu charges tes combobox : pour le 2, les cellules b2:b399, pour le combobox3, c2:c399 (si les nom se trouvent dans cette colonne et ainsi de suite.
Enfin, lors de l'événement change du combobox2, tu change les index des autres combobox de cette manière :
Private Sub ComboBox2_Change()
ComboBox3.ListIndex = ComboBox2.ListIndex
End Sub
enfin, tu donne l'apparence textbox en changeant les propriétés de tes combobox : à showdropbuttonwhen tu met never pour enlever la flèche. Ensuite, tu empêches la saisie en mettant false à la propriété enable.
les avantages :
- c'est facile à programmer
- tu auras toujours, en sélectionnant un n° de commande, le nom prénom adresse... correspondant
J'espère t'avoir aidé
a+
seb Répondre à masterseb |
| Bonsoir Seb,
J'ai continué à chercher et voici le code qui fonctionne, j'ai ajouté la ligne avec with
Private Sub ComboBox2_Change()
If ComboBox2.Value <> 0 Then
Sheets("liste").Select
With Worksheets("liste").Range("b2:b399")
Set c = .Find(ComboBox2.Value, LookIn:=xlValues)
If Not c Is Nothing Then
firstaddress = c.Address
c.Select
End If
End With
End If
ActiveCell.EntireRow.Select
TextBox15.Value = ActiveCell.EntireRow.Cells(1, 3)
TextBox11.Value = .....End Sub
Mais je pense que je vais tester ce que tu m'as donné car cela paraît plus simple
Merci
Linette44 Répondre à linette44 |
| 17 masterseb, le 2 mai 2007 à 12:59:24> Salut Linette,
>
> content que tu aies trouvé la résolution de ton
> problème. Je te conseille cependant mon exercice.
> Fait le à part pour le tester et tu verras que c'est
> vraiment pas mal du tout.
> A ta disposition pour d'autres renseignements.
> Bien à toi
> Seb Répondre à masterseb |
|
|
|
|
|
|
|
|
|
|