XL 2016 Macro si cellules vides

MickaeL_D

XLDnaute Junior
Bonjour les experts,

En plus de la macro déjà existante. Je souhaiterais obliger l’opérateur à entrer un commentaire dans la colonne « O » si l'une des colonnes (de F à N) est vide sur la ligne en cours.

Merci d'avance,
 

Pièces jointes

  • CDC_test.xlsm
    284.8 KB · Affichages: 24

fanch55

XLDnaute Barbatruc
Bonjour,
A rajouter en fin de votre event Worksheet_Change:

VB:
    If Not Intersect(Target, Range("F34:N" & Cells(Rows.Count, "A").End(xlUp).Row)) Is Nothing Then
        If WorksheetFunction.CountIf(Rows(Target.Row).Columns("A:E"), "<>") = 4 Then
            If WorksheetFunction.CountIf(Rows(Target.Row).Columns("F:N"), "<>") < 9 Then
                If Range("P" & Target.Row) = "" Then
                    Application.EnableEvents = False
                    Z = Application.InputBox("Un commentaire est obligatoire" & vbLf & "pour cette ligne")
                    If Not Z = False Then Range("P" & Target.Row) = Z
                    Application.EnableEvents = True
                End If
            End If
        End If
    End If
 

MickaeL_D

XLDnaute Junior
Bonjour,

Cela ne répond malheureusement pas à ma question.

Me suis-je peut-être mal exprimé. Je vais tenté d'être plus explicite.

Je souhaiterais ajouter une condition de façon à éviter que les colonnes F/G/H ou I/J/K ou L/M/N restent vides sans qu'un commentaire ne soit inscrit dans la colonne O. La boite de dialogue ne doit apparaitre uniquement quand la saisie de la ligne en cours est terminée. Par exemple à la fermeture du fichier ou bien lors de la sauvegarde.

Merci d'avance,
 

fanch55

XLDnaute Barbatruc
Bonjour,
Si je résume bien et comme on ne sait pas quand la saisie est terminée :

Avant toute sauvegarde :
on parcourt toutes les lignes de données dont la colonne A est renseignée ,​
et si l'une des colonnes F à N est vide,​
on affiche une inputbox pour chaque cellule P vide correspondante .​
en cas d'annulation, on ne sauvegarde pas .​
Le code ci-dessous est à placer dans le module ThisWorkBook
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Not ThisWorkbook.Saved Then
        Select Case MsgBox("Voulez-vous enregistrer ce Classeur ?", vbQuestion + vbYesNoCancel)
        Case vbYes: ThisWorkbook.Save
        Case vbCancel: Cancel = True
        Case vbNo: ThisWorkbook.Saved = True ' On quitte sans sauvegarder
        End Select
    End If
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Ligne As Range
    For Each Ligne In Range("A34:S" & Cells(Rows.Count, "A").End(xlUp).Row).Rows
        If WorksheetFunction.CountIf(Ligne.Columns("F:N"), "<>") < 9 Then
            If Ligne.Columns("P") = vbNullString Then
                Z = Application.InputBox("Un commentaire est obligatoire" & vbLf & "pour le n°Of " & Ligne.Columns("D"))
                If Not (Z = False Or Trim(Z) = vbNullString) Then
                    Application.EnableEvents = False
                    Ligne.Columns("P") = Z
                    Application.EnableEvents = True
                Else
                    Cancel = True
                    Exit For
                End If
            End If
        End If
    Next
    If Not Cancel Then ThisWorkbook.Save
End Sub
Cela ne répond malheureusement pas à ma question.
Il me semblait plus convivial de demander à entrer un commentaire au fur et à mesure de la saisie,
quand l'opérateur a encore bien en tête ce qui doit être fait .
Il est vrai que je n’empêchais pas de ne rien mettre en commentaire,
ce qui aurait pu se faire ainsi:
VB:
    If Not Intersect(Target, Range("F34:N" & Cells(Rows.Count, "A").End(xlUp).Row)) Is Nothing Then
        If WorksheetFunction.CountIf(Rows(Target.Row).Columns("A:E"), "<>") = 4 Then
            If WorksheetFunction.CountIf(Rows(Target.Row).Columns("F:N"), "<>") < 9 Then
                If Range("P" & Target.Row) = "" Then
                    Application.EnableEvents = False
                    Z = Application.InputBox("Un commentaire est obligatoire" & vbLf & "pour cette ligne")
                    If Not Z = False Then Range("P" & Target.Row) = Z Else Target.ClearContents
                    Application.EnableEvents = True
                End If
            End If
        End If
    End If
 

MickaeL_D

XLDnaute Junior
Bonjour fanch55,

La deuxième solution est très bien. Cela dit, je souhaiterais que le commentaire s'affiche dans la colonne "O". Celle-ci étant protégée, comment intégrer les lignes "ActiveSheet.Unprotect" et "ActiveSheet.Protect"?

Merci d'avance,
 

MickaeL_D

XLDnaute Junior
Par contre, lors de l'apparition de l'imputbox où un commentaire est obligatoire. Celui-ci peut-être contourné, car en cliquant simplement sur "OK" l'imputbox disparaît sans imposer un commentaire. Je souhaiterais que l'imputbox ne disparaisse pas tant qu'un commentaire n'est pas rentré. Est-ce possible?
 

fanch55

XLDnaute Barbatruc
Que nenni, ce n'est pas un bypas: s'il n'y a pas de commentaire entré, on ne peut pas sauvegarder ...

Mais si vous préférez boucler, classeur joint avec Commentaire en Colonne O.
Je m'étonne que vous ne sachiez pas protéger/déprotéger la cellule, le code comporte déjà de tels procédés .
Attention: si la colonne O est protégée, le commentaire ne pourra jamais être changé ni effacé .... par l'utilisateur .
 

MickaeL_D

XLDnaute Junior
Fanch55,

Vous avez oublié la pièce jointe...

Concernant le code déjà présent dans le classeur. Il a été développé par une autre personne du forum (Sylvanu). Je reste trop néophyte pour le réaliser. Par ailleurs, je te confirme que si le commentaire n'est entré la sauvegarde n'est pas possible (mea culpa).

Merci d'avance,
 

MickaeL_D

XLDnaute Junior
La macro ne veut pas s'exécuter. J'ai un message d'erreur '1004'.

1620807691563.png
 

fanch55

XLDnaute Barbatruc
Est-ce que cela le fait pour le fichier que je t'ai fourni ( peu probable )
ou pour ton classeur personnel ?
Dans ce cas, donner le bon mot de passe de ton classeur :

ActiveSheet.Unprotect ("2230")​
Ligne.Columns("O") = Z​
ActiveSheet.Protect ("2230")​

ou bien indiquer dans quel container stocker la donnée :

Ligne.Columns("O").value = Z
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
217

Statistiques des forums

Discussions
312 239
Messages
2 086 511
Membres
103 239
dernier inscrit
wari