Determiner le nombre de ligne d'une zone d'impression variable
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
Code:
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 |
Cela fonctionne, mais
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 :
Code:
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 |
Cette méthode est pratique, pas besoin de copier coller, de saut de pages ...
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.