Imprimer 3 colonnes sur 2 séries de 3 colonnes
Bonjour tout le monde.
Pour faire simple, j'ai créé une macro pour exporter un tableau qui peut contenir plusieurs centaines de lignes sur 2 ou 3 colonnes (mettons A1/C2500 ou A1/C2500 par exemple).
Si j'imprime ces 3 colonnes en mode portrait, elles occupent tout juste la moitié de la page et nécessitent plusieurs dizaines de pages. En mode paysage, elles n'occupent qu'un tiers ou un quart de la page et nécessite bien évidemment encore plus de page.
Je souhaiterais trouver une solution pour que ces colonnes s'impriment automatiquement dans le format que je souhaite.
J'ai besoin de trouver une solution pour mettre par exemple 3 colonnes sur 6,9 ou 12 colonnes par page et pour faire en sorte bien entendu que les colonnes qui s'affichent sur une page se suivent.
Dans le meilleur des mondes, il faudrait que les entêtes de chacune des colonnes se répètent en haut de chacune des nouvelles colonnes.
J'ai créé une petite macro qui vous donnera une petite idée de ce que je recherche. (voir pièce jointe)
Mais cette macro présente de grosses imperfections.
1- elle n'est pas infinie. J'aurais besoin que ma macro continue jusqu'à épuisement des lignes de données
2- elle ne me permet pas de choisir le nombre de lignes par colonne (donc par page)
3- elle ne me permet pas de choisir le nombre de colonnes que je veux mettre par page. Dans mon exemple, j'en ai mis 3x3. Mais j'aurais voulu pouvoir tester facilement et rapidement 4x3, etc.
En gros, j'aurais voulu que la macro me balance au moins 3 questions:
- Quelles sont les colonnes sources à mettre en page (à choisir dans la feuille1)
- Sur combien de colonnes est-ce que je souhaite imprimer mon document (multiple du nombre de colonnes choisies dans la feuille 1)?
- Sur combien de lignes (hors entête) est-ce-que je souhaite imprimer mon document?
Quelqu'un pourrait-il m'aider à améliorer cela? Même si je ne règle pas tous les problèmes du premier coup, l'idée est de progresser vers la solution.
Merci d'avance de vos proposition.
Bonjour,
Voir ce fichier qui traite du même sujet, une mise en page en VBA.
A te relire certainement.
Cdlt.
Jean-Eric a écrit :Bonjour,
Voir ce fichier qui traite du même sujet, une mise en page en VBA.
A te relire certainement.
Cdlt.
Salut Jean Eric,
Effectivement, cela va tout à fait dans le sens de ce que je recherche. Jamais je n'aurais pu rédiger un tel script, et je dois reconnaître que j'ai un peu de mal, non, beaucoup de mal à comprendre le sens global de la démarche. C'est dommage car je ne progresserai sans doute pas cette fois ci.
En revanche, il y a un ou deux points sur lequel il faudrait vraiment que j'arrive à modifier ce script pour qu'il colle à ma contrainte.
1- Saurais-tu m'expliquer comment faire en sorte qu'il prenne 3 colonnes dans feuille 1 au lieu de 2 et pour qu'il me laisse une colonne d'espacement entre les séries de colonnes de la feuille 2. Autre façon de poser la question, mais sans doute moins élégante, on pourrait mettre 4 colonnes en feuille 1, dont une vide...
2- Je ne comprends pas comment il fait pour choisir le nombre de lignes. Apparemment, il change de colonne toutes les 50 lignes, mais en obéissant à quelle règle? Mettons que je veuille en avoir 40 ou 60, comment modifier la chose?
Merci d'avance de ton retour
Wiseman a écrit :Jean-Eric a écrit :Bonjour,
Voir ce fichier qui traite du même sujet, une mise en page en VBA.
A te relire certainement.
Cdlt.
Salut Jean Eric,
Effectivement, cela va tout à fait dans le sens de ce que je recherche. Jamais je n'aurais pu rédiger un tel script, et je dois reconnaître que j'ai un peu de mal, non, beaucoup de mal à comprendre le sens global de la démarche. C'est dommage car je ne progresserai sans doute pas cette fois ci.
En revanche, il y a un ou deux points sur lequel il faudrait vraiment que j'arrive à modifier ce script pour qu'il colle à ma contrainte.
1- Saurais-tu m'expliquer comment faire en sorte qu'il prenne 3 colonnes dans feuille 1 au lieu de 2 et pour qu'il me laisse une colonne d'espacement entre les séries de colonnes de la feuille 2. Autre façon de poser la question, mais sans doute moins élégante, on pourrait mettre 4 colonnes en feuille 1, dont une vide...
2- Je ne comprends pas comment il fait pour choisir le nombre de lignes. Apparemment, il change de colonne toutes les 50 lignes, mais en obéissant à quelle règle? Mettons que je veuille en avoir 40 ou 60, comment modifier la chose?
Merci d'avance de ton retour
Re,
Wiseman a écrit :1- Saurais-tu m'expliquer comment faire en sorte qu'il prenne 3 colonnes dans feuille 1 au lieu de 2 et pour qu'il me laisse une colonne d'espacement entre les séries de colonnes de la feuille 2. Autre façon de poser la question, mais sans doute moins élégante, on pourrait mettre 4 colonnes en feuille 1, dont une vide...
Pour cela il faut changer la ligne
Set Plg = .Range(.Cells(lig, 1), .Cells(lig, 1).Resize(x, 2))par
Set Plg = .Range(.Cells(lig, 1), .Cells(lig, 1).Resize(x, 4))et
col = col + 2par
col = col + 4Resize permet, comme son nom l'indique de redimensionner une plage
Wiseman a écrit :2- Je ne comprends pas comment il fait pour choisir le nombre de lignes. Apparemment, il change de colonne toutes les 50 lignes, mais en obéissant à quelle règle? Mettons que je veuille en avoir 40 ou 60, comment modifier la chose?
Le nombre de ligne par page est calculé en fonction du nombre de lignes total et du nombre de page qu'Excel prévoit d'imprimer
' nombre de lignes par page
x = Application.RoundUp(Dl / Nbp, 0)Calcul qui peut être erroné dans le cas de lignes avec hauteurs différentes
Espérant avoir pu t'éclairer
Sinon Jean-Eric le fera à merveille
Bonjour,
Bonjour BrunoM45,
Je pense que Wiseman a les réponses à ses questions. Il peut donc faire ses essais.
Ci-dessous le lien d'origine pour remettre ma proposition dans le contexte.
https://forum.excel-pratique.com/post255247.html#p255247
(*) Le nombre de ligne par page est calculé en fonction du nombre de lignes total et en fonction de la mise en page de Feuil1.
Le code final:
Option Explicit
Public Sub Mise_en_forme()
' Ctrl+w pour lancer la procédure
Dim Wss As Worksheet, wsd As Worksheet
Dim Dl As Long, Dl1 As Long
Dim lig As Long, col As Integer
Dim Nbp As Long, x As Long
Dim Plg As Range
10 With Application
20 .DisplayAlerts = False
30 .ScreenUpdating = False
40 End With
50 Set Wss = Worksheets("Feuil1")
60 On Error Resume Next
70 Worksheets("Feuil2").Delete
80 On Error GoTo 0
90 Application.DisplayAlerts = True
100 ActiveWorkbook.Worksheets.Add after:=Wss
110 ActiveSheet.Name = "Feuil2"
120 With Wss
' derligne non vide feuil1
130 Dl = .Range("A" & Rows.Count).End(xlUp).Row
' nombre de pages à l'impression
140 Nbp = .PageSetup.Pages.Count
' nombre de lignes par page
150 x = Application.RoundUp(Dl / Nbp, 0)
' derligne non vide feuil2
160 Dl1 = 1
170 col = 1
180 For lig = 1 To Dl Step x
190 Set Plg = .Range(.Cells(lig, 1), .Cells(lig, 1).Resize(x, 2))
200 Plg.Copy Destination:=Cells(Dl1, col)
210 col = col + 2
220 If col = 7 Then ' ( pour 4 colonnes = 9)
230 col = 1
240 Dl1 = Range("A" & Rows.Count).End(xlUp).Row + 1
250 End If
260 Next
270 End With
280 Rows("1:1").Insert
290 Range("A1:F1") = Array("Code", "Prix", "Code", "Prix", "Code", "Prix")
300 With ActiveSheet.PageSetup
310 .PrintTitleRows = "$1:$1"
320 .PrintTitleColumns = ""
330 End With
340 Set Wss = Nothing: Set Plg = Nothing
End Sub
BrunoM45 a écrit :Re,
Wiseman a écrit :1- Saurais-tu m'expliquer comment faire en sorte qu'il prenne 3 colonnes dans feuille 1 au lieu de 2 et pour qu'il me laisse une colonne d'espacement entre les séries de colonnes de la feuille 2. Autre façon de poser la question, mais sans doute moins élégante, on pourrait mettre 4 colonnes en feuille 1, dont une vide...
Pour cela il faut changer la ligne
Set Plg = .Range(.Cells(lig, 1), .Cells(lig, 1).Resize(x, 2))par
Set Plg = .Range(.Cells(lig, 1), .Cells(lig, 1).Resize(x, 4))et
col = col + 2par
col = col + 4Resize permet, comme son nom l'indique de redimensionner une plage
Wiseman a écrit :2- Je ne comprends pas comment il fait pour choisir le nombre de lignes. Apparemment, il change de colonne toutes les 50 lignes, mais en obéissant à quelle règle? Mettons que je veuille en avoir 40 ou 60, comment modifier la chose?
Le nombre de ligne par page est calculé en fonction du nombre de lignes total et du nombre de page qu'Excel prévoit d'imprimer
' nombre de lignes par page x = Application.RoundUp(Dl / Nbp, 0)Calcul qui peut être erroné dans le cas de lignes avec hauteurs différentes
Espérant avoir pu t'éclairer
Sinon Jean-Eric le fera à merveille
Décidément, tu es partout!!!
je vais regarder tout ça. Je mène en ce moment plusieurs petits chantiers, ce qui explique toutes ces questions. Depuis que j'ai découvert le monde de la macro, je me suis pris au jeu et franchement, je ne le regrette pas.
Jean-Eric a écrit :Bonjour,
Bonjour BrunoM45,
Je pense que Wiseman a les réponses à ses questions. Il peut donc faire ses essais.
Ci-dessous le lien d'origine pour remettre ma proposition dans le contexte.
https://forum.excel-pratique.com/post255247.html#p255247
(*) Le nombre de ligne par page est calculé en fonction du nombre de lignes total et en fonction de la mise en page de Feuil1.
Le code final:
Option Explicit Public Sub Mise_en_forme() ' Ctrl+w pour lancer la procédure Dim Wss As Worksheet, wsd As Worksheet Dim Dl As Long, Dl1 As Long Dim lig As Long, col As Integer Dim Nbp As Long, x As Long Dim Plg As Range 10 With Application 20 .DisplayAlerts = False 30 .ScreenUpdating = False 40 End With 50 Set Wss = Worksheets("Feuil1") 60 On Error Resume Next 70 Worksheets("Feuil2").Delete 80 On Error GoTo 0 90 Application.DisplayAlerts = True 100 ActiveWorkbook.Worksheets.Add after:=Wss 110 ActiveSheet.Name = "Feuil2" 120 With Wss ' derligne non vide feuil1 130 Dl = .Range("A" & Rows.Count).End(xlUp).Row ' nombre de pages à l'impression 140 Nbp = .PageSetup.Pages.Count ' nombre de lignes par page 150 x = Application.RoundUp(Dl / Nbp, 0) ' derligne non vide feuil2 160 Dl1 = 1 170 col = 1 180 For lig = 1 To Dl Step x 190 Set Plg = .Range(.Cells(lig, 1), .Cells(lig, 1).Resize(x, 2)) 200 Plg.Copy Destination:=Cells(Dl1, col) 210 col = col + 2 220 If col = 7 Then ' ( pour 4 colonnes = 9) 230 col = 1 240 Dl1 = Range("A" & Rows.Count).End(xlUp).Row + 1 250 End If 260 Next 270 End With 280 Rows("1:1").Insert 290 Range("A1:F1") = Array("Code", "Prix", "Code", "Prix", "Code", "Prix") 300 With ActiveSheet.PageSetup 310 .PrintTitleRows = "$1:$1" 320 .PrintTitleColumns = "" 330 End With 340 Set Wss = Nothing: Set Plg = Nothing End Sub
Merci beaucoup pour ces éclaircissement Jean Eric. Je pense qu'avec toutes ces explications, je devrais y arriver maintenant. Bon WE !