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 :

16v2.xlsm (50.85 Ko)

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 Sub

4. 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 Sub

2.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 Sub

Donc 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 Sub

2. 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 Sub

Dites 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

Rechercher des sujets similaires à "verrouillage bouton multiple conditions"