Besoin d'une aide pour programmation VBA (Excel) [Résolu]

Signaler
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008
-
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008
-
Bonsoir je viens à vous car j'ai un problème dans mon projet informatique que je dois rendre d'ici trois semaines. Je suis en DUT GLT (gestion logistique et transport).
C'est un tout petit programme en VBA (excel) mais je rencontre des problèmes sur la programmation que je n'arrive pas à regler.
Serait-il possible d'avoir votre aide en me disant se qu'il ne va pas dans mes divers petits algorithmes ?
Pour que cela soit plus facile peut-on echanger nos adresses e-mails.
Je vous remercie d'avance pour vos réponses.

14 réponses

Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
pour ton premier probleme il suffit de mettre
prix1.Enabled = False
dans l'évenement "Activate" de ton userform
ou encore dans les propriétés du textbox prix1 mettre enabled à false lors de la création
pour la deuxieme comme tu n'as que cinq cases autant réécrire le code cinq fois
l'autre solution consistant à passer par les collections  mais c'est nettement plus compliqué mais si cette solution te tente il y a déja eu sur ce site des tas d'exemples pour le faire

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
Private Sub prix1_Change()
  If Not IsNumeric(prix1) Then
    erreur = MsgBox("Un prix est obligatoirement numérique!", vbOKOnly + vbCritical, "ERREUR")
    prix1 = ""
  Else
    Range("abonnements!B2") = prix1
  End If
End Sub
tu modifies le contenu de prix1 donc tu redéclanche un évenement change lors de ce deuxieme évenement tu lui dit de prendre la valeur "" qu'il a déja donc il ne le redéclanche pas une troisieme fois
tu pourrais modifier de la façon suivante
if prix1.text = "" then
    exit sub
ElseIf Not IsNumeric(prix1) Then

    erreur = MsgBox("Un prix est obligatoirement numérique!", vbOKOnly + vbCritical, "ERREUR")

    prix1 = ""

  Else

    Range("abonnements!B2") = prix1

  End If
    comme ça la deuxieme fois il ressort de la sub imédiatement sans faire le test isnumeric
[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
l'évennement change a lieu à chaque fois que la textbox est modifiée
donc quand tu tapes mmm4
il a lieu quatre fois
la premiere fois ,telle que ta boucle est construite elle va tester "m"
la deuxiemme  elle va tester "mm"
la troisieme elle va tester "mmm"
et la quatriemme elle va testet "mmm4"
hors "mmm4" n'est pas numérique  c'est une chaine de caractères
pour que ton test marche il faut que tu testes, non pas la chaine, mais le dernier caractère entré
don au lieu de
If IsNumeric(Act) Then
il faudrait faire
If IsNumeric(right(Act,1)) Then
comme ça le test ne porte que sur le carractère le plus à droite donc le dernier enté de la chaine
et du coup il faut modifier
Act = ""
pour qu'il ne supprime que le carractère défectueux en faisant
if len(Act)>1 then
    Act= left(Act,len(Act)-1)
else
     Act= ""
end if

pour la deuxieme question je pense que le test est à faire dans l'évenement click de la case à cocher
et plutot que de mettre un messagebox  je mettrais un inputbox comme ça la personne qui click sur le case à cocher voit apparaite une fenetre lui demandant d'entrer le prix 
du genre
TextBox.Text = InputBox("entrez le prix", "PRIX")
comme ça quand il a entré le prix (et il est obligé de le faire car le programme s'arrete tant qu'il ne l'a pas fait)
dans la Textbox il y a le prix de marqué

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
en fait j'ai sauté la premiere question lol
 la disposition dans la feuille excel n'est pas critique puisque c'est toi qui programme donc elle aura l'aspect que tu veux lui donner  par ton code

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
poses tes questions ici, sur VbFrance, avec du code et on t'aidera comme on peut
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

En fait j'aurais aimé envoyer mon projet aux personnes qui souhaitent m'aider pour qu'elles me disent ce qu'il ne va pas! Car tout mes algorithme sont liés et je ne trouve pas mes erreurs. svp aidez-moi
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
9
Salut,

si tu as des erreurs le VBE doit te les montrer et te les code erreurs correspondants. Donc la partie du code qui pose pb plus le message d'erreur serait un bon debut pour que l'on puisse t'aider.

A+
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Bonjour, alors je vais tenter de vous expliquer lol.
Mon petit programme consiste à aider un client d'un complexe sportif pour choisir le forfait qui lui correspondrai le mieux.
J'ai donc un userform pour l'administrateur qui va rentrer les activités de son complexe sportif et ses prix et un userform pour l'utilisateur qui va choisir l'activité qu'il veut parmis celle qu'aura rentré l'administrateur et renseigner sa futur fréquence/mois. Excel derrière fait des calculs pour determiner le meilleur forfait.
Je vais tout d'abord vous expliquer mes problèmes sur le userform de l'administrateur.
J'ai un userform avec une case textbox pour l'activité et je voudrais que quand il rentre une activité et qu'il valide, l'activité se mette dans la case A2 jusqu'a la
sub ok_click
range("A2")=act  ' act= case renseigné par l'administrateur.
End sub
Mais mon problème, c'est que sur ce userform j'ai 5cases à cocher CheckBox qui sont face à 5cases textbox pour renseigner les prix, donc je voudrais que quand l'administrateur rentre sur le userform, les cases prix soient grisées si les cases correspondantes ne sont pas cochées.
Ma programmation est celle-ci :

Private Sub case1_Click()
  If case1 = False Then
prix1.Enabled = False
  Else
prix1.Enabled = True
  End If
End Sub

Sur cette programmation, j'ai 2problèmes:
Quand je rentre sur le userform les cases ne se grisent pas, elles se grisent seulement quand je coche puis décoche la case à cocher.
Le 2eme problème, c'est que je voudrais que la procédure se rèpete pour la case2,3,4 et 5 sans que se soit rédondant.

Voila mon premier soucis parmis tant d'autre
Merci de votre aide.
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Donc si, j'ai bien compri, je réecri ma procédure pour les 5cases et je change juste dans les propriétés de celle-ci à enable je met false à la place de True. Ok ca marche merci beaucoup, si j'ai le temps j'essaierai de trouver ce qu'il faut faire pour éviter de répéter à chaque fois.
Je te remerci encore pile_poil.
J'ai un autre probleme sur ce userform.
Pour les cases prix, je ne veux pas accepter de texte, j'ai donc fais cette procédure:
 
Private Sub prix1_Change()
  If Not IsNumeric(prix1) Then
    erreur = MsgBox("Un prix est obligatoirement numérique!", vbOKOnly + vbCritical, "ERREUR")
    prix1 = ""
  Else
    Range("abonnements!B2") = prix1
  End If
End Sub

Donc après pour vérifier que cela marche je mets du texte dans ma case, il m'apparait bien l'msgbox avec le bon message mais quand je click sur OK, il me le remet une deuxième fois.Je ne comprends pas pourquoi???
Merci encore de votre aide.
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Ok merci énormement cela marche, j'aurai pu y penser c'était pas très compliqué.
Alors je passe à plus compliqué.(enfin pour moi)
J'aimerai quand on click sur Ok qu'il nous demande si on veut bien valider, si oui, on redemande si on ve rentrer une autre activité,si non on retourne sur même userform avec toujours les mêmes valeurs.
Ensuite si on ve rentrer une nouvelle activité, on réouvre le même userform mais cette fois-ci vide et les valeurs qui vont être saisie doivent se mettre dans la ligne en dessous de la premiere et ainsi de suite dans excel!
Si on veut plus rien rentrer, on sort de tout.
Alors voila, j'ai farfouillé sur le forum, et j'ai trouvé quelque chose que j'ai remis à ma sauce, cela donne:

Private Sub ok_click()
Dim Ws As Worksheet
Dim Ligne As Integer


Set Ws = Sheets("abonnements")
Ligne = Ws.Range("A1").End(xlDown).Row + 1


Ws.Cells(Ligne, 1) = Act
Ws.Cells(Ligne, 2) = prix1
Ws.Cells(Ligne, 3) = prix2
Ws.Cells(Ligne, 4) = prix3
Ws.Cells(Ligne, 5) = prix4
Ws.Cells(Ligne, 6) = prix5


Unload ADM1


rep = MsgBox("Voulez-vous rentrer une autre activité ?", _
vbYesNo + vbQuestion, "Programmer une autre activité ?")


If rep = vbYes Then
ADM1.Show
End If
End Sub
Dans ceci n'est pas compris les 2 msg box qui demande la validation puis celle qui demande si on veut une nouvelle activité. Mais je ne sais pas dans quel ordre les mettre.Moi je dirais:
Private Sub ok_click()
 rep=vbyes
message=vbyes
do
message= msgbox("voulez-vous vraiment valider?",vbyesno+vbquestion, "VALIDATION?")
et après je sais pas.
Merci pour tous pil_poil
Messages postés
682
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 août 2012
6
personnellement les messagebox à répétition ça me saoule grave dans un programme donc je verrais plutot plusieurs boutons
mais si tu tiens aux messagebox je pense que en tout début de sub il faut mettre celle demandant si on veut valider puis celle de la nouvelle activité
mais ça c'est plus une question d'ergonomie d'utilisation que réellement de code !
et attention
Unload ADM1
te fera perdre toutes les données entrées donc bien positionner tes messages box avant ou alors mettre toutes tes données dans des variables publiques pour le retrouver si nécessaire

[reglement.aspx ]si c'est la solution, penser : REPONSE ACCEPTEE
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

OK je pense que tu as raison, je vais laissé avec un seul de mes msgbox.


Alors chui desolée mais 2 autres questions sur mon userform ADM1


avec cette programmation:

Private Sub ok_click()
Dim Ws As Worksheet
Dim Ligne As Integer


Set Ws = Sheets("abonnements")
Ligne = Ws.Range("A1").End(xlDown).Row + 1


Ws.Cells(Ligne, 1) = Act
Ws.Cells(Ligne, 2) = prix1
Ws.Cells(Ligne, 3) = prix2
Ws.Cells(Ligne, 4) = prix3
Ws.Cells(Ligne, 5) = prix4
Ws.Cells(Ligne, 6) = prix5


Unload ADM1


rep = MsgBox("Voulez-vous rentrer une autre activité ?", _
vbYesNo + vbQuestion, "Programmer une autre activité ?")


If rep = vbYes Then
ADM1.Show
End If
End Sub

Quand je rentre une activité elle se mets d'abord dans la ligne 1 puis quand je click sur ok elle se mets dans la premiere ligne vide, en gros la premiere ligne est la pour écrire et les autres pour stocker??est ce que cela peut poser problème??

2eme question
Sur cette programmation:

Private Sub Act_Change()
    If IsNumeric(Act) Then
        erreur = MsgBox("Pas de numérique!", vbOKOnly + vbCritical, "ERREUR")
        Act = ""
    Else
        Range("abonnements!A2") = Act
    End If
End Sub

Je ne peux donc pas écrire de numérique tout court, si je met par exemple 4, l'msgbox va apparaite qu'une fois je click sur ok tout va bien ça enlève la valeur, mais aprés si je rentre mmm4 par exemple il ne m'apparait rein!
Et bien sur je ne comprends pas pourquoi.

Et pour finir si je veux faire des vérifs par rapport aux prix style si click sur ok mes case à cocher sont cochées mais le prix vide alor msgbox "si case coché alor obligatoire prix", je fais ces vérifs au tous début du code?
Vraiment merci, je dois etre lourde mais je suis un peu en galère. 
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Oui et en plus j'ai trouvé l'erreur qui faisait cela et j'ai rectifié le tir. Merci beaucoup pour toutes tes réponses, j'aurais sans doute beaucoup d'autres questions. Je te remercie vraiment. on dirai que j'ai finis comme ça de poser des questions mais en fait pas du tout, je vais revenir trés vite d'ici 2h lol, le temps que j'essai de me dépatouiller seule. Alors à toute a l'heure peut-être pil_poil. Merci encore.
Messages postés
105
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 novembre 2008

Re bonjour tout le monde, alors j'ai un petit problème sur mon userform UTIL, j'ai une liste déroulante et en faite elle récupère les données dans une zone d'excel nommé activité, mais en fait, comme il n'y a pas forcément des valeurs dans toutes les lignes de cette zone, dans la liste déroulante, il y a les activités de la zone + du vide car la zone n'est pas entièrement rempli.
J'ai cet code, je sais pas trop comment faire pour ne pas faire apparaître ce blanc.

Private Sub type_dact_Initialize()
    ListBox1.ColumnHeads = True
    ListBox1.RowSource = "Feuil1!A2:A16"
    With ListBox1
        Sheets("calculs").Activate
        Range("B2").Select = type_dact.Name
    End With
End Sub

Merci beaucoup de votre aide.