[EXCEL] Impression d'une zone variable (problème de Range) [Résolu]

Impression d'une zone variable (problème de Range) [Résolu] [EXCEL] - VB/VBA/VBS - Programmation

Marsh Posté le 16-09-2013 à 18:19:20    

Bonjour,
 
Je souhaite imprimer une feuille de résultats.
Problème, en faisant un simple ActiveWindow.SelectedSheets.PrintOut,
ça m'imprime toutes les pages, soit 17, au lieu de 2 pages réelles de résultats par exemple.
Le reste étant des cases de formules qui donnent la valeur "". Donc des pages blanches.
 
N'ayant pas trouvé comment imprimer que les cases visibles,
j'ai tenté en utilisant PrintArea puis Range,
En testant plusieurs syntaxes différentes, j'y arrive toujours pas  :D  
 
 
If Target.Address = "$BO$20:$BO$21" Then
    Sheets("Results" ).Select
    Range("H1:W" & F4).Select
   Selection.PrintOut Copies:=1, Collate:=True
    Sheets("Dalles" ).Select
    Range("BN16" ).Select
End If
 
Le Range me renvoie une erreur 1004... Que j'arrive au mieux à changer en erreur 424  :pt1cable:  
Le "F4" étant la case sur la feuille Results qui renvoie le calcul du nombre de lignes à imprimer.
mais il ne le reconnait visiblement pas.
 
Egalement essayé un "ActiveWindow.SelectedSheets.PrintOut To:=C4, Copies:=1, Collate:=True"; C4 étant le calcul du nombre de pages à imprimer, marche pas non plus  :??:  
 
Comment dois-je faire pour que ça marche ?
Merci.

Message cité 1 fois
Message édité par Bebafo le 17-09-2013 à 15:32:05
Reply

Marsh Posté le 16-09-2013 à 18:19:20   

Reply

Marsh Posté le 16-09-2013 à 19:16:37    

Tu as testé avec cette synthaxe?
 

Citation :

expression.PrintOut(De, À, Exemplaires, Aperçu, ImprimanteActive, ImprimerDansFichier, Assembler, ImprDsNomFichier)
 
expression   Variable qui représente un objet Range.
 
Paramètres
 
Nom Obligatoire/Facultatif Type de données Description  
De Facultatif Variante Numéro de la page à partir de laquelle commence l'impression. Si cet argument est omis, l'impression commence à la première page.  
À Facultatif Variante Numéro de la dernière page à imprimer. Si cet argument est omis, l'impression s'effectue jusqu'à la dernière page.  
Exemplaires Facultatif Variante Nombre de copies à imprimer. Si cet argument est omis, une seule copie est imprimée.  
Aperçu Facultatif Variante True pour que Microsoft Excel affiche un aperçu de l'objet avant de l'imprimer. False (ou omis) pour imprimer l'objet immédiatement.  
ImprimanteActive Facultatif Variante Définit le nom de l'imprimante active.  
ImprimerDansFichier Facultatif Variante True pour imprimer dans un fichier. Si ImprDsNomFichier n'est pas spécifié, Microsoft Excel invite l'utilisateur à entrer le nom du fichier de sortie.  
Assembler Facultatif Variante True pour assembler plusieurs copies.  
ImprDsNomFichier Facultatif Variante Si l'argument ImprimerDansFichier a la valeur True, cet argument spécifie le nom du fichier vers lequel vous souhaitez effectuer l'impression.


 
 
+C4 c'est quoi? C'est ta cellule? Si oui, cells(4,3).value serait plus adapté à moins que je me sois toujours compliqué la vie. :pt1cable:

Reply

Marsh Posté le 16-09-2013 à 19:17:05    

 
             Bonjour,
 

Bebafo a écrit :

Range("H1:W" & F4).Select
Le "F4" étant la case […]


             Eh ben non, grossière erreur de syntaxe ‼
             Tel quel, F4 est une variable, pas une cellule ‼
 
             Avec Option Explicit en début de code, l'erreur aurait été directement signalée car variable non déclarée …
 
             La cellule F4 est définie en VBA par exemple par Range("F4" )
 

Reply

Marsh Posté le 17-09-2013 à 11:39:21    

Bonjour,
 
j'ai encore essayé pas mal de syntaxes suivant vos réponses et d'autres "tips" trouvés sur le net, et je n'y arrive toujours pas  :(  
 
Cells(4,6).value (Le F4 de la feuille Results) me renvoyait toujours 0 (qui est la valeur de F4 mais de la feuille Dalles)
Même en foutant un Worksheet.Select et Worksheet.Activate avant.
Donc j'utilise maintenant Cells(3,58). qui est la même valeur, mais sur la feuille Dalles.
 
Et j'ai toujours l'erreur 1004, malgré une valeur correcte de ImpLine  :fou:  
 

Code :
  1. If Target.Address = "$BO$20:$BO$21" Then
  2.     Dim ImpLine As Integer
  3.    
  4.     ImpLine = Cells(3, 58).Value
  5.    
  6.     Worksheets("Results" ).Range("H1:W" & ImpLine).Select
  7.     Selection.PrintOut Copies:=1, Collate:=True
  8.     Sheets("Dalles" ).Select
  9.     Range("BN16" ).Select
  10. End If


 
 
(Au cas où il y aurait un doute, je suis évidemment Ultra débutant...)


Message édité par Bebafo le 17-09-2013 à 11:53:12
Reply

Marsh Posté le 17-09-2013 à 11:51:48    

 
           La prochaine fois, merci d'utiliser l’icône C dédiée au code …
 
           Si la cellule F4 est à zéro, l'erreur est donc tout à fait normale ‼
           Avant de poursuivre, tu dois vérifier que sa valeur est supérieure à zéro …
 
           Et si la cellule n'est pas dans la feuille active, il faut donc précéder la cellule par sa feuille, bref respecter la hiérarchie d'Excel …
 

Reply

Marsh Posté le 17-09-2013 à 12:00:20    

Marc L a écrit :

 
           Si la cellule F4 est à zéro, l'erreur est donc tout à fait normale ‼
 


Ce pourquoi j'ai changé de syntaxe pour régler ce problème.
Maintenant dans le dernier exemple cité, j'ai bien ImpLine = 51
 
Et pourtant j'ai toujours le message d'erreur 1004.
Je ne comprends pas pourquoi.

Reply

Marsh Posté le 17-09-2013 à 13:39:59    

Target c'est quoi? Je ne connais pas cet objet, ce n'est pas plutôt une variable à laquelle tu es censé affecter une plage de cellules?
Déjà la première erreur vient de là, si tu n'as définit nulle part ce qu'est Target, mon aide vba ne connait pas cet objet.
 
Après tu peux spécifier quelle feuille tu utilises avec Worksheet("Nom de ta feuille" ).
 
ex : ImpLine = Worksheet("blablabla" ).Cells(4, 3).value
 
Déjà teste ça :
 

Code :
  1. Dim ImpLine As Integer
  2. ImpLine = Worksheet("Results" ).Cells(4, 3).value
  3. Worksheets("Results" ).Range(Cells(1, 8):Cells(ImpLine, 23)).Select
  4. Selection.PrintOut(Copies:=1, Collate:=True)


Reply

Marsh Posté le 17-09-2013 à 14:50:28    

Bizarrement, ça ne marche pas. erreur de syntaxe. (il aime pas le ":" )
 
donc j'ai fait  

Code :
  1. ImpLine = Worksheet("Results" ).Cells(4, 3).value
  2. Worksheets("Results" ).Range(Cells(1, 8) & ":" & Cells(ImpLine, 23)).Select
  3. Selection.PrintOut(Copies:=1, Collate:=True)


Mais ça marche pas non plus.
encore plus bizarrement dans ce cas :
la valeur de ImpLine est bonne.
Par contre les valeurs données pour Cells(1, 8) et Cells(ImpLine, 23) correspondent à celles de la feuille Dalles
au lieu de Results.
 
 :heink:  :heink:  
 
PS : Target, ce n'est pas moi qui l'ai créé, c'est l'enregistreur de Macro, qui a donné le code basique que j'ai tenté d'analyser et modifier par la suite, mais cette partie là du code n'a pas été touchée :

Code :
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Reply

Marsh Posté le 17-09-2013 à 15:02:50    

 
           Je confirme pour  Target  tout à fait normal dans un évènement de classeur ou de feuille.
 
           Au passage, souvent dans l'aide du message d'erreur la solution s'y trouve …
 
           La référence seule à une cellule correspond uniquement à une cellule de la feuille active,
           et comme elle ne s'y trouve pas cela déclenche donc une erreur !
 
           Comme la majorité copie du net sans se donner la peine de comprendre, comme le code est partiel,
           j'aimerais bien connaître la globalité de la problématique et la raison d'utiliser un évènement,
           une vision d'ensemble en quelque sorte …
 

Reply

Marsh Posté le 17-09-2013 à 15:31:13    

Marc L a écrit :

 
           Au passage, souvent dans l'aide du message d'erreur la solution s'y trouve …


Ce n'était pas le cas en l'occurrence. Rien d'explicite en tout cas.
 

Marc L a écrit :


           Comme la majorité copie du net sans se donner la peine de comprendre,  
 


Ce qui n'est pas mon cas :)
 
J'avais bien le Worksheets("Results" ).Activate, mais placé avant le Dim ImpLine...
bizarrement il aimait pas.
 
En tout cas, avec beaucoup de difficultés (et d'essais) mais maintenant ça marche !
Je touche plus à rien !
 
Merci bien. :jap:  
 
Le code qui marche, donc :

Code :
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. If Target.Address = "$BO$20:$BO$21" Then
  3.     Dim ImpLine As Integer
  4.    
  5.     ImpLine = Worksheets("Results" ).Cells(4, 6).Value
  6.     Worksheets("Results" ).Activate
  7.     Worksheets("Results" ).Range("H1:W" & ImpLine).Select
  8.     Selection.PrintOut Copies:=1, Collate:=True
  9.     Sheets("Dalles" ).Select
  10.     Range("BN16" ).Select
  11. End If
  12. End Sub

Reply

Marsh Posté le 17-09-2013 à 15:31:13   

Reply

Marsh Posté le 17-09-2013 à 15:45:02    

Bebafo a écrit :

Bizarrement, ça ne marche pas. erreur de syntaxe. (il aime pas le ":" )


 
Hum ce doit être une virgule qu'il faut utiliser.
 
 
Autrement pour le target c'est ok, mais il n'a de sens qu'avec la ligne que tu as omis car autrement il n'y a pas d'écoute d'évènement.
 
 
Tu peux virer ces lignes :
 

Code :
  1. Sheets("Dalles" ).Select
  2.     Range("BN16" ).Select

Reply

Marsh Posté le 17-09-2013 à 15:52:44    

 
           Oui c'était bien la virgule …
 
           Bebafo, ton code fonctionne car tu as pensé à te placer enfin sur la bonne feuille
           (comme les infos du message d'erreur l'entendaient, cela viendra avec l'expérience) …
 
           Maintenant c'est dommage de jouer à coups d'affreux ralentisseurs  Activate  &  Select  souvent sources d'ennuis
           au lieu de directement travailler proprement avec les objets comme par exemple ce code équivalent au tien :
 

Code :
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.     If Target.Address = "$BO$20:$BO$21" Then
  3.         With Worksheets("Results" )
  4.             .Range("H1:W" & .[F4].Value).PrintOut
  5.         End With
  6.     End If
  7. End Sub


            Grâce à la ligne n°3, la ligne n°4 voulant dire
 
            Worksheets("Results" ).Range("H1:W" & Worksheets("Results" ).[F4].Value).PrintOut  …


Message édité par Marc L le 17-09-2013 à 15:59:22
Reply

Marsh Posté le 18-06-2018 à 13:52:32    

Bonjour,
 
J'ai mis le ci-dessus dans mon fichier (dans ThisWorkbook) mais ça fait rien.
Ma plage est A1:H400 alors j'ai remplacé "H1:W" par "A1:H".
"Target.Address", ça correspond à quoi ?
 
Merci.

Reply

Marsh Posté le 18-06-2018 à 15:25:25    

"Target.Adress" est lié à l'évènement "Worksheet_SelectionChange" : https://silkyroad.developpez.com/VB [...] lle/#LII-I
 
La question est plutôt, que cherches-tu à faire ? Le code utilisé ici était très spécifique, et personnellement je ne comprends toujours pas pourquoi la personne utilisait cet évènement.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 18-06-2018 à 16:08:21    

En résumé, voilà ma situation.
J'ai 30 onglets :
- le premier affiche une base de données sur des ventes (vendeur, client, CA, mois...)
- autres onglets correspondent à du texte et des tableaux de synthèse
- le reste correspond à un onglet par vendeur. Ils ont tous la même mise en forme
Chacun de ces onglets a un nombre de lignes différent et en plus, il varie d'un mois à l'autre.
Du coup, je souhaite définir une zone d'impression dynamique. Autant les colonnes ne bougent pas, autant la dernière ligne de la zone d'impression n'est jamais la même.

Reply

Marsh Posté le 18-06-2018 à 17:38:33    

Zone définie par quoi ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 20-06-2018 à 08:54:21    

Pas compris ^^

Reply

Marsh Posté le 20-06-2018 à 11:24:37    

Tes zones d'impression sont délimitées par quels facteurs ?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 20-06-2018 à 14:02:09    

J'ai des formules sur 400 lignes mais seulement une partie affiche quelque chose (selon les cas et selon les mois).
Les délimitations sont donc fixées par la dernière ligne où quelque chose apparaît.

Reply

Marsh Posté le 20-06-2018 à 14:40:44    

Si tu n'as pas de ligne ou colonne vide dans ta zone à imprimer tu peux juste utiliser :

Code :
  1. Range("A1" ).CurrentRegion.PrintOut


 
En remplaçant A1 par la cellule en haut à gauche de ta zone d'impression.
Après faut voir quels onglets tu dois imprimer, quelles options d'impression, si faut utiliser un évènement pour déclencher l'impression.
 
Là tu dis juste que tu veux imprimer des zones d'impression de tailles non définies...
Dons je ne peux pas plus t'en dire qu'il faut utiliser PrintOut pour imprimer et que CurrentRegion permet de définir la plus grande possible sans ligne ou colonne vide.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 20-06-2018 à 16:06:59    

OK, merci.
Je vais regarder ça pour commencer.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed