XL 2016 Problème de conditions

TechnologyNewStore

XLDnaute Nouveau
Bonjour à tous,

Je sollicite de nouveau la communauté étant donné qu’elle a toujours donné satisfaction à mes demandes et je vous en remercie d’ailleurs.

Grâce au forum, j’ai pu développer une interface permettant de signer des documents électroniquement à l’aide de l’ID de chaque personnel de l’entreprise. Compte tenu du caractère privé de l’interface, je ne peux poster le fichier ici mais vais cependant décrire précisément son contenu et le problème auquel je suis confronté.


Mon fichier comporte 2 feuilles dont une qui est cachée et accessible via un mot de passe saisi par l’administrateur.

La première, « Feuil1 », comporte mon listing de personnel (noms de famille) à partir de la colonne B18 jusqu’à BXX (fin de la liste des noms, variable selon les départements de mon entreprise).

En colonne C (fusionnée avec la D), se trouve une colonne « SIGNATURE (ou motif d’absence) » permettant à la personne de signer le document le jour de sa parution s’il elle est présente. En colonne E (fusionnée avec F et F) se trouve une colonne « RATTRAPAGE » permettant à la personne de signer le document à son retour au travail. Ces deux colonnes commencent également en ligne 18 (en face du premier nom de famille) jusqu’à la ligne XX.

Le deuxième, « Feuil2 » (feuille cachée), comporte la base de données du personnel avec le listing des noms en colonne B (commence en B2 jusqu’à BXX) et les ID associés en colonne D (commence en D2 jusqu’à DXX).


Actuellement, mon programme permet à l’utilisateur de signer le document électroniquement via un formulaire. Une sélection de la cellule comportant son nom et un clic sur un bouton « signature » affiche automatiquement le nom dans le formulaire de signature et demande à l’utilisateur de saisir l’ID et demande s’il s’agit d’un rattrapage ou non. Si non, après saisie correcte de l’ID et croix dans la case « NON » (rattrapage), la mention « SIGNE » s’inscrit dans la colonne C associée au nom de famille. Si croix dans la case « OUI », la date du jour ainsi que la mention « SIGNE » s’affiche (JJ/MM/AAAA – SIGNE). Il n’est pas possible de cocher les deux cases et pas possible non plus de signer dans les deux colonnes ou de signer plusieurs fois (message d’avertissement via Msgbox). De plus, les saisies manuelles sont impossibles (feuille protégée par mot de passe administrateur à l’ouverture du classeur).

Voici le code associé pour ces éléments :

Dans un module :
VB:
Sub AffichageUFSignature ()
    Dim memoire As Integer
    Dim temoinListe As Integer
    Dim temoinPasListe As Integer
    Dim i As Integer

    i = 2
    temoinListe = 0
    temoinPasListe = 0
    memoire = CompterNbLignes

    Do
        If ActiveCell = Sheets("Feuil2").Cells(i, 2).Text And ActiveCell.Offset(0, 1) = "" And ActiveCell.Offset(0, 3) = "" Then
      temoinListe = temoinListe + 1
        ElseIf ActiveCell <> Sheets("Feuil2").Cells(i, 2).Text Then
            temoinPasListe = temoinPasListe + 1
        End If

        i = i + 1
    Loop While i <= memoire + 1


    If temoinListe > 0 Then
      UFSignature.Show

    ElseIf temoinPasListe = memoire Then
        Call MsgBox("Veuillez choisir une autre cellule.", vbOKOnly, "Cellule selectionnée non valide")

    Else
        Call MsgBox("Vous avez déjà signé.", vbOKOnly, "Signature existante")

    End If

End Sub

Function CompterNbLignes() 'On compte le nombre de lignes dans la feuille " Feuil2"

    Dim i As Integer
    i = 2
    
Do
    If Sheets("Feuil2").Cells(i, 1).Value <> "" Then
        i = i + 1
    End If
Loop While Sheets("Feuil2").Cells(i, 1).Value <> ""

i = i - 2

CompterNbLignes = i

End Function

Code du UFSignature :
Code:
Option Explicit
Option Compare Text

Private Sub BoutonSigner_Click()
    
    Dim memoire As Integer 'Variable qui va stocker un nombre de ligne. Cela évite d'appeler constamment la boucle de comptage de lignes
    Dim temoin As Integer 'Permet de reconnaitre si une condition a été validée
    Dim i As Integer 'Variable permettant de faire défiler toutes les lignes d'une colonne
    
    i = 2
    temoin = 0
    memoire = CompterNbLignes
    
    Do
        If TextBoxNom.Value = Sheets("Feuil2").Cells(i, 2).Value And TextBoxID.Value = Sheets("Feuil2").Cells(i, 4).Value And CheckBoxOUI.Value = True Then 'Si les données concordent avec la base de données, on exécute la condition
        'Si les informations concordent et que la case "CheckBoxOUI" est cochée, on rentre des infos dans la case "Rattrapage"
            Sheets("Feuil1").Unprotect Password:=Sheets("MotDePasse").Range("B3").Text
            
            With ActiveCell.Offset(0, 3)
                .Value = Date & " - SIGNÉ"
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
            End With
                
            temoin = temoin + 1
            
            Call Unload(Me)
            
            Call MsgBox("Signature acceptée.", vbOKOnly, "Validation")
            
            Sheets("Feuil1").Protect Password:=Sheets("MotDePasse").Range("B3").Text
            
        ElseIf TextBoxNom.Value = Sheets("Feuil2").Cells(i, 2).Value And TextBoxID.Value = Sheets("Feuil2").Cells(i, 4).Value And CheckBoxNON.Value = True Then 'Si les données concordent avec la base de données, on execute la condition
        'Si les informations concordent et que la case "CheckBoxNON" est cochée, on rentre des infos dans la case "Signature"
            Sheets("Feuil1").Unprotect Password:=Sheets("MotDePasse").Range("B3").Text
            
            With ActiveCell.Offset(0, 1)
                .Value = "SIGNÉ"
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
            End With
                
            temoin = temoin + 1
            
            Call Unload(Me)
            
            Call MsgBox("Signature acceptée.", vbOKOnly, "Validation")
            
            Sheets("Feuil1").Protect Password:=Sheets("MotDePasse").Range("B3").Text
            
        End If
        
        i = i + 1 'On incrémente le "i" à chaque passage dans la boucle
        
    Loop While i <= memoire + 1

    If temoin = 0 Then 'Si on est jamais rentré dans une des conditions précédentes, alors on affiche un message d'erreur
        UFErreur.Show
    End If
    
End Sub

Private Sub CheckBoxNON_Click()

    If CheckBoxNON.Value = True Then 'Si la "CheckBoxNON" est remplie, la "CheckBoxOUI" ne peut pas être remplie
        CheckBoxOUI.Value = False
    End If

End Sub

Private Sub CheckBoxOUI_Click()

    If CheckBoxOUI.Value = True Then 'Si la "CheckBoxOUI" est remplie, la "CheckBoxNON" ne peut pas être remplie
        CheckBoxNON.Value = False
    End If
    
End Sub

Private Sub TextBoxID_Change()

    TextBoxID.PasswordChar = "*" 'Les caractères rentrés dans la barre de saisie se transforment en "*" pour que les saisies restent confidentiels

    TextBoxID.Text = UCase(TextBoxID.Text) 'Toutes les saisies se transforment en majuscule

End Sub

Private Sub UserForm_Initialize()

    TextBoxNom.Text = ActiveCell 'La "TextBoxNom" prend en valeur ce qui est marqué dans la case selectionnée
    TextBoxNom.Locked = True
    
End Sub

Function CompterNbLignes() 'On compte le nombre de lignes dans la feuille " Feuil2"

    Dim i As Integer
    i = 2
    
Do
    If Sheets("Feuil2").Cells(i, 1).Value <> "" Then
        i = i + 1
    End If
Loop While Sheets("Feuil2").Cells(i, 1).Value <> ""

i = i - 2

CompterNbLignes = i

End Function

J’aimerai aujourd’hui aller plus loin afin que l’administrateur (chef de département) puisse renseigner le type d’absence en colonne C « SIGNATURE (ou motif d’absence) » avant que le personnel signe son rattrapage (au lancement du document). Les mentions suivantes « VACANCES », « MALADIE » ou « DEPLACEMENT » devront être remplies par l’administrateur en colonne C grâce à une liste déroulante qui serait placée dans chaque cellule de la colonne C (ligne 18 à XX). Bien sûr, cette modification ne sera possible que lorsque l’administrateur aura déprotégé le classeur.

Seulement voilà, le fait d’avoir imposé des conditions sur les colonnes C et E empêche le remplissage des deux cellules (MsgBox "Vous avez déjà signé. "). Or j’aimerai que si l’administrateur remplit en cellule CXX la mention « VACANCES » (par exemple), l’utilisateur, à son retour, puisse signer le document quand même (en cellule EXX) mais ne puisse pas effacer la mention remplie par l’administrateur en colonne CXX s’il coche « NON » en rattrapage (affichage d’un MsgBox qui mentionnerait que c’est impossible étant donné qu’il était absent => forcément un rattrapage).


J’espère avoir été clair dans ma demande et je vous remercie de l’intérêt que vous porterez à mon problème.


Bonne journée !
 

Statistiques des forums

Discussions
297 993
Messages
1 964 947
Membres
200 777
dernier inscrit
BLUMI