XL 2010 code vba pour imprimer le nbr de pages indiquées d'onglets sélectionnés

sebbbbb

XLDnaute Impliqué
Bonsoir a toutes et tous

je bute sur un problème que j'aimerai vous soumettre.

Dans le 1er onglet du fichier en pJ se trouve un petit tableau pour indiquer quel onglet (sur les 5 au total) sera imprimé et le nbr de copie de chacun

un bouton devra pouvoir lancer l'impression

le top du top serait de lancer l'impression en mode 'copies NON assemblées

Pouvez vous m'aider svp ?

un grand merci par avance
seb
 

Pièces jointes

  • Classeur3.xlsm
    107.2 KB · Affichages: 69
Solution
??? moi aussi, j'ai Excel 2007, avec le bouton raccourci dont tu parles pour ajouter
une feuille (Maj F11) ; mais ce n'est pas pour autant que ça me crée une feuille
fantôme de nom "" ! quand j'exécute la macro qui affiche le nom des feuilles,
ça se termine bien avec la dernière feuille réelle "SWB service1" ; ça ne m'affiche
pas une fausse feuille supplémentaire "" ! là, je ne sais pas comment expliquer
cette différence de comportement (peut-être que c'est lié à une des options
d'Excel ? si oui, je ne vois vraiment pas laquelle !)
; et-tu bien sûr que tu n'as pas
de virus sur ton PC ? sinon, maintenant que la cause du plantage est connue,
le remède est simple ; mets la boucle For I ... Next I comme ceci ...

soan

XLDnaute Barbatruc
Inactif
Re,

J'ai téléchargé le fichier de sebbbbb, du post #26 ; à l'ouverture du fichier,
puis à la fermeture de ce fichier, il y a ce même message d'erreur :

Image 1.jpg


Quand j'ai voulu voir le code VBA (et aussi la liste
des feuilles dans la fenêtre de projet)
:

Image 2.jpg


@fanch55 : désolé, tu avais raison, il y a bien un mot de passe !
et je suis entièrement d'accord avec toi : c'est plutôt frustrant !

@sebbbbb : même si ton problème est réglé, pourrais-tu nous
indiquer le mot de passe ? on aimerait ouvrir ton fichier ! :p

moi, perso, je voulais vérifier si je voyais une feuille 'fantôme'
nommée "" ; voir si je pouvais comprendre d'où ça vient ; et
peut-être arriver à réparer cette anomalie. ;)

(je dis bien peut-être, hein ? c'est sans aucune garantie !)


soan
 

sebbbbb

XLDnaute Impliqué
Bonjour
le chieur est de retour ;)
Tu vois je n'ai pas attendu longtemps avant de te solliciter à nouveau :)

en fait ton scrip me plait tellement que j'essaye de l'adapter à un autre jeu d'onglets (tjrs dans le même fichier). Forcément çà bug un moment.

les onglets portent les noms suivants :
BL impr.1
Pack. List1
CMan1
MR1
BL Service1
Plis1
FM1

j'ai essayé d'adapter ton code comme ci-dessous :

1600177920199.png


j'avais pris soin de renommer mon onglets dans l'explorateur de projets (ils se terminent tous par FT) mais visiblement j'ai du oublier qq chose.

1600178026517.png


serait ce trop te demander de jeter un coup d'oeil et me dire ce que tu en penses ?

le scrip se lance sans bug mais j'ai le message userform qui se lance plutot que l'impression
1600178123783.png



merci Soan

Seb
 

soan

XLDnaute Barbatruc
Inactif
Bonjour sebbbbb,

Merci pour avoir indiqué ton mot de passe ; j'ai commencé à regarder le fichier.

Il y a toute une flopée de modules ! en gros, à vue de nez, ça a l'air de faire dans
les 130 modules ! je me demande bien comment tu fais pour t'y retrouver !!!
surtout que le nom des modules est juste du style Module112 ou Module125 !
alors si tu arrives à te rappeler de mémoire quel module contient quoi, je te tire
mon chapeau !!! tu as une mémoire d'éléphant, dis ? avoue, hein, c'est ça ? :p
(il y a 5 modules seulement qui ont un nom un peu plus explicite ; ceux dont
le nom commence par "mod", par exemple "modHelp" et "modProtection")


------------------------------------------------

Il y a ThisWorkbook1 et ThisWorkbook ; bizarrement, ThisWorkbook est vide,
et tout le code habituel avec Workbook_Open() et tutti quanti se trouve dans
ThisWorkbook1 ; j'adore la longueur de ce module : 618 lignes !!! dis-moi,
tu t'entraînes pour battre le record du roman le plus long ? :D (c'est encore
heureux que tes 130 autres modules ne soient pas aussi longs ! mais c'est
peut-être des romans inachevés, que tu prévois de continuer plus tard ?)


------------------------------------------------

Dans la liste des feuilles de la fenêtre de projets, il y a toute une flopée de feuilles !

Pour une feuille normale, comme par exemple « Feuil671 (Sof Airbus) », on voit
à gauche le .CodeName ; et à droite, entre parenthèses, il y a le (.Name) ; si on
sélectionne Feuil671, dans la fenêtre Propriétés, on voit : « Feuil671 Worksheet ».

Alors ceci est très amusant : il y a aussi tout un tas de feuilles très sympathiques,
de ce genre : « Feuil80 » ; .CodeName uniquement ; il n'y a pas de (.Name) ; quand
on sélectionne Feuil80, dans la fenêtre Propriétés, on s'attend à y voir « Feuil80
Worksheet », n'est-ce pas ? et qu'y voit-on à la place ? (je vous le donne en mille) ;
on voit que le .CodeName n'est plus « Feuil80 » mais « ThisWorkbook1 » !!!

Intéressant, comme situation ! je ne m'étonne plus si ton classeur Excel se met
à dérailler de temps à autres !


------------------------------------------------

Tu aurais tout de même pu fournir un fichier dont la compilation se fasse
correctement, sans planter ! par exemple, un code de fonction qui est
situé en dehors de Function ... End Function n'est pas particulièrement
recommandé ; ni un « Select Case » sans « End Select ».

Et un code VBA qui fait référence à une feuille inexistante, comme "SSI",
c'est pas mal non plus ! :rolleyes:

Avec tout ça, je me demande comment ça se fait qu'à l'ouverture du fichier,
au lieu de planter brutalement sur une page de code VBA, avec une ligne
en jaune, ça ait quand même réussi à afficher ce message d'erreur :


Image 1.JPG


C'est peut-être dû à une feuille inexistante, que Worksheets() n'arrive pas
à sélectionner ou à utiliser ? ou peut-être à cause d'autre chose ? il y a
tellement d'erreurs dans ce fichier ! :rolleyes: alors, comment savoir ?

D'un autre côté, suite à un plantage, c'est vrai que ça ne peut pas montrer
la page de code VBA quand le projet est protégé par un mot de passe :
la confidentialité d'un code VBA prime sur tout le reste, même si ledit
code VBA est pour le moins bancal ! :p


------------------------------------------------

Comme ceci est drôle ! si on fait une modif et qu'on essaye de sauvegarder,
il y a cette 1ère fenêtre qui apparaît :

Image 2.jpg


et tout un tas d'autres fenêtres à la suite... mais ça ne sauvegarde pas le fichier !
ça non, ça aurait été trop beau de faire une sauvegarde, même si c'est ce qu'on
a demandé ! :p

Si c'était juste à cause d'un raccourci clavier Ctrl s que tu aurais utilisé pour faire
autre chose, je ne dis pas : tu en as tout à fait le droit ! mais ce qui est plutôt
piquant, c'est que ça se produit même quand on clique sur l'icône disquette ! et
parfois, pour mieux simplifier les choses, cette icône disquette est en grisé, donc
inaccessible ! ça va ? les utilisateurs de ton application apprécient l'ergonomie
de ton classeur Excel ? (je n'ose pas te demander quelle est la note d'ergonomie ! :oops:)


------------------------------------------------

Ouf ! pour moi, c'est assez avec ce fichier ! je voulais essayer de trouver une
solution aux mystérieuses feuilles fantômes de nom "", mais là, vraiment,
il y a beaucoup beaucoup beaucoup trop d'anomalies pour mon goût ! :confused:

Rassures-toi : même si je laisse tomber ce fichier, je continue quand même
de t'aider pour le reste, et si c'est dans mes compétences. :)


soan
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
@sebbbbb

Lis d'abord mon post précédent.

Réponse à ton post #67 :

Je te propose ce code VBA :
VB:
Option Explicit

Private Sub Job(chn$)
  Dim Wsh As Worksheet, WshAct As Worksheet
  Dim Ar() As String, s$, Nb&, I&, j&

  Erase Ar: Application.ScreenUpdating = 0
  For Each Wsh In ThisWorkbook.Worksheets
    ReDim Preserve Ar(I)
    If Wsh.Visible = -1 Then
      Ar(I) = Wsh.Name: I = I + 1
    End If
  Next Wsh

  s = ActiveSheet.Name
  If InStr(s, chn) > 0 Then
    Set WshAct = Worksheets(s): j = 11
    For I = 0 To UBound(Ar)
      If Ar(I) <> "" Then
        Set Wsh = Worksheets(Ar(I))
        If WshAct.Range("BS" & j) = Ar(I) Then
          Nb = WshAct.Range("CD" & j)
          If Nb > 0 Then Wsh.PrintOut Copies:=Nb ', Collate:=False
          j = j + 1
        End If
      End If
    Next I
    WshAct.Select
  Else
    MsgBox "Sélectionnez une feuille " & chn & "," & vbCrLf _
      & "puis cliquez sur le bouton Impression.", 64
  End If
End Sub

Sub ImprBLMob()
  Job "BL Mobile"
End Sub

Sub ImprBLImp()
  Job "BL impr"
End Sub
ATTENTION aux affectations de macros :

* le bouton Impression des feuilles du genre « BL Mobile1 »
doit appeler la sub ImprBLMob()

* le bouton Impression des feuilles du genre « BL impr.1 »
doit appeler la sub ImprBLImp()

À te lire pour avoir ton avis. ;)

soan
 

sebbbbb

XLDnaute Impliqué
Bjr

Merci je vais tester.

Pour le reste c est normal que tu n y retrouves pas tes petits car mon fichier est tellement volumineux que j ai du supprimer la moitie des onglets pour pouvoir l envoyer.

Celui avec seulement thisworkbook est maintenant bcp plus propre
 

sebbbbb

XLDnaute Impliqué
merci Soan

parfait encore une fois !

pour ma culture vba peux tu m'expliquer pourquoi le scrip n'est pas fait de la même façon que pour le précédent.

J'avoue que je suis un peu perdu entre les 2 si si jamais je voulais ajouter un 3e jeu plutot que de te solliciter a nouveau, j'aimerai le faire par moi meme.

aussi est il possible que le dernier script soit fait sur la même trame que l'autre afin que je comprenne les subtilités entre l'un et l'autre et sur quoi je pourrai jouer si je veux refaire la même chose ultérieurement

dans tous les cas merci énormément
tu m'enlèves une belle épine du pied :)
 

soan

XLDnaute Barbatruc
Inactif
Re,

Le script n'est pas fait de la même façon que pour le précédent, et c'est tout à fait volontaire ! ;)

En effet, j'ai compris que tu voulais faire une impression des onglets pour un genre de feuilles,
ou pour un autre (par exemple pour "BL Mobile1", ou pour "BL impr.1") ; or entre tes 2 subs,
il n'y a que très peu de différences :

* chaîne de texte à chercher dans le nom de la feuille active : "BL Mobile" ou "BL impr"

* message affiché en cas de feuille erronée : "Sélectionnez une feuille BL Mobile..." ou
"Sélectionnez une feuille BL impr..."

Il suffit donc d'écrire une seule fois la sub, en la paramétrant correctement : c'est la sub Job() ;
puis d'y faire appel pour chaque type de feuille ; ainsi :

* Job "BL Mobile" appelle la sub Job() en lui transmettant le nom "BL Mobile" ; ce nom va
dans la variable chn$ ; puis chn (= "BL Mobile") est cherché dans le nom de la feuille
active.

* Job "BL impr" appelle la sub Job() en lui transmettant le nom "BL impr" ; ce nom va
dans la variable chn$ ; puis chn (= "BL impr") est cherché dans le nom de la feuille
active.

En cas de feuille erronée, le message affiché est soit "Sélectionnez une feuille BL Mobile",
soit "Sélectionnez une feuille BL impr".


-----------------------------------------------------

Petite analogie avec les mathématiques : c'est comme de factoriser une expression ;
au lieu de « (3 × a) + (2 × a) = 20 », on peut écrire : « 5a = 20 » ; et si tu as bien
suivi, a = 20 / 5 = 4 ; oui, bravo ! c'est ça ! tu as trouvé la solution de l'équation !


-----------------------------------------------------

Donc si tu as « un 3ème jeu », en clair « un besoin d'impression d'onglets pour
un autre genre de feuille, tel que par exemple "BL Service" » :

* inutile de réécrire tout le travail de la sub d'impression, puisqu'il est dans Job()

* il suffit d'ajouter cette nouvelle sub :

VB:
Sub ImprBLService()
  Job "BL Service"
End Sub
(je sais bien que pour un grand écrivain comme toi qui aime écrire de longs romans,
c'est plutôt difficile à concevoir de devoir écrire une sub aussi courte, mais bon ! :rolleyes:)

* et le bouton Impression des feuilles du genre « BL Service1 » doit appeler
la sub ImprBLService()

du coup, rebelotte :

* Job "BL Service" appelle la sub Job() en lui transmettant le nom "BL Service" ; ce nom va
dans la variable chn$ ; puis chn (= "BL Service") est cherché dans le nom de la feuille
active.

* en cas de feuille erronée, le message affiché est "Sélectionnez une feuille BL Service..."


-----------------------------------------------------

Tu as écrit :

« aussi est-il possible que le dernier script soit fait sur la même trame que l'autre ? »

Vu les explications que j'ai données plus haut, je ne pense pas que ce soit judicieux
de remettre le script comme il était fait avant ; mais bon, si tu y tiens vraiment,
rien ne t'en empêche, hein ? ;):p

soan
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Non, ce n'est pas obligatoire ; par exemple, pour la feuille qui a le Name "BL Mobile1",
et dont le CodeName est "shBL1", tu peux mettre le CodeName "BLM1" ; attention :
dans un CodeName, tu ne peux pas mettre n'importe quel caractère ! entre autres,
l'espace est interdit, mais tu peux mettre à la place le caractère souligné :
"BL_M1" ; d'autres caractères sont interdits ; si tu en mets, ça les refusera.

soan
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 926
Membres
101 842
dernier inscrit
seb0390