Imprimer via un bouton de commande SEULEMENT

klm1234

XLDnaute Nouveau
Bonjour tout le monde!

Premièrement je tiens à remercier la communauté entière car vous m'avez déjà été d'une grande aide ;)

Voici mon problème, je doit créer un bouton pour imprimer des feuilles de spécifications techniques seulement, l'impression ne doit se faire que si deux conditions sont respectés :
1- La feuille de spécification technique doit être approuvée
2- L'impression ne doit se faire uniquement que par le bouton

En fait sur l'appuie du bouton "Imprimer", une InputBox nous demande le code produit de la PSS (Product Specification Sheet) à imprimer, vérifie que le code produit est approuvée et ensuite seulement ouvre la pop-up d'impression.

L'impression doit rester interdite dans tous les autres cas.
Les produits et leurs spécifications sont sur la même ligne (HKN15zR, 1530, Rouge, Opaque, Oui, etc.) et les différentes caractéristiques sont distribuées sur les colonnes (Code Produit, Valeur X, Valeur Y, Valeur Z, Approuvée?, etc.)

Merci beaucoup de votre aide!
 

Gorfael

XLDnaute Barbatruc
Re : Imprimer via un bouton de commande SEULEMENT

Salut klm1234 et le forum
Toujours le même problème : on ne travaille pasavec ton fichier !!!
Tout ce qu'on en connaît tient... dans ton poste. Ce qui est évident ne l'est que pour toi.Ou alors tu l'a écrit...

1- La feuille de spécification technique doit être approuvée
C'est une bonne idée. Mais on ne connaît pas celui qui approuve et il refuse de nous dire quelles sont les fiches validées :p

2- L'impression ne doit se faire uniquement que par le bouton
Tu fais un bouton et tu lui fais lancer une macro.
En fait sur l'appuie du bouton "Imprimer", une InputBox nous demande le code produit de la PSS
Je préconiserais plutot une ComboBox (Usf ou Formulaire), permettant de limiter lescode produit à ceux de la liste déjà validée.
L'impression doit rester interdite dans tous les autres cas.
Il suffit que la macro permettant de lancer l'impression mette une variable globale à True et qu'on utilise la macro à lancement automatique Workbook_BeforePrint du module ThisWorkBook avec simplement un Cancel=Variable
A+
 

klm1234

XLDnaute Nouveau
Re : Imprimer via un bouton de commande SEULEMENT

Merci pour ta réponse Gorfael,

Tu as raison, j'aurais dû être plus claire dès le départ!
Voici donc un template du fichier que j'utilise, je ne peux pas joindre le fichier original car il est trop gros...

J'explique le fonctionnement, dans la version originale il y a un bouton "Approve" qui permet comme son nom l'indique d'approuver la validité d'une PSS en apposant le sigle JT dans la colonne "Approved?". Le fichier .xls est une banque de données des produits disponible. Cependant étant donnée que ce fichier est nouveau, chaque produit doit être approuvée par un vérificateur avant d'être envoyé au département de production.

La ligne 4 est la seule ligne modifiable par l'utilisateur. Tout le reste est bloqué.

Cette ligne permet de construire une réelle fiche technique ergonomique sur une autre feuille. C'est cette feuille qui doit ou ne doit pas être imprimée à l'aide du bouton "Print" (toutes les données sont sur "Sheet 1" et la fiche technique se construit d'elle même sur "Sheet 2").

Pour ce qui est de la ComboBox, l'idée est bonne selon moi, mais ce n'est pas moi qui donne les ordres lol! Ce fichier doit fonctionner d'une manière bien précise, il faut donc demander à l'utilisateur quel code produit il désire imprimer, vérifier s'il est approuvée, si oui, copier les données sur la ligne 4 et ouvrir la page d'impression pour "Sheet 2", si non, ouvrir une pop-up l'informant que le code produit n'est pas encore approuvé.

Je ne m'y connais pas énormément en VBA, du coup je pense que je connais grosso-modo les fonctions mais la difficulté c'est de les faire fonctionner toutes ensembles pour obtenir le comportement désiré...

Encore un gros merci pour votre temps et votre aide!
 

Pièces jointes

  • PSSTest.xls
    44.5 KB · Affichages: 211

Gorfael

XLDnaute Barbatruc
Re : Imprimer via un bouton de commande SEULEMENT

Salut klm1234 et le forum
Petites remarques :
Sheet1, Sheet2, Sheet3 => je subodore un Excel en Anglais : Si c'est le cas, pourquoi ne pas l'avoir précisé ? Perso, je suis en français, et je ne suis pas sûr que des formules alembiquées soient traduites correctement et les conseils d'adaptation ne seront pas forcément utilisables.

Un fichier de test est toujours mieux qu'un fichier de travail : pas besoin d'avoir 10000 lignes quand 5 suffisent. Mais si tu ne mets qu'un extrait du fichier original, ce n'en est pas un : Tu vas de la colonne B à EH. Dans ton fichier de test, il faut que tu puisses identifier chacune des cellules de B8 à EH12 => si tu fais une erreur de ligne ou de colonne dans ce qui te sert à imprimer, il faut que tu puisses le voir avant de distribuer tes fichiers, ça évites des retours accompagnés de cris.
La ligne 4 est la seule ligne modifiable par l'utilisateur. Tout le reste est bloqué.
Cette ligne permet de construire une réelle fiche technique ergonomique sur une autre feuille. C'est cette feuille qui doit ou ne doit pas être imprimée à l'aide du bouton "Print" (toutes les données sont sur "Sheet 1" et la fiche technique se construit d'elle même sur "Sheet 2").
Là, on entre dans le sujet, mais par la petite porte.

Mes questions :
Seule la ligne 4 est approuvée => c'est pour approuver ou imprimer ? Dans ta base de données, il faut approuver la ligne 4 ou tu ne peux "appeler" en ligne 4 une ligne (de 8 à 12 dans ton exemple) que si elle a déjà été approuvée ? Ça, j'ai pas compris.

On doit imprimer la ligne 4 : on la transfère sur la Sheet2 : comment ? toutes les colonnes ? seulement celles en vert ou seulement celles en blanc ?

J'ai déjà produit un fichier similaire, pour un fichier d'élèves, mais avec un fonctionnement différent :
- La base de données (sheet1) masquée => seul ceux qui la modifient y ont accès. Les données sont en ligne.
- Une fiche de consultation :
une cellule avec liste en validation (A1). Les cellules devant comporter les renseignements ont des formules de recherche basées sur A1
un bouton permettant l'impression de cette fiche
Le format d'mpression de cette page (mise en page, nom en gras, couleurs, etc) est figé. Les 2 seules actions possibles sont le changement de nom en A1 et l'impression.
- Une fiche de création/modification : même format que la fiche précédente, mais le nom peut être cherché à l'aide d'une liste de validation en A1 ou créé en B1
- au changement en A1, une macro va chercher les données déjà inscrites et renseigne la fiche
- au changement en B1, une macro va vérifié qu'il n'existe pas. dans le cas contraire, il renseigne A1 et supprime B1
2 boutons :
suppression => après messages d'avertissement supprime la ligne de la feuille base de données qui correspond à A1
Modification : A1 vide => crée une nouvelle ligne en BdD suivant B1 avec tous les champs
A1 renseigné => recherche la valeur de A1 dans la BdD et renseigne tous les champs (qu'ils aient été modifiés ou non)
- Une feuille d'accès limité pour imprimer :
-toutes les fiches d'une classe, d'un niveau (au travers de la fiche de consultation)
-les listings de notes, de renseignement divers, etc...
Cette feuille ne travaillait que par macros
A+
PS : Il faut être clair : soit on te demande de réaliser un projet et on te laisse les mains libres : et ouais, faudra qu'ils changent leurs petites habitudes, même si ça ne leur plait pas. Ou ils trouvent quelqu'un d'autre. S'ils ne le réalisent pas eux-même, c'est qu'ils n'en sont pas capables. Si c'est par le temps, ils ne te demanderont pas des impossibilités techniques, mais si c'est par absence de compétences... ils vont te construire une usine à gaz qui ne sera jamais conforme à leurs lubies.
Même si ce n'est jamais facile, il faut mettre les points (des fois les poings) sur les I : Il y a des contraintes techniques, même si Excel peut faire beaucoup de choses. Et il faut du temps.
S'ils ne veulent pas qu'on touche à leur sacré fichier, ils l'ont déjà. sinon, qu'ils construisent la fiche (où doit aller chacune des valeurs), et tu t'occupes du fait qu'elles se renseignent. Tu ne peux être responsable que de ce que tu fais, pas de ce qu'ils imaginent.
Airbus a subit une grave crise uniquement parce que personne ne voulait dire qu'il y avait un problème.
 
Dernière édition:

klm1234

XLDnaute Nouveau
Re : Imprimer via un bouton de commande SEULEMENT

Bonjour Gorfael et la communauté,

Encore une fois merci de prendre le temps de m'aider, c'est plus qu’apprécié étant donnée que ce projet est assez considérable...


Sheet1, Sheet2, Sheet3 => je subodore un Excel en Anglais : Si c'est le cas, pourquoi ne pas l'avoir précisé ? Perso, je suis en français, et je ne suis pas sûr que des formules alembiquées soient traduites correctement et les conseils d'adaptation ne seront pas forcément utilisables.

Effectivement j'utilise Excel 2003 en anglais, je n'ai pas d'autorisation pour installer une version plus récente, en français, ou quoi que ce soit... Raison de sécurité j'imagine. Je suis au Québec et la francisation des logiciels n'est pas encore au point (de même que l'utilisation du système métrique mais bon avec les états-unis à coté comme client principal c'est assez difficile il parait...).

Pour ce qui est de la compatibilité de l'aide fournie, ce sera mon travaille de fouiner un peu et de trouver des traductions pour les commandes si jamais elles ne fonctionnent pas. La logique devrait rester la même, il suffirait à mon avis simplement d'utiliser le terme adapté à la version anglophone, non?


Dans ton fichier de test, il faut que tu puisses identifier chacune des cellules de B8 à EH12 => si tu fais une erreur de ligne ou de colonne dans ce qui te sert à imprimer, il faut que tu puisses le voir avant de distribuer tes fichiers, ça évites des retours accompagnés de cris.

En fait, dans le fichier de test il faut que je puisse identifier chacune des cellules de B8 à EI12, cette dernière colonne permet de vérifier si le produit a déjà été approuvé ou pas! Dans le cas présent, aucun des produits n'a été approuvé.

Afin de vérifier qu'il n'y ai pas d'erreur, c'est la ligne 5 (en verte) qui nous permet de vérifier si tout est conforme. Donc, si le produit est approuvé (présence du sigle "JT" dans la colonne "EI") et qu'il n'y a pas d'erreur (toujours des "1" à la ligne 5), le bouton "Print" nous permet d'imprimer la feuille de spécification.

Par exemple, en appuyant sur le bouton "Print" l'utilisateur veut imprimer les spécification du produit "FOSS2CXANH15" (ligne 11). La macro vérifie en premier lieu si il y a présence du sigle "JT" en "EI11", si oui, copie la ligne 11 et la colle à la ligne 4, vérifie qu'il n'y a pas d'erreur à la ligne 5 et lance ensuite la fenêtre d'impression.

Je crois que j'aurais dû l'expliquer de cette façon dès le départ, cela me semble plus clair!


Seule la ligne 4 est approuvée => c'est pour approuver ou imprimer ? Dans ta base de données, il faut approuver la ligne 4 ou tu ne peux "appeler" en ligne 4 une ligne (de 8 à 12 dans ton exemple) que si elle a déjà été approuvée ?

La ligne 4 est approuvée parce que c'est la ligne sur laquelle je travaille, cela n'a pas de signification particulière, à terme toute les lignes seront approuvée via la colonne "EI".

Le bouton "Approve" (non-présent dans le fichier que j'ai joint) recherche un code produit dans la colonne "D", s'il trouve le code produit, je détecte la ligne sur laquelle se trouve ce produit, je copie la ligne entière et je la colle sur la ligne 4. J'appose ensuite le sigle "JT" en "EI4" et en "EIx" où "x" est la ligne à laquelle se trouve le code produit. Ce sigle en "EIx" est permanent tant que le produit n'a pas été révisé et permet donc l'impression de la feuille de spécification en question.


On doit imprimer la ligne 4 : on la transfère sur la Sheet2 : comment ? toutes les colonnes ? seulement celles en vert ou seulement celles en blanc ?

La feuille de spécification se construit d'elle-même sur "Sheet 2" via la ligne 4 (en blanc) de "Sheet 1". Sur "Sheet2" se trouve la feuille de spécification à imprimer avec des cellules référant aux valeurs de la ligne 4 de "Sheet1". "Sheet2" a été construit de manière à ce que toutes les informations rentrent sur une page lorsque l'on désire l'imprimer. Il n'y donc pas de plage à spécifier quand on désire imprimer.

La ligne 5 (en vert) sur "Sheet1" quant à elle sert seulement d'indicateur pour s'assurer que tout les paramètres de la ligne 4 respectent certains critères (1=ok, 0=erreur). Cette ligne n'est pas transféré sur "Sheet2".


J'ai déjà produit un fichier similaire, pour un fichier d'élèves, mais avec un fonctionnement différent :
- La base de données (sheet1) masquée => seul ceux qui la modifient y ont accès. Les données sont en ligne.

Pareil ici, seulement la base de données reste visible à l'utilisateur. Cependant, elle n'est pas modifiable par l'utilisateur. Seul un vérificateur approuvé peut modifier la base de donnée via un autre bouton nommé "Revision".


- Une fiche de consultation :
une cellule avec liste en validation (A1). Les cellules devant comporter les renseignements ont des formules de recherche basées sur A1
un bouton permettant l'impression de cette fiche
Le format d'mpression de cette page (mise en page, nom en gras, couleurs, etc) est figé. Les 2 seules actions possibles sont le changement de nom en A1 et l'impression.

Ici au lieu d'utiliser une cellule, j'utilise une InputBox demandant à l'utilisateur le code produit. Les cellules devant comporter les renseignements sont sur la ligne 4 et s'adaptent en fonctions du code produit spécifié par l'utilisateur suite à une recherche dans la base de donnée.

Il y a évidemment ce fameux bouton pour imprimer.

Le format d'impression est fixé sur "Sheet2". La seule action possible par l'utilisateur est l'impression (via le bouton d'impression seulement, qui demande alors quel code produit l'utilisateur désire imprimer).


- Une fiche de création/modification : même format que la fiche précédente, mais le nom peut être cherché à l'aide d'une liste de validation en A1 ou créé en B1
- au changement en A1, une macro va chercher les données déjà inscrites et renseigne la fiche

Je ne suis pas sur d'avoir saisi cette partie mais pour ce qui est de la recherche dans la base de données, l'utilisateur pourra utiliser un système d'auto-filtre pour trouver un produit avec certaines spécification.


- au changement en B1, une macro va vérifié qu'il n'existe pas. dans le cas contraire, il renseigne A1 et supprime B1
2 boutons :
suppression => après messages d'avertissement supprime la ligne de la feuille base de données qui correspond à A1
Modification : A1 vide => crée une nouvelle ligne en BdD suivant B1 avec tous les champs
A1 renseigné => recherche la valeur de A1 dans la BdD et renseigne tous les champs (qu'ils aient été modifiés ou non)

Ces actions se font via un autre bouton nommé "Revision". Ce dernier permet à certains utilisateur de crée/écraser des valeurs dans la base de données. Dans le cas où l'utilisateur crée une nouvelle ligne (checkbox avec deux choix, soit créer soit réviser), excel demande à partir de quel code produit il veut créer la nouvelle ligne (la plupart du temps, ce n'est qu'un seul paramètre que l'on change, du coup on utilise un code produit le plus semblable à ce que nous désirons créer), et copie ensuite les spécifications de ce code produit sur la ligne 4. L'utilisateur peut ensuite sauvegarder cette ligne sous un nouveau nom de code produit. Dans le cas d'une révision, la ligne du code produit est écrasé et on ajoute 1 à la colonne "Revision". Mais bref, je ne rentrerais pas dans les détails puisque ce n'est pas la question ici.


Voilà j'espère n'avoir rien manqué,
Merci encore mille et une fois pour votre aide!
Si j'étais en France, je ne manquerai pas de vous inviter prendre l’apéro haha!
Un jour peut-être qui sait ;)
 

job75

XLDnaute Barbatruc
Re : Imprimer via un bouton de commande SEULEMENT

Bonjour klm1234, salut Gorfael,

Je n'ai pas cherché à comprendre vos explications, un peu compliquées.

Je me suis limité à faire imprimer seulement à partir du bouton.

Dans ThisWorkbook :

Code:
Private Sub Workbook_Activate()
Application.CommandBars(1).Controls(1).Visible = False
Application.OnKey "^p", ""
End Sub

Private Sub Workbook_Deactivate()
Application.CommandBars(1).Controls(1).Visible = True
Application.OnKey "^p"
End Sub

Dans le code de Sheet1 :

Code:
Private Sub CommandButton2_Click()
Dim code$, lig
1 code = InputBox("Product code :", "Printing specifications")
If code = "" Then Exit Sub
lig = Application.Match(code, Range("D8:D65536"), 0)
If IsError(lig) Then GoTo 1
If Cells(7 + lig, "EI") <> "JT" Then MsgBox "Non approved product !", 48: Exit Sub
Sheets("Sheet2").PrintOut
End Sub

Pour obtenir l'impression, sélectionner un code produit et copier le code dans la barre de formule.

Ensuite le coller par Ctrl+V dans l'InputBox.

Le produit doit être approuvé ("JT" en colonne EI).

Nota 1 : on pourrait améliorer avec un USF + ComboBox à la place de l'InputBox.

Nota 2 : les macros doivent bien sûr être activées. Pour obliger l'utilisateur à le faire, voyez par exemple ce fil :

https://www.excel-downloads.com/threads/mot-de-passe-sur-onglet-excel.139673/

A+
 

Pièces jointes

  • PSSTest(1).zip
    18.2 KB · Affichages: 104

klm1234

XLDnaute Nouveau
Re : Imprimer via un bouton de commande SEULEMENT

Bonjour tout le monde!

Sympa le petit message Job75 ;)

Sa marche impec! Juste deux-trois petits trucs qui m'échappent...

1- Si j'ai bien compris, la partie dans "ThisWorkBook" supprime le premier onglet, seulement si on veut sauvegarder, on est obliger de passer par Ctrl+S et/ou le petit bouton dans la barre d'outil ? De plus, je peux toujours imprimer via le bouton "Imprimer" de la barre d'outil :confused:

2- Lig... est une variable?

3- Est-il possible au lieu de lancer l'impression directe de faire apparaître la fenêtre permettant de sélectionner les différentes imprimante? (dans le but par exemple de sélectionner un créateur de .pdf)


Merci beaucoup encore une fois!
 

job75

XLDnaute Barbatruc
Re : Imprimer via un bouton de commande SEULEMENT

Bonjour klm1234, le forum,

Oui j'avais oublié de neutraliser le bouton Imprimer de la barre d'outils Standard.

Voir donc le fichier (2).

Mais il y a une méthode bien plus simple pour neutraliser les commandes d'impression.

Dans ThisWorkbook :

Code:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
[COLOR="Red"]If flag Then Exit Sub[/COLOR]
Cancel = True 'annule l'impression
End Sub

Dans le code de Sheet1 :

Code:
Private Sub CommandButton2_Click()
Imprimer
End Sub

Dans le Module1 :

Code:
[COLOR="red"]Public flag As Boolean[/COLOR] 'mémorise la variable

Sub Imprimer()
Dim code$, lig
1 code = InputBox("Product code :", "Printing specifications")
If code = "" Then Exit Sub
lig = Application.Match(code, Range("D8:D65536"), 0)
If IsError(lig) Then GoTo 1
If Cells(7 + lig, "EI") <> "JT" Then MsgBox "Non approved product !", 48: Exit Sub
If Not Application.Dialogs(xlDialogPrinterSetup).Show Then Exit Sub 'choix de l'imprimante
Application.ScreenUpdating = False
On Error Resume Next
[COLOR="red"]flag = True[/COLOR]
Sheets("Sheet2").PrintOut
[COLOR="red"]flag = False[/COLOR]
End Sub

Voir le fichier (3).

Nota : lig est une variable de type Variant (valeur numérique ou valeur d'erreur).

A+
 

Pièces jointes

  • PSSTest(2).zip
    18.6 KB · Affichages: 73
  • PSSTest(3).zip
    19.3 KB · Affichages: 66

job75

XLDnaute Barbatruc
Re : Imprimer via un bouton de commande SEULEMENT

Re,

Juste une petite amélioration pendant qu'on y est.

Le Product Code de la ligne sélectionnée est entré directement dans l'InputBox :

Code:
1 code = InputBox("Product code :", "Printing specifications"[COLOR="Red"], IIf(ActiveCell.Row > 7, Cells(ActiveCell.Row, "D"), "")[/COLOR])

A+
 

Pièces jointes

  • PSSTest(4).zip
    19.6 KB · Affichages: 81

job75

XLDnaute Barbatruc
Re : Imprimer via un bouton de commande SEULEMENT

Re,

Un peu pour le fun, une solution qui permet de se passer du bouton "Print" :

Code:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If flag Then Exit Sub
Cancel = True 'annule l'impression
[COLOR="Red"]Application.OnTime Now, "Imprimer"[/COLOR]
End Sub

Fichier (5) joint.

A+
 

Pièces jointes

  • PSSTest(5).zip
    17.7 KB · Affichages: 109

klm1234

XLDnaute Nouveau
Re : Imprimer via un bouton de commande SEULEMENT

Waouww!

Magnifique, merci infiniment! Sympa la dernière solution, sans bouton ;)
Ma foi ceci clôt le topic!

Puis-je par contre te demander de m'expliquer la programmation du module? Je connais la base en vba, mais les trucs un peu plus abstrait m'échappent totalement... le signe "$" après la variable "code" signifie quoi?

Pourquoi avoir mit un "1" avant la définition de la variable "code"?
Edit : je viens de comprendre, c'est un repère dans le code c'est sa? Utile à la fonction GoTo si je ne me trompe pas...

La fonction application.match renvoie-t-elle la valeur d'une ligne?

Et là... je t'ai tout simplement perdu haha!
Code:
If Not Application.Dialogs(xlDialogPrinterSetup).Show Then Exit Sub 'choix de l'imprimante
Application.ScreenUpdating = False
On Error Resume Next


Merci encore pour le temps que tu as passé sur mon problème, c'est énormément apprécié!
 

job75

XLDnaute Barbatruc
Re : Imprimer via un bouton de commande SEULEMENT

Bonjour klm1234,

...le signe "$" après la variable "code" signifie quoi?

déclare la varible As String

Code:
La fonction application.match renvoie-t-elle la valeur d'une ligne?

oui si la valeur recherchée est trouvée, sinon renvoie #N/A (équivalent dans une feuille de calcul de EQUIV - MATCH en anglais - voir l'aide Excel).

Code:
If Not Application.Dialogs(xlDialogPrinterSetup).Show Then Exit Sub 'choix de l'imprimante
Application.ScreenUpdating = False
On Error Resume Next

1ère ligne : si l'on clique sur "Annuler" ("Cancel") la boîte de dialogue renvoie False => on sort de la macro.

2ème ligne : fige l'écran et évite l'apparition (fugitive) de la feuille imprimée.

3ème ligne : sur mon ordi on peut choisir comme imprimante "Microsoft Office Image Writer".

Dans ce cas il faut "Enregistrer sous" et si on ne le fait pas, la ligne suivante de la macro - .PrintOut - crée un bug...

A+
 

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 668
Messages
2 090 739
Membres
104 643
dernier inscrit
adriano22