Verrouillage d'un bouton avec multiple conditions
Bonjour,
Pour mon travail et pour gagner du temps j'ai décider de créer un formulaire qui en plus de faire les calculs pour moi, m'éviteras de tout recopier à la main vu qu'il réinsère tout dans un tableau. Cependant, j'ai envie de mettre une sécurité sur mon bouton pour sauvegarder le tout dans mon tableau. Ainsi, j'aimerais avoir un message en fonction des champs qui ne sont pas remplis et le bouton save qui se déverouille qu'une fois toutes les conditions réunis.
Dans le code du bouton, j'ai mis mes vérification et le fait qu'il me faut toute cette vérification sinon on ne peut pas sauvegarder mais le programme me le fait quand même. Du coup pourriez vous m'aidez ?
Voici le code que j'ai utilisé avec des annotations :
Les codes sont dans l'userform Calculconso
Bonjour
Merci d'utiliser les balises de code ( </>) disponible dans le menu quand vous postez un code.
Le code est tellement long que vous auriez aussi pu renseigner qu'il était dans l'userform Calculconso
Sinon fichier toujours aussi joli
Cordialement
Edit :
Ainsi, j'aimerais avoir un message en fonction des champs qui ne sont pas remplis et le bouton save qui se déverouille qu'une fois toutes les conditions réunis.
Quels sont les champs qui doivent être obligatoirement remplis ?
Bonjour,
Autant pour moi, je regarderais tout cela à l'avenir, mais je ne peut pas modifier mon premier message.
Les champs obligatoire sont :
- code AR
- N°OF
- Mois
- Année
- le nbr de feuille
- le taux de recouvrement
Autant pour moi, je regarderais tout cela à l'avenir, mais je ne peut pas modifier mon premier message.
1. Je peux le faire si vous êtes d'accord
2. Je vais regarder suite à votre info au sujet des champs obligatoires
3. Dans un premier temps votre macro Initialize peut être rendue plus courte comme ceci
Private Sub UserForm_Initialize()
Dim Mois()
Dim Ctrl As Control
'Initialisez les mois
Mois = Array("janv", "fev", "mars", "avril", "mai", "juin", "juil", "aout", "sept", "oct", "nov", "dec")
ListeMois.List = Mois
For Each Ctrl In Me.Controls
With Ctrl
If .Name Like "*TextBoxS*" Or .Name Like "*TextBoxL*" Then 'Valeur de surface et 'Valeur de longueur et largeur
.Value = 0
ElseIf .Name Like "*TextBoxCT*" Then 'Valeur de Consomation en g/m²
.Value = 1
End If
End With
Next Ctrl
TextBoxFeuille = 0
TextBoxRecouvr = 0
btnSave.Enabled = False 'desactive le bouton sauvegarde
End Sub4. Au lieu de mettre votre message dans une textbox pour le cas où tout n'est pas rempli, vous auriez pu utiliser une MSGBOX. Du coup la textbox "messalert" ne servira plus. Votre avis ?
1. Je peux le faire si vous êtes d'accord
Je n'y voit pas d'inconvénient
Pour l'initialize merci, c'est vrai que c'était un peu long
Autrement, que ce soit par un textbox ou une msgbox pour moi, il est juste important que ce soit notifier, et comme je l'ai mis, j'imaginais un texte évolutif qui si on note le code AR mais pas le n°OF, qu'il l'indiquerait et ainsi de suite.
Donc tant que je peu avoir le message on peu supprimer MessAlerte
Je n'y voit pas d'inconvénient
C'est fait
Pour votre message, il faudrait que je comprenne comment vous fonctionnez au niveau des boutons dans l'userform avant de sauvegarder.
Est-ce que vous devez d'abord cliquer sur le bouton Calculer avant de pourvoir cliquer sur le bouton Sauvegarder ?
Cette question parce que l'on pourrait activer uniquement le bouton sauvegarde si calcul effectué
Merci,
Effectivement, comme je l'ai mis dans les explications sur le userform, il faut appuyer sur le bouton calcul afin que les valeur des encres se mette et que l'on appuie ensuite sur sauvegarder pour remplir le tableau.
Je n'y avais pas penser mais mon idée de base n'incluait pas l'idée que l'on remplisse les champs et sauvegarde sans avoir fait les calculs
Bonjour, je constate que votre macro continue même quand une condition n'est pas remplie !
Vous devrez sortir de la macro à chaque fois qu'une textbox n'est pas renseignée :
'vérification que les champs sont remplis
If Len(TextBoxAR) = Empty Then
Me.MessAlerte = "Veuillez mettre le code AR !! "
Me.TextBoxAR.SetFocus
btnSave.Enabled = False
Exit sub
ElseIf Len(TextBoxOF) = Empty Then
Me.MessAlerte = "Veuillez mettre le numéro d'OF !! "
Me.TextBoxOF.SetFocus
btnSave.Enabled = False
Exit sub
......Nota les vérifications pourraient trés bien être intégrées au bouton SAVE puisque si une condition n'est pas rempli on sort de la macro.
1. il faut appuyer sur le bouton calcul afin que les valeur des encres se mette et que l'on appuie ensuite sur sauvegarder pour remplir le tableau.
Donc on peut imaginer que l'on ne puisse faire le calcul que si les textbox sur fond vert sont complétées et permet d'activer le bouton Sauvegarde. Juste ?
2. Sinon j'ai un peu changé le code INITIALIZE que j'ai posté précédemment. Vous pouvez modifier comme ceci
2.1. remplacer le code Initialize par celui ci-après
Private Sub UserForm_Initialize()
Dim Mois()
'Initialisez les mois
Mois = Array("janv", "fev", "mars", "avril", "mai", "juin", "juil", "aout", "sept", "oct", "nov", "dec")
ListeMois.List = Mois
Call Init
btnSave.Enabled = False
End Sub2.2. Ajoutez le code ci-dessous
Private Sub Init()
Dim Ctrl As Control
For Each Ctrl In Me.Controls
With Ctrl
If .Name Like "*TextBoxS*" Or .Name Like "*TextBoxL*" Then
.Value = 0 'Valeur de surface et 'Valeur de longueur et largeur
ElseIf .Name Like "*TextBoxCT*" Then .Value = 1 'Valeur de Consomation en g/m²
ElseIf .Name Like "*TextBoxT*" Then .Value = ""
End If
End With
Next Ctrl
TextBoxFeuille = 0
TextBoxRecouvr = 0
End SubDonc on peut imaginer que l'on ne puisse faire le calcul que si les textbox sur fond vert sont complétées. Juste ?
Dan, c'est cela, les seul qui ne sont pas obligatoire ce sont les jaunes, car elle ne sont pas utilisé systématiquement
Xmenpl, à la base j'y avais pensé mais quand je l'ai fait avec le code de base de mon fichier, il écrivait quand même comme vous l'avez fait remarqué, je vais essayer avec votre version aussi pour voir
Dan, c'est cela, les seul qui ne sont pas obligatoire ce sont les jaunes, car elle ne sont pas utilisé systématiquement
Ok. Donc vous pouvez modifier les codes suivants
1. Pour le calcul
Private Sub btnCalcul_Click()
Dim i As Byte
With Me
'vérification que les champs sont remplis
If .TextBoxAR = "" Then
MsgBox "Veuillez mettre le code AR !! "
.TextBoxAR.SetFocus
Exit Sub
ElseIf .TextBoxOF = "" Then
MsgBox "Veuillez mettre le numéro d'OF !! "
.TextBoxOF.SetFocus
ElseIf .ListeMois = "" Then
MsgBox "Veuillez renseignez le mois !! "
Me.ListeMois.SetFocus
Exit Sub
ElseIf .TextBoxAnnée = "" Then
MsgBox "Veuillez renseignez l'année !! "
.TextBoxAnnée.SetFocus
ElseIf .TextBoxFeuille.Value = 0 Then
MsgBox "Veuillez mettre le nombre de feuille !! "
.TextBoxFeuille.SetFocus
Exit Sub
ElseIf .TextBoxRecouvr.Value = 0 Then
MsgBox "Veuillez mettre le taux de recouvrement !! "
.TextBoxRecouvr.SetFocus
Exit Sub
Else
'Calcul pour une quantité en g
.TextBoxEGQC = Format((((.TextBoxSQC / 100) / 10000) * .TextBoxCTQC * .TextBoxFeuille * (.TextBoxRecouvr / 100)), "0.0")
.TextBoxEGQM = Format((((.TextBoxSQM / 100) / 10000) * .TextBoxCTQM * .TextBoxFeuille * (.TextBoxRecouvr / 100)), "0.0")
.TextBoxEGQY = Format((((TextBoxSQY / 100) / 10000) * .TextBoxCTQY * .TextBoxFeuille * (.TextBoxRecouvr / 100)), "0.0")
.TextBoxEGQBk = Format((((TextBoxSQBk / 100) / 10000) * .TextBoxCTQBk * .TextBoxFeuille * (.TextBoxRecouvr / 100)), "0.0")
For i = 1 To 5
.Controls("TextboxEGT" & i) = Format((((.Controls("TextBoxST" & i) / 100) / 10000) * .Controls("TextBoxCTT" & i) * .TextBoxFeuille * (.TextBoxRecouvr / 100)), "0.0")
Next i
'Calcul pour une quantité en mg
.TextBoxEMQC = Format(.TextBoxEGQC * 1000, "0")
.TextBoxEMQM = Format(.TextBoxEGQM * 1000, "0")
.TextBoxEMQY = Format(.TextBoxEGQY * 1000, "0")
.TextBoxEMQBk = Format(.TextBoxEGQBk * 1000, "0")
For i = 1 To 5
.Controls("TextBoxEMT" & i) = Format(.Controls("TextBoxEGT" & i) * 1000, "0")
Next i
'Calcul pour une quantité en kg
.TextBoxEKQC = Format(.TextBoxEGQC / 1000, "0.000")
.TextBoxEKQM = Format(.TextBoxEGQM / 1000, "0.000")
.TextBoxEKQY = Format(.TextBoxEGQY / 1000, "0.000")
.TextBoxEKQBk = Format(.TextBoxEGQBk / 1000, "0.000")
For i = 1 To 5
.Controls("TextBoxEKT" & i) = Format(.Controls("TextBoxEGT" & i) * 1000, "0")
Next i
MsgBox "Calul fait !"
'Activer le bouton sauvegarder
btnSave.Enabled = True
End If
End With
End Sub2. Pour la sauvegarde
Private Sub btnSave_Click()
Dim Lig As Integer
'lit la feuille correspondante et se prépare à écrire dedans
With Sheets("Calculateur").ListObjects("Tab_Of")
If .ListRows.Count = 0 Then
.ListRows.Add: Lig = 1
Else: .ListRows.Add: Lig = .ListRows.Count 'pour insérer à la dernière ligne
End If
With .DataBodyRange
.Item(Lig, 1) = TextBoxAR.Value
.Item(Lig, 2) = TextBoxOF.Value
.Item(Lig, 3) = ListeMois & "-" & TextBoxAnnée.Value
.Item(Lig, 4) = (TextBoxFeuille - 1000) & "+" & "1000"
.Item(Lig, 5) = TextBoxEKQC.Value
.Item(Lig, 6) = TextBoxEKQM.Value
.Item(Lig, 7) = TextBoxEKQY.Value
.Item(Lig, 8) = TextBoxEKQBk.Value
End With
'comparaison pour éviter une erreur de calcul
Dim i As Byte
For i = 1 To 5
If Controls("TextboxT" & i) = "" Then
.Item(Lig, i + 8) = 0
Else: .Item(Lig, i + 8) = Controls("TextBoxT" & i).Value & " " & "=" & " " & Controls("TextBoxEKT" & i).Value
End If
Next i
End With
MsgBox "Sauvegarde effectuée"
'vide les champs après sauvegarde pour éviter le multi clic
Call Init
TextBoxAR = ""
TextBoxOF = ""
TextBoxAnnée = ""
ListeMois = ""
End SubDites moi si cela fonctionne
Sinon c'est toujours plaisir de voir avec quel soin vos fichiers sont réalisés !
Dan, cela fonctionne jusqu'au remplissage de la teinte 1, les 8 première colonnes se remplisse mais pas la dès que l'on rentre dans la partie teinte, j'ai une erreur 438
les 8 première colonnes se remplisse mais pas la dès que l'on rentre dans la partie teinte, j'ai une erreur 438
Si vous cliquez sur débogage, cela souligne quelle ligne dans le code ?
C'est dans la boucle i ?
Si oui vous mettez quoi comme valeur là ?
Edit : Ok je viens de voir. Je regarde
Re,
Désolé c'est moi qui avait adapté directement sur le site dans vérifier
Dans le code où vous avez l'erreur, vous devez supprimer le END WITH qui se trouve juste avant la déclaration de variable DIM i AS BYTE et le mettre plus bas juste en dessous de la ligne NEXT i
Donc au final vous aurez deux End with l'un en dessous de l'autre
Merci, bien tout fonctionne c'est nickel