Imprimer cellules selon le résultat d'une formule
Bonjour,
Pourriez-vous m'apporter votre aide pour l' écriture d' un code VBA?
Complètement ignorante en la matière je sèche lamentablement.
Je dois imprimer en noir et blanc certaines cellules d'un fichier excel :
1) obligatoirement la plage A1:N9
2) ensuite à compter de la ligne 10 les cellules des colonnes A:N, uniquement si le résultat des formules figurant en colonne A est différent de "" ( rien).
Voici ci-dessous le code qui m'avait été donné sur un forum pour un autre fichier il y a quelques années et qui fonctionnait très bien.
Mais la situation était différente car à compter de C17, en colonne C il n'y avait pas de formules.
je saisissais ou ne saisissais pas des montants :
" 1) Dans Thisworkbook : mettre ce code
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If ActiveSheet.CodeName = "Feuil1" Then 'CodeName de la feuille
Cancel = True
Imprimer
End If
End Sub
2) Dans un MODULE , coller ce code
Sub Imprimer()
'désactive la protection pour les macros
ActiveSheet.Protect "melba", UserInterfaceOnly:=True
Application.EnableEvents = False
On Error Resume Next 'si aucune cellule vide
Range("C17:C" & Rows.Count).SpecialCells(xlCellTypeBlanks).EntireR ow.Hidden = True
ActiveSheet.PageSetup.BlackAndWhite = True 'noir et blanc
[A:G].PrintOut
Rows.Hidden = False
Application.EnableEvents = True
End Sub ".
Je ne connais pas du tout le langage VBA et suis incapable d'adapter ce code à mon nouveau fichier.
Je joins un fichier.
Je vous remercie par avance
Bonsoir,
Personne pour m'aider?
Je me sens bien seule...
Bonsoir,
Essayer :
Sub Imprimer()
Dim n%
Application.EnableEvents = False
n = 9
With Feuil1
Do
If .Cells(n + 1, 1).Value = "" Then .Rows(n + 1).Hidden = True
n = n + 1
Loop While .Cells(n + 1, 1).Formula <> ""
With .PageSetup
.BlackAndWhite = True
.PrintArea = "$A1:N" & n
End With
.PrintOut
.Rows.Hidden = False
End With
Application.EnableEvents = False
End SubCordialement.
Bonjour,
Je suis très très heureuse ce matin de voir que j'ai une réponse.
Je vous dis un très grand merci.
Je viens de tester le fichier et le code fonctionne très bien.
Je prendrai le temps ce soir de l'examiner plus en détail même si je sais que je ne comprendrai pas grand chose.
Cependant je remarque que si le fichier est protégé ( mot de passe "melba"), le code ne fonctionne plus.
Dans mon ancien code j'avais ceci au début car le fichier était protégé ( protection de la feuille et protection du code VBA) :
Sub Imprimer()
'désactive la protection pour les macros
ActiveSheet.Protect "melba", UserInterfaceOnly:=True
Je viens d'essayer d'ajouter cette "phrase" au code que vous m'avez adressé mais ça bug... Je ne respecte dans doute pas la syntaxe VBA.
Vous serait-il possible d'intégrer cet élément?
Cela m'aiderait beaucoup
Merci encore
Bonjour,
Dans ton fichier communiqué, la feuille n'était pas protégée ! Seul l'était l'accès aux macros...
Mais où as-tu voulu réintroduire ta ligne de code ?
Tu l'introduis ici, en supprimant ActiveSheet devant (remplacé par Feuil1) :
With Feuil1
.Protect "melba", UserInterfaceOnly:=True
DoBonjour et bonne année,
Si ta feuille est protégée, il faut ôter sa protection pour exécuter la procédure. Et la rétablir en fin de procédure.
De plus la procédure événementielle WorkBook_BeforePrint semble inutile (donc à supprimer!?) dans la mesure ou l'impression est lancée à partir d'un bouton.
L'usage de EnableEvents est à éviter (sauf impératifs).
Cordialement.
Public Sub Imprimer()
Dim n As Long
n = 9
With Feuil1
.Unprotect Password:="melba"
Do
If .Cells(n + 1, 1).Value = "" Then .Rows(n + 1).Hidden = True
n = n + 1
Loop While .Cells(n + 1, 1).Formula <> ""
With .PageSetup
.BlackAndWhite = True
.PrintArea = "$A1:N" & n
End With
.PrintOut Preview:=True
.Rows.Hidden = False
.Protect Password:="melba", UserInterFaceOnly:=True
End With
End Sub@Jean-Eric
Je n'ai pas écrit ces procédures et n'ai fait que les adapter dans un nouveau contexte...
Il semble en effet qu'elles aient été brinquebalées dans des conceptions parfois contradictoires.
Ceci étant, il serait logique de revenir à la conception d'origine dont il est attesté qu'elle fonctionnait à la satisfaction de l'utilisatrice.
Dans ce cadre, c'est le bouton qui est de trop et doit être supprimé. L'impression est lancée par la procédure normale, interceptée et redirigée vers une mise en page spécifique. La protection ne pose pas de problème particulier. Et la suspension de l'interception des évènements est une pratique courante dont on ne peut en aucun cas dire qu'elle doit être évitée !
Le seul élément qui laisse subsister un risque est l'identification par le nom de code de la feuille. Son utilisation dans ce cas de figure est atypique et ne garantit pas que lors de changements éventuels de classeur, ce nom de code demeurera inchangé. Mais on ignore également si le nom de la feuille est stable. A défaut d'autres critères d'identification, il est vrai que l'usage d'un bouton sur la feuille, assorti d'une substitution de ActiveSheet à Feuil1, pourrait offrir plus de stabilité.
Mais il convient de laisser à l'intéressée les choix ultimes qui relèvent de sa perception en termes d'ergonomie selon sa façon d'opérer..., dans la mesure où quels que soient ces choix, ils pourront être traduits par des ajustements très très minimes au niveau du code.
Je ne serai donc jamais péremptoire sur ce qu'il y a lieu de faire ou non... Je le suis seulement sur le rejet de tout code issu de l'enregistreur, mauvais par définition, et également, selon les cas, sur la conception lorsqu'elle est inachevée ou incohérente et ne permet pas de coder de façon rationnelle...
Cordialement.
Je ne sais comment vous remercier!!!
Je vois que mon problème suscite des échanges j'espère fructueux pour vous.
Je suis désolée d'avoir oublié de vous préciser au début que la feuille était protégée et également la sécurité des macros.
J'ai essayé d'insérer With Feuil1
.Protect "melba", UserInterfaceOnly:=True
Do
"comme indiqué par MFerrand mais sans succès. ( pas douée).
Alors j'ai introduit le code de Jean-Eric dans mon fichier , j'ai supprimé ce qu'il y avait sur Thisworkbook car sinon mon bouton ne fonctionnait pas et j'obtiens ce que je veux.
Je suis comblée....
A l'origine lorsqu'on m'avait donné le code que j'ai évoqué au début de mon post, l'intention était d'imprimer à partir d'un bouton en premier lieu.
Mais je constate après un essai dans mon ancien fichier comportant ce code que l'impression des seules zones voulues se faisait correctement aussi bien à partir du bouton que par la procédure classique ( bouton office/ imprimer/ clic sur l'imprimante).
Si je comprends bien mes bienfaiteurs de l'époque avaient dû parer toutes les éventualités en alimentant le ThisworKbook pour permettre l'édition telle que je voulais , quel que soit la méthode que j'utilisais?
Je suis déjà amplement satisfaite du code fourni , je ne vais quand même pas vous demander de couvrir les deux éventualités!
Sauf si cela présente un intérêt pour vous.
Je vous dis encore mille merci.
Si je vois que vous ne donnez pas suite j'irai cliquer sur le bouton "résolu" .
Je vais également examiner de plus près le code fourni pour essayer de le comprendre un peu car j'aurai certainement à l'utiliser dans d'autres fichiers.
Bonne soirée
Bonsoir,
Effectivement, la protection déclenche une erreur d'exécution sur le test de présence d'une formule. Il semble donc que la macro peut agir sur la feuille mais pas lire la propriété Formula du fait que les formules ne sont pas visibles lorsque la feuille est protégée.
Il faut donc passer par la déprotection-reprotection, qui ne pose pas de problème particulier.
Pour les choix relatifs à ton utilisation, c'est toi qui décide de ce qui te convient le mieux.
Cordialement.
Bonjour melbamelba,
Je n'ai rien à ajouter, sinon un remerciement pour ton retour et tes explications.
Beaucoup d'intervenants veulent une réponse rapide, fonctionnelle et sans chercher à comprendre.
Cordialement.