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 + 2

par

col = col + 4

Resize 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 + 2

par

col = col + 4

Resize 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 !

Rechercher des sujets similaires à "imprimer colonnes series"