Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

nicotlse31

XLDnaute Nouveau
Bonjour,

Le sujet a été beaucoup évoqué, j'ai essayé des mix de macros que j'ai récupéré dans les différents posts.
J'ai une nouvelle étude de cas.
C'est un fichier qui sera rempli tous les mois par différents interlocuteurs. Le but est qu'ils impriment le graphique correspondant à leur îlot sans se soucier ni de la mise en forme ni des données qu'ils contiennent.
A cet effet, j'ai fait une macro pour imprimer le graphique correspondant à l'îlot en pré-définissant des zones d'impression pour facilter l'impression.

=> Le but est de bloquer l'impression lorsqu'un ou plusieurs îlots n'a pas rempli sa note du mois en-cours !
Si chacun imprime son graph au fur et à mesure qu'ils remplissent leur note, tous les graphs auront des "champs meilleur niveau atelier" différent.

Le champ "Meilleur niveau atelier" U7 est une valeur max des cellules T7:T23
T7:T23 sont des recherhes horizontales pour afficher sur le graph la note du mois en-cours.
Les graphs de chaque îlots commencent à la ligne 45

Merci d'avance pour votre aide précieuse :)
Nicolas
 

Pièces jointes

  • Bilan_2015 transmettre.xlsm
    89.7 KB · Affichages: 69
  • Bilan_2015 transmettre.xlsm
    89.7 KB · Affichages: 66
  • Bilan_2015 transmettre.xlsm
    89.7 KB · Affichages: 73

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Bonjour Nicolas, et bienvenue sur le forum

voici un exemple qui refuse l'impression si la cellule A1 est vide

à adapter à ton cas

Code:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If [A1] = "" Then
MsgBox ("La cellule A1 doit être remplie avant de pouvoir imprimer le document")
Cancel = True
End If
End Sub


à+
Philippe
 

nicotlse31

XLDnaute Nouveau
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Merci pour ton aide Laurent,

ma macro d'origine est :

Sub Bouton1_Cliquer()
Rows("45:100").Select
Selection.EntireRow.Hidden = False
ActiveSheet.PageSetup.PrintArea = "$B$45:$N$100"
ActiveSheet.PrintPreview
Selection.EntireRow.Hidden = True
End Sub

A quel moment de ma macro intégrer la tienne :confused:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
If [A1] = "" Then
MsgBox ("La cellule A1 doit être remplie avant de pouvoir imprimer le document")
Cancel = True
End If
End Sub
 

camarchepas

XLDnaute Barbatruc
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Bonjour ,

Autre solution :

Peut être comme ceci :

Sub Bouton1_Cliquer()
If [G7] = 0 Or [G11] = 0 Or [G15] = 0 Or [G19] = 0 Or [G23] = 0 Then Exit Sub
Rows("45:100").Select
Selection.EntireRow.Hidden = False
ActiveSheet.PageSetup.PrintArea = "$B$45:$N$100"
ActiveSheet.PrintPreview
Selection.EntireRow.Hidden = True
End Sub
 

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Re,

A quel moment de ma macro intégrer la tienne :confused:

Private Sub Workbook_BeforePrint(Cancel As Boolean)
If [A1] = "" Then
MsgBox ("La cellule A1 doit être remplie avant de pouvoir imprimer le document")
Cancel = True
End If
End Sub

Ce code est à mettre dans ThisWorkBook, il n'est pas nécessaire de "mélanger" les deux codes
en plus il permet aussi de bloquer l'impression lorsqu'on clique sur l'icône de l'imprimante

il te suffit d'adapter: If [A1] = "" Then
en fonction des cellules qui doivent être non-vides sur ta feuille

à+
Philippe

Edit:
@ camarchepas, ton code ne fonctionneras pas si la demande d'impression se fait via l'icône
 

Pierrot93

XLDnaute Barbatruc
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Bonjour à tous,

on pourrait également peut être le coder ainsi, toujours à placer dans le module "thisworkbook" et sans bouton :

Code:
Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = ([G7] = 0 Or [G11] = 0 Or [G15] = 0 Or [G19] = 0 Or [G23] = 0)
With Rows("45:100")
    .Hidden = False
    ActiveSheet.PageSetup.PrintArea = "$B$45:$N$100"
    ActiveSheet.PrintPreview
    .Hidden = True
End With
End Sub

bon après midi
@+
 

Pierrot93

XLDnaute Barbatruc
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Re,

avec 2 blocs "with" :
Code:
Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = ([G7] = 0 Or [G11] = 0 Or [G15] = 0 Or [G19] = 0 Or [G23] = 0)
With Rows("45:100")
    .Hidden = False
    With ActiveSheet
        .PageSetup.PrintArea = "$B$45:$N$100"
        .PrintPreview
    End With
    .Hidden = True
End With
End Sub
 

Pierrot93

XLDnaute Barbatruc
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Re,

Aarf une grossière erreur de ma part, manquait le "exit sub"...
Code:
Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = ([G7] = 0 Or [G11] = 0 Or [G15] = 0 Or [G19] = 0 Or [G23] = 0)
If Cancel Then Exit Sub
With Rows("45:100")
    .Hidden = False
    With ActiveSheet
        .PageSetup.PrintArea = "$B$45:$N$100"
        .PrintPreview
    End With
    .Hidden = True
End With
End Sub
 

nicotlse31

XLDnaute Nouveau
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Merci pour vos aides respectives.
J'ai testé la macro de "camarchepas".
Une note peut être à 0 donc la macro fonctionne pas.
Je l'ai adapté, elle affiche bien la message box mais lorsqu'on clique sur ok, la macro continue et on peut quand même imprimer même en ayant pas rempli la colonne du mois en cours.

Je vous ai joint en PJ l'xls.

Sub Bouton1_Cliquer()
If [G7] = "" Or [G11] = "" Or [G15] = "" Or [G19] = "" Or [G23] = "" Then
MsgBox ("Une note n'a pas été remplie, relancer l'agent de maîtrise correspondant")
Cancel = True
End If
Rows("45:100").Select
Selection.EntireRow.Hidden = False
ActiveSheet.PageSetup.PrintArea = "$B$45:$N$100"
ActiveSheet.PrintPreview
Selection.EntireRow.Hidden = True
End Sub
 

Pièces jointes

  • Bilan_2015 transmettre.xlsm
    90.4 KB · Affichages: 58
  • Bilan_2015 transmettre.xlsm
    90.4 KB · Affichages: 58
  • Bilan_2015 transmettre.xlsm
    90.4 KB · Affichages: 51

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Re,

la solution idéale passe par ce que Pierrot et moi-même t'ont proposé


sans ouvrir le fichier, à la vue de ton dernier code publié,
remplace Cancel = True par Exit Sub

à+
Philippe
 

camarchepas

XLDnaute Barbatruc
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Re à tous ,

Et oui des fois ça marche vraiment pas , Comme disait le baron , l'important est de participer , et c'est pas si loin ,

il suffit de faire je pense :

Private Sub Workbook_BeforePrint(Cancel As Boolean)
If [G7] = "" Or [G11] = "" Or [G15] = "" Or [G19] = "" Or [G23] = "" Then
MsgBox ("Une note n'a pas été remplie, relancer l'agent de maîtrise correspondant")
Cancel = True
end sub
 

nicotlse31

XLDnaute Nouveau
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

ça avance, ça avance...
Toutes les macros ci-dessous fonctionne :

Macro 1:
j'ai essayé celle ci dans le dossier "thisworkbook" (fonction que je découvre je ne sais pas trop à quoi elle sert...):
Option Explicit
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = ([G7] = "" Or [G11] = "" Or [G15] = "" Or [G19] = "" Or [G23] = "")
If Cancel Then Exit Sub
With Rows("45:100")
.Hidden = False
With ActiveSheet
.PageSetup.PrintArea = "$B$45:$N$100"
.PrintPreview
End With
.Hidden = True
End With
End Sub

Avec dans la macro du bouton 1 celle-ci:
Sub Bouton1_Cliquer()
If [G7] = "" Or [G11] = "" Or [G15] = "" Or [G19] = "" Or [G23] = "" Then
MsgBox ("Une note n'a pas été remplie, relancer l'agent de maîtrise correspondant")
Cancel = True
End If
Rows("45:100").Select
Selection.EntireRow.Hidden = False
ActiveSheet.PageSetup.PrintArea = "$B$45:$N$100"
ActiveSheet.PrintPreview
Selection.EntireRow.Hidden = True
End Sub

Macro 2:
sans utilser le mode "this workbook"

Sub Bouton1_Cliquer()
If [G7] = "" Or [G11] = "" Or [G15] = "" Or [G19] = "" Or [G23] = "" Then
MsgBox ("Une note n'a pas été remplie, relancer l'agent de maîtrise correspondant")
Exit Sub
End If
Rows("45:100").Select
Selection.EntireRow.Hidden = False
ActiveSheet.PageSetup.PrintArea = "$B$45:$N$100"
ActiveSheet.PrintPreview
Selection.EntireRow.Hidden = True
End Sub

Le but est d'imprimer chacun des graphs à partir d'un bouton lié à l'îlot
(Ex: bouton 1 -> graph1 ; bouton2 -> graph 2)

J'essaie d'abord de déverminer un bouton pour ensuite copier coller la macro sur les autres.
J'ai un doute sur la fonction "thisworkbook" qui a l'air d'appliquer la même macro à tous les boutons.
Par exemple le bouton 1 vient normalement sélectionner la zone B45:N100, le bouton 2 la zone B104:N159...
Avec la fonction "this workbook", il vient à chaque fois imprimer la zone B45:N100

Je pense donc partir sur la macro 2 quitte à la retravailler pour la simplifier avec les fonctions "with"

L'étape suivante est de faire en sorte que la colonne scannée par la macro soit "évolutive".
Une fois qu'un mois a été remplie et que tous le monde a pu imprimer son graph, il faut passer au mois suivant et donc inventer une macro qui regarde à chaque fois si la dernière colonne, correspondant au mois en-cours, est complète avant impression.
Il faudrait réussir à programmer une sorte de boucle qui se dit :"lorsqu'une valeur est rentré dans le mois prochain, je vérifie si les champs de cette colonne sont remplis" et ça au fur et à mesure pour chaque mois
 

camarchepas

XLDnaute Barbatruc
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Re ,

Le mois de référence serait le mois en cours ou le mois n-1 par rapport à la date du traitement ?

Ensuite il suffit t'employer un offset par rapport à la 1ere colonne :

range("D7").offset(1,month(date)-1) au lieu de [D7] par exemple ...

essaies d'intégrer dans ce sens .....,
 

nicotlse31

XLDnaute Nouveau
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

Re ,

Le mois de référence serait le mois en cours ou le mois n-1 par rapport à la date du traitement ?

Ensuite il suffit t'employer un offset par rapport à la 1ere colonne :

range("D7").offset(1,month(date)-1) au lieu de [D7] par exemple ...

essaies d'intégrer dans ce sens .....,

Bonjour,
La macro de base est la suivante :

Sub Bouton1_Cliquer()
If [G7] = "" Or [G11] = "" Or [G15] = "" Or [G19] = "" Or [G23] = "" Then
MsgBox ("Une note n'a pas été remplie, relancer l'agent de maîtrise correspondant")
Exit Sub
End If
With Rows("45:100")
.Hidden = False
With ActiveSheet
.PageSetup.PrintArea = "$B$45:$N$100"
.PrintPreview
End With
.Hidden = True
End With
End Sub

=> Le mois de référence serait le moins en cours. Par exemple, nous sommes le 05/02, la colonne du mois à vérifier est Février. Si toutes les notes de Février ne sont pas remplies, il faut bloquer l'impression.
Je n'ai pas réussi à faire fonctionner la macro en y intégrant : range("D7").offset(1,month(date)-1) au lieu de [D7]
Avez-vous des idées de type de codes qui pourrait répondre à ce besoin? :confused:

Je vous joint mon xls pour test
merci d'avance
 

Pièces jointes

  • Bilan_2015 aide.xlsm
    95.6 KB · Affichages: 63

camarchepas

XLDnaute Barbatruc
Re : Macro pour bloquer l'impression si cellule vide dans colonne mois en cours

re ,

et bien comme l'adaptation peut ce faire comme ceci.

j'ai ajouté une inputbox pour les tests afin de forcer le mois , pourrait peut être utile en fin de mois, le 2 février par exemple pour avoir les chiffre de Janvier. sinon elle peut être mise en commentaire voir supprimée

Code:
Sub Bouton1_Cliquer()
  Dim Mois As Integer
    Mois = Month(Date)
    Mois = InputBox("Mois à traiter", "Veuillez saisir", Mois) ' Peut être mis en commentaire aprés les tests 
   If [D7].Offset(0, Mois) = "" Or [D11].Offset(0, Mois) = "" Or [D15].Offset(0, Mois) = "" Or [D19].Offset(0, Mois) = "" Or [D23].Offset(0, Mois) = "" Then
     MsgBox ("Une note n'a pas été remplie, relancer l'agent de maîtrise correspondant")
    Exit Sub
   End If
   With Rows("45:100")
     .Hidden = False
     With ActiveSheet
       .PageSetup.PrintArea = "$B$45:$N$100"
       .PrintPreview
     End With
     .Hidden = True
   End With
 End Sub
 

Statistiques des forums

Discussions
312 248
Messages
2 086 593
Membres
103 248
dernier inscrit
Happycat