Rechercher : dans
Par :

Macro VBA double condition

Dernière réponse le 7 déc 2007 à 22:21:11 linette44, le 15 avr 2007 à 23:23:00 
 Signaler ce message aux modérateurs

Bonjour,
Dans un userform, j'ai associé des commandes :

Voici la structure
Numéro = textbox11 (à saisir)
Désignation article = textbox12 (alimenté automatiquement par textbox11)
Nombre = textbox 13 (à saisir)
Prix = textbox14 (alimenté par textbox11)
Total = textbox 15 (calcul auto)

Total = textbox 14. Value * textbox 13.value

Je voudrais ajouter une condition : si text box 11 est égale à rien (oubli de saisie) afficher un message "pas de n° d'article" et me redonner la main pour saisir et que tout se passe bien une fois la saisie faite.

Je n'arrive pas à imbriquer les 2 contions... pas assez de connaissance. Voici mon résultat qui ne fonctionne pas.

If TextBox13.Value <> "" Then
If TextBox14.Value = "" Then
MsgBox "pas de n° d'article"

TextBox15.Value = TextBox14.Value * TextBox13.Value
Else: TextBox15.Value = ""
End if
End if
Merci à la personne qui voudra bien m'aider.

Configuration: Windows XP
Firefox 1.5.0.11

1

masterseb, le 16 avr 2007 à 01:10:06

Bonjour Linette,
comme je peux comprendre dans ton message, la condition concerne textbox11 (d'ailleurs je ne vois qu'une seule condition) donc ta condition doit tenir compte de sa valeur et pas de la valeur des autres textbox :

Voila ce que je propose dans un premier temps :

if textbox11 = "" then
msgbox "pas de n° d'article..."
textbox11.SetFocus >>> redonne la main
else
reste de ton code
end if

dis moi si j'ai bien compris ce que tu veux ?
A+ masterseb

Répondre à masterseb

2

linette44, le 16 avr 2007 à 21:31:45

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:23

Bonsoir 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

4

linette44, le 17 avr 2007 à 22:59:10

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:49

Bonsoir 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

6

linette44, le 18 avr 2007 à 02:06:26

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:28

C'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:32

Salut 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:11

Bonsoir 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:13

Salut 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:55

Bonsoir 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:06

Salut 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

13

linette44, le 27 avr 2007 à 22:56:05

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

14

linette44, le 1 mai 2007 à 18:14:03

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:27

Salut 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

16

linette44, le 2 mai 2007 à 01:40:48

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

18

 cocodix, le 7 déc 2007 à 22:21:11

Bonjour a tous,
Je n'arrive pas a avoir le code adequat pour mettre une barre de defilement verticale dans mon tableau, j'ai beau essaye depuis des jours, rien n'y fait et quand je mets un code ( trouve au hasard de mes recherches sur le net ), j'ai un fond blanc avec des ecritures dessus, et je ne peux meme pas y mettre mon texte, c'est si frustrant et je commence a en sortir avec des maux de tete serieux, j'ai essaye tant de fois sans succes, si l'un de vous peut m'aider et me donner le parfait code et aussi me dire ou il faudrait que je le fasse, j'en serai sincerement reconnaisssante .

Merci infiniment et a tres bientot j'espere.

Cocodix

Répondre à cocodix