Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Pb avec code VBA

MickaeL_D

XLDnaute Junior
Bonjour à tous les experts,

Je rencontre un petit souci avec le code vba ci-dessous. Le principe de la macro est qu'avant toute sauvegarde :
On parcourt toutes les lignes de données dont la colonne A est renseignée et si l'une de la colonne F est vide.
On affiche une inputbox pour chaque cellule G vide correspondante en cas d'annulation, on ne sauvegarde pas .

J'aimerais la modifier, comme suit :
On parcourt toutes les lignes de données dont la colonne B est renseignée et si l'une de la colonne F est vide.
On affiche une inputbox pour chaque cellule G vide correspondante en cas d'annulation, on ne sauvegarde pas.

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
        End Select
    End If
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Ligne   As Range
Dim Sh      As Worksheet
Dim Comment As Variant
    Set Sh = Worksheets("Carte de ctrl")
        Sh.Activate
        For Each Ligne In Sh.Range("A35:O" & Sh.Cells(Rows.Count, "A").End(xlUp).Row).Rows
            If WorksheetFunction.CountIf(Ligne.Columns("F:F"), "<>") < 1 Then
                If Ligne.Columns("G") = vbNullString Then
                    ActiveWindow.ScrollRow = Ligne.Row
                    Ligne.Select
                    Do: Comment = InputBox( _
                            "Un commentaire est obligatoire" & vbLf & _
                            "pour le n° de lot " & Ligne.Columns("D"), "Valeur(s) manquante(s) pour la ligne n° " & Ligne.Columns("A"))
                    Loop While Comment = "" Or Comment = " " Or Comment = " " Or Comment = "." Or Comment = ".." Or Comment = "..." Or Comment = " " Or Comment = "  " Or Comment = "   " Or Comment = False
                    Application.EnableEvents = False
                        Ligne.Columns("G").Value = Comment
                    Application.EnableEvents = True
            End If
            End If
        Next
    Set Sh = Nothing
End Sub
Private Sub Workbook_Open()
    Worksheets("Carte de ctrl").Protect "2230", UserInterfaceOnly:=True
End Sub

Je vous joins le fichier excel associé

Merci d'avance,
 

Pièces jointes

  • CDC.xlsm
    191.5 KB · Affichages: 7
Solution
Bonjour,
Je ne comprends pas.
La première vérification est sur la colonne F. Si pas de valeur1 on ouvre un inputbox. mais si on met ce commentaire en G alors F est toujours vide, et la prochaine fois il recommencera.
En PJ c'est modifié mais la colonne F est vérifiée avec B, F, G vides.

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Mickael,
Vous pouvez essayez cette structure :
VB:
Sub Essai()
    Dim DL%, L%, Sh As Worksheet
    Application.ScreenUpdating = False
    ' Dernière ligne occupée de la colonne A
    DL = Range("A65500").End(xlUp).Row ' En supposant qu'on ne considère que toutes les lignes de A
    Set Sh = Worksheets("Carte de ctrl")
    Sh.Activate
    For L = 35 To DL ' En supposant que l'analyse commence en ligne 35
        If Cells(L, "B") <> "" And Cells(L, "F") = "" Then  ' Detecte cell B non vide ET cell F vide
            ' Mettre input box
        End If
    Next L
End Sub
Pour toute cellule non vide de A, vérifie si on a une cellule non vide en B ET une cellule vide en F. Dans ce cas il faut ouvrit l'inputbox.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Je ne sais pas ce que vous voulez faire. Si vous voulez remplacez les actions existantes, cela remplacerait votre "For Each Ligne In Sh.Range ..."
Mais comme votre VBA est protégé, je ne suis pas allé plus loin, juste donner une structure possible.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Un ex en PJ qui remplace l'action précédente.
Si on a une cellule en A non vide, en B non vide et en F vide, on émet un message et on sort de la macro.
Mais c'est à vous de la bricoler si elle doit être en plus des actions précédentes.
 

Pièces jointes

  • CDC (2).xlsm
    183.7 KB · Affichages: 2

MickaeL_D

XLDnaute Junior
Re,
Je suis débutant en vba. Les codes déjà présents sont issus d'experts de ce forum. Pour cela, seriez-vous en mesure de m'aider à fusionner les 2 codes

VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim DL%, L%, Sh As Worksheet
    Application.ScreenUpdating = False
    ' Dernière ligne occupée de la colonne A
    DL = Range("A65500").End(xlUp).Row ' En supposant qu'on ne considère que toutes les lignes de A
    Set Sh = Worksheets("Carte de ctrl")
    Sh.Activate
    For L = 35 To DL ' En supposant que l'analyse commence en ligne 35
        If Cells(L, "B") <> "" And Cells(L, "F") = "" Then  ' Detecte cell B non vide ET cell F vide
            Cells(L, "F").Select    ' Met le pointeur sur la cellule vide
            MsgBox "Cette cellule en F est vide, veuillez la renseigner avant d'enregistrer."
            Exit Sub    ' On sort car une cellule en F est vide
        End If
    Next L
End Sub
Private Sub Workbook_BeforeSave_ANCIEN(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Ligne   As Range
Dim Sh      As Worksheet
Dim Comment As Variant
    Set Sh = Worksheets("Carte de ctrl")
        Sh.Activate
        For Each Ligne In Sh.Range("A35:O" & Sh.Cells(Rows.Count, "A").End(xlUp).Row).Rows
            If WorksheetFunction.CountIf(Ligne.Columns("F:F"), "<>") < 1 Then
                If Ligne.Columns("G") = vbNullString Then
                    ActiveWindow.ScrollRow = Ligne.Row
                    Ligne.Select
                    Do: Comment = InputBox( _
                            "Un commentaire est obligatoire" & vbLf & _
                            "pour le n° de lot " & Ligne.Columns("D"), "Valeur(s) manquante(s) pour la ligne n° " & Ligne.Columns("A"))
                    Loop While Comment = "" Or Comment = " " Or Comment = " " Or Comment = "." Or Comment = ".." Or Comment = "..." Or Comment = " " Or Comment = "  " Or Comment = "   " Or Comment = False
                    Application.EnableEvents = False
                        Ligne.Columns("G").Value = Comment
                    Application.EnableEvents = True
            End If
            End If
        Next
    Set Sh = Nothing
End Sub
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Ne comprenant pas tout à fait la macro existante, j'ai tout simplement enchainer les deux actions avec :
VB:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    VerifColonneF
    VerifColonneG
End Sub
Je vérifie la colonne F, puis j'enchaine sur la vérification de la colonne G avec votre macro.
 

Pièces jointes

  • CDC (3).xlsm
    193 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Je ne comprends pas.
La première vérification est sur la colonne F. Si pas de valeur1 on ouvre un inputbox. mais si on met ce commentaire en G alors F est toujours vide, et la prochaine fois il recommencera.
En PJ c'est modifié mais la colonne F est vérifiée avec B, F, G vides.
 

Pièces jointes

  • CDC (3) (1).xlsm
    186.2 KB · Affichages: 1

Discussions similaires

Réponses
2
Affichages
436
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…