Bonjour,
J'ai des tableaux comportant des données s’étalant sur une ou plusieurs dizaines de colonnes et plusieurs centaine sde lignes.
A partir de ses tableaux, je dois générer des annexes.
C'est en gros un copier-coller avec de la mise en forme (pour une impression lisible).
Toutes les colonnes doivent tenir sur la largeur de la page et les noms des colonnes doivent êtres répétées en début de chaque pages.
On a l'option de choisir A2, A3, portrait, paysage. (cette action est effectuée en amont et fonctionne pour le moment)
Le problème est que j'ai des cellules fusionnées notamment sur la première colonnes que je ne souhaites pas diviser pour l'impression. J'étais partis su ce code
Cela fonctionne, mais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 Sub MiseEnPage() Dim lignetot As Integer, i As Integer, debut As Integer, ligneselec As Integer, n As Integer Dim a As Integer, b As Integer If UserForm8.ComboBox2.Value <> "Zones" Then 'Calcul du nombre de ligne total ET attribution du nombre de cellules à recopier à caque début de pages en fonction du l'onglet (Zones ou Matériels/Résultats) lignetot = Range("A1", Range("A1").End(xlDown)).Rows.Count 'lecteur du nombre de ligne totale ligneselec = 1 'On recopie la 1ère ligne à chaque début de page Else lignetot = Range("B4", Range("B4").End(xlDown)).Rows.Count + 3 'lecteur du nombre de ligne totale feuille zones (différent à cause des fusions) ligneselec = 3 ''On recopie les 3 premières ligne à chaque début de page End If If UserForm8.OptionButton3.Value = True Then 'Prise en compte du nombre de ligne d'une page en fonction de son orientation (portrait/paysage) debut = 50 'nb lignes portrait Else debut = 30 'nb lignes paysages End If i = debut While i < lignetot If Cells(i, 1).Value <> "" Then For n = 1 To ligneselec 'insère 1 ou 3 lignes selon l'onglet Cells(i, 1).EntireRow.Insert Next ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=Rows(i) 'Ajout saut de page Rows("1:" & ligneselec).Select 'Selection les n premières lignes (1 ou 3) Selection.Copy 'les copies Rows(i).Select Rows(i).PasteSpecial 'les colles à la ligne voulue lignetot = lignetot + ligneselec 'on actualise le nombre de ligne totale i = i + debut ' on passe à la fin de feuille suivante Else 'Partie pour Onglet Zones : Pour ne pas séparer une cellules fusionné, on remonte à la cellule fusionné précédente While Cells(i, 1).Value = "" i = i - 1 Wend End If Wend 'PARTIE moins importante pour mon problème If UserForm8.ComboBox2.Value = "Résultats" Then 'Pour l'onglet "Résultats" refusionage de la colone E For i = 2 To lignetot Application.DisplayAlerts = False If Cells(i, 5).Value = Cells(i - 1, 5).Value Then a = i - 1 While Cells(i, 5).Value = Cells(i - 1, 5).Value i = i + 1 Wend i = i - 1 b = i Range(Cells(a, 5), Cells(b, 5)).MergeCells = True Range(Cells(a, 5), Cells(b, 5)).VerticalAlignment = xlCenter End If Application.DisplayAlerts = True Next End If End Sub
Le défaut de ce code est suivant la hauteur des lignes, l'orientation (portrait, paysages) et le format (A3, A4) ; la zone d'impression a variée.
Du coup j'aimerais savoir si il est possible de connaitre le nombre de lignes et le nombre de colonne d'une zone d'impression. et l'attribuer pour ma variable début (pour le nombre de ligne)
Quelqu'un m'a montré l'option "ligne à recopier en haut"
Du coup avec l'enregistreur de macro ça m'a permis de simplifier mon code :
Cette méthode est pratique, pas besoin de copier coller, de saut de pages ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 Sub MiseEnPage() Dim lignetot As Integer, i As Integer, debut As Integer, ligneselec As Integer, n As Integer Dim a As Integer, b As Integer If UserForm8.ComboBox2.Value <> "Zones" Then 'Calcul du nombre de ligne total et attribution du nombre de cellules à recopier à caque début de pages en fonction du l'onglet (Zones ou Matériels/Résultats) lignetot = Range("A1", Range("A1").End(xlDown)).Rows.Count 'lecteur du nombre de ligne totale ligneselec = 1 Else lignetot = Range("B4", Range("B4").End(xlDown)).Rows.Count + 3 'lecteur du nombre de ligne totale feuille zones (différent à cause des fusion) ligneselec = 3 End If If UserForm8.ComboBox2.Value = "Résultats" Then 'Pour l'onglet "Résultats" refusionage de la colone "Système ventilation" Call RefusionResultats(lignetot) End If If ligneselec = 3 Then 'Insère des sauts de page pou éviter de "couper" une cellule fusionnée ' Call SautDePage End If Application.PrintCommunication = False 'Recopie la ou les premières lignes en "virtuel" (juste pou l'impression) With ActiveSheet.PageSetup .PrintTitleRows = "$1:$" & ligneselec .PrintTitleColumns = "" End With Application.PrintCommunication = True End Sub
Par contre elle me coupe mes cellules fusionnées.
Donc si quelqu'un sait comment trouver le nombre de ligne d'une zone d'impression variable, cela me serait bien utile afin que je puisse faire des insertions de saut de pages.
Ou si vous connaissez une méthode différentes
J'espère avoir été explicite, en vous remerciant.
Partager