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

sebbbbb

XLDnaute Occasionnel
bonsoir Soan
je n'avais pas de MAJ a effectuer sur excel et le diagnocti n'a rien révélé.
le sujet est résolu...grâce a toi et a kiki29 que je n'oublie pas
merci merci
 

soan

XLDnaute Impliqué
Bonjour sebbbbb,

J'ai bien vu ton post #61 ; c'est parfait que ton Office 2007 soit à jour,
et sans défaut de fonctionnement. :)

Merci d'avoir passé ce sujet en résolu, et peut-être à bientôt pour
un nouvel exercice Excel ? ;)

soan
 

soan

XLDnaute Impliqué
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 Occasionnel
Bonjour sebbbbb,

J'ai bien vu ton post #61 ; c'est parfait que ton Office 2007 soit à jour,
et sans défaut de fonctionnement. :)

Merci d'avoir passé ce sujet en résolu, et peut-être à bientôt pour
un nouvel exercice Excel ? ;)

soan
Bjr
Je n en doute pas. Toujours dans la continuite de cet exercice (j ai deja qq idees )
Merci
 

sebbbbb

XLDnaute Occasionnel
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 Impliqué
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 Impliqué
@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 Occasionnel
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 Occasionnel
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 Impliqué
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:

sebbbbb

XLDnaute Occasionnel
Une derniere question stp ?
Est il obligatoire que les noms des feuilles (dans propriete vba) commence par sh ou elles peuvent rester telle quelle ?

Merci
Seb
 

soan

XLDnaute Impliqué
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
 

soan

XLDnaute Impliqué
Pour ma part : autoformation sur VBA, suite à auto-apprentissage des langages
BASIC, BASICA, TURBOPASCAL (excellent pour apprendre les principes de la
programmation structurée, avec en plus : déclaration obligatoire des variables)
.

soan
 

soan

XLDnaute Impliqué
Ajout : pour VBA, je me rappelle que j'avais commencé
avec Excel version 5.0b ; c'était y'a des lustres, lolll ! :p

soan
 

kiki29

XLDnaute Barbatruc
Re, autodidacte depuis plus de 40 ans, sur Basic Applesoft, Pascal UCSD,Turbo Pascal, VB6, VBA, C, Delphi.Tout cela pendant mes loisirs en France ( 1 mois sur 3 ) et certaines fois pendant mon boulot d'observeur à l'étranger. Puis puisqu'il fallait un diplôme une formation pendant 1 an (B+2) au CESI de Nantes.
 
Dernière édition:

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas