problème gestion hauteur de ligne aléatoire dans tableau excel VBA

GCFRG

XLDnaute Occasionnel
Bonjour à tous, voici mon problème:

J'ai une feuille dans un tableau que j'alimente via VBA a partir d'une base située dans un autre tableau.
j'inscris donc des lignes de texte dans des cellules dont la largeur est limité. ces lignes étant parfois très longue, un renvoi à la ligne est donc nécessaire. la hauteur de la ligne augmente donc, et la zone d'impression est donc modifiée.
je voudrais tracer un cadre autour de ma feuille et que quelque soit la hauteur de ligne, celui-ci se retrouve toujours dans la zone d'impression, je peux avoir jusqu'à 350 à 400 lignes de renseignées dans cette feuille, et la première est figée.
hauteur par défaut 14
ce qui donne 56 lignes par zone d'impression si pas de renvoi à la ligne dans aucune cellule.
aucun problème pour tracer un cadre via VBA dans ce cas là, mais le problème se corse dés qu'une des lignes changent de hauteur, la partie inférieure du cadre se retrouvant sur la page suivante.

Si quelqu'un à une p'tite idée sur le sujet je suis preneur.

D'avance un grand merci a celui qui m'aidera!
Gilbert
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonsoir GCFRG, René,

Chez moi c'est 52 lignes de hauteur 14 qui donnent un saut de page automatique, ça dépend de l'ordi.

Cette macro créera chez vous les sauts de pages horizontaux adéquats :

Code:
Sub SautDePage()
Dim n, h#, deb As Range, r As Range
n = 56 'nombre de lignes, à adapter
With ActiveSheet
  h = n * .Rows(.Rows.Count).Height 'hauteur de n lignes "standard"
  Set deb = .UsedRange.Rows(1)
  .ResetAllPageBreaks
  For Each r In .UsedRange.Rows
    If .Range(deb, r).Height > h Then
      .HPageBreaks.Add r
      Set deb = r
    End If
  Next
End With
End Sub
Il suffit que la dernière ligne de la feuille ait la hauteur par défaut.

A+
 

GCFRG

XLDnaute Occasionnel
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonjour René et merci pour ta réponse.
je vais tester ton code dans mon classeur, si ça ne colle pas je t'envois un exemple de ce que je veux, car le problème est que je ne sais jamais à l'avance de combien va être la hauteur de la dernière ligne.


Merci encore pour ta diligence!
Gilbert
 
Dernière édition:

laurent950

XLDnaute Accro
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonsoir,

Voici le code pour trouver le nombre de ligne dans une cellule lorsque celles-ci est formaté avec le retour a la ligne par defauft

Code source VBA :
VB:
Sub essai()
htl = 12.75
lgn = ActiveCell.Row
htlgn = Rows(lgn).RowHeight
txt = Cells(lgn, 1)
lg = Len(txt)
 
cpt = 1
 
    For i = 1 To lg
    car = Mid(txt, i, 1)
        If Asc(car) = 10 Then
        cpt = cpt + 1
        End If
    Next i
 
nbl = htlgn / htl
MsgBox "Nombre de lignes dans la cellule = " & nbl & Chr(10) & _
"Dont : " & nbl - cpt & " dûe(s) au format de retour automatique à la ligne" & Chr(10) & _
"Et   : " & cpt & " par insertion d'un saut de ligne"
End Sub
Laurent
 

GCFRG

XLDnaute Occasionnel
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonjour, René, Laurent
je joint un fichier pour exemple, mon soucis est de tracer un cadre dans chaque page, comme dans la première page de mon exemple.
mais comme la hauteur de ligne peut changer à tous moment selon l'élément choisi dans la base, je n'arrive pas à positionner la barre inférieure du cadre sur la dernière ligne dans chaque page.

Voici le code que j'ai écris mais qui n'est pas top!

Code:
Public Sub trace_ligneByGc()
Dim I As Single, Tmp As Single, Tmp2 As Single, Déb As Single, Fin As Integer, Lign As Integer
Dim HliG As Single, HliGRef As Single, HliGTot As Single, LignT As Single, NPage As Single, PageRef As Single
Dim Pag As Integer
With Sheets("minute")



.Range("A1:F1").Borders(xlEdgeTop).LineStyle = xlDouble
.Range("A1:F1").Borders(xlEdgeTop).Weight = xlThick
Déb = 1
Tmp = 0
PageRef = 728
Fin = .Range("A" & .Rows.Count).End(xlUp).Row
HliGRef = 14
.PageSetup.PrintArea = "$a$1:$f" & Fin

For I = Déb To Fin
        HliG = .Cells(I, 1).RowHeight
        HliGTot = HliGTot + HliG
 Next I
 NPage = HliGTot / PageRef
 NPage = Application.WorksheetFunction.RoundUp(NPage, 0)
 Fin = (NPage * PageRef) / HliGRef
 Pag = 1
 HliGTot = 0
 
 Do While Pag < NPage
 'Application.WorksheetFunction.RoundUp(Tmp2, 0)
 For I = Déb To Fin
    HliG = .Cells(I, 1).RowHeight
    HliGTot = HliGTot + HliG
    If HliGTot >= (Pag * PageRef) Then
    Lign = .Cells(I, 1).Row
    Tmp = (HliGTot - (Pag * PageRef)) / HliGRef
    Tmp = Application.WorksheetFunction.RoundUp(Tmp, 0)
    Lign = Lign - Tmp
        If Pag > 1 Then Lign = Lign - 1
            Exit For
        End If
Next I

Select Case Pag
Case 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
.Range("A" & Lign & ":F" & Lign).Borders(xlEdgeBottom).LineStyle = xlDouble
.Range("A" & Lign & ":F" & Lign).Borders(xlEdgeBottom).Weight = xlThick

.Range("A1" & ":A" & Lign).Borders(xlEdgeLeft).LineStyle = xlDouble
.Range("A1" & ":A" & Lign).Borders(xlEdgeLeft).Weight = xlThick

.Range("F1" & ":F" & Lign).Borders(xlEdgeRight).LineStyle = xlDouble
.Range("F1" & ":F" & Lign).Borders(xlEdgeRight).Weight = xlThick
Pag = Pag + 1
Déb = Déb + Lign
End Select
Loop
End With

End Sub

Plusieurs variable ne sont pas utiliser car je n'ai pas cesser de modifier mon code depuis ce matin!
j'ose penser que quelqu'un auras peut-être la solution!
merci à tous ceux qui pourront m'aider

Gilbert
 

Pièces jointes

  • Classeur pour Exemple.xlsx
    15.3 KB · Affichages: 51
  • Classeur pour Exemple.xlsx
    15.3 KB · Affichages: 47
  • Classeur pour Exemple.xlsx
    15.3 KB · Affichages: 57
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonjour GCFRG, à tous,

Un autre essai :
.

  • qui ne nécessite pas la déclaration du nombre de lignes par page
  • avant de lancer la macro, il faut définir la zone d'impression
  • les sauts de pages manuels devraient être pris en compte
  • l'impression est définie avec une seule page en largeur, sans quoi les encadrements risquent ne ne pas être bien imprimés :confused: (pas pu vérifié car je n'ai plus d'imprimante en état de marche :( )
Errata: pour la définition de la zone d’impression, il fallait lire "B4:H78 par exemple" et non pas "B4:B78 par exemple"
 

Pièces jointes

  • GCFRG-encadrement sur saut de page-v2.xlsm
    27.1 KB · Affichages: 51
Dernière édition:

Docmarti

XLDnaute Occasionnel
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonjour GCFRG, le Forum

Voici une méthode qui nécessite ActiveWindow.View = xlPageBreakPreview pour que la mise à jour des sauts de page soit effective.

Ensuite on peut utiliser la collection HPageBreaks.

Cordialement

Docmarti
 

Pièces jointes

  • GCFRG_ExcelDownloads_002.xlsm
    26.4 KB · Affichages: 56

job75

XLDnaute Barbatruc
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonjour à tous,

Avec cette solution les sauts de pages (et les bordures) sont toujours placés avant un titre en gras.

Et l'on évite aussi de diviser la zone des "Montants" :

Code:
Sub EncadrerPage()
Dim n, h#, derlig&, P As Range, deb As Range, r As Range
Dim gras As Range, tot As Range
n = 50 'nombre de lignes, à adapter
With ActiveSheet
  h = n * .Rows(.Rows.Count).Height 'hauteur de n lignes "standard"
  derlig = .[A:G].Find("*", , xlValues, , xlByRows, xlPrevious).Row
  Set P = .Range("A1:G" & derlig)
  .PageSetup.PrintArea = P.Address
  .PageSetup.FitToPagesWide = 1
  .ResetAllPageBreaks
  P.Offset(1).Resize(.Rows.Count - 1).Borders.LineStyle = xlNone 'RAZ
  P.Borders(xlEdgeLeft).LineStyle = xlDouble
  P.Borders(xlEdgeTop).LineStyle = xlDouble
  P.Borders(xlEdgeRight).LineStyle = xlDouble
  P.Borders(xlEdgeBottom).LineStyle = xlDouble
  Set deb = P.Rows(1)
  For Each r In P.Rows
    If r.Cells(1).Font.Bold Then Set gras = r
    If r.Cells(1) = "Montant TTC TVA 10%:" Then Set tot = r
    If .Range(deb, r).Height > h Then
      Set deb = gras
      If Not tot Is Nothing Then If deb.Row < tot.Row + 3 Then Set deb = tot
      .HPageBreaks.Add deb
      deb.Borders(xlEdgeTop).LineStyle = xlDouble
      deb.Borders(xlEdgeTop).Weight = xlThick
    End If
  Next
End With
End Sub
Edit : ajouté la RAZ des bordures.

Fichier joint.

A+
 

Pièces jointes

  • EncadrerPage(1).xlsm
    28 KB · Affichages: 44
Dernière édition:

GCFRG

XLDnaute Occasionnel
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonjour Docmarti

Ton code fonctionne correctement, je l'ai inséré dans mon tableau et çà fonctionnes du feu de dieu:)

Aurais tu une solution pour que le cadre descende jusqu'au bas de la dernière page (quand cette dernière n'est pas entièrement remplie), et non sous la dernière ligne, juste pour la présentation, çà fais plus "fini"...

j'ai juste ajouté " ActiveWindow.View = xlNormalView" a la fin de la macro SautDePage2()

Vraiment un grand merci à toi et à toutes les personnes qui on pris la peine de se pencher sur mon problème!

Gilbert
 
Dernière édition:

Docmarti

XLDnaute Occasionnel
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Pour encadrer la dernière page en continuant à utiliser la localisation des sauts de page, il faut s'assurer d'avoir un saut de page qui soit situé plus bas que la dernière ligne.
Pour que ce saut de page supplémentaire soit créé automatiquement par Excel, il suffit d'ajouter temporairement quelques pages à imprimer dans la valeur PageSetup.PrintArea.

Cordialement

Docmarti
 

Pièces jointes

  • GCFRG_ExcelDownloads_002b002.xlsm
    28.7 KB · Affichages: 41
Dernière édition:

GCFRG

XLDnaute Occasionnel
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonjour Docmarti

C'est exactement ce que je recherchais,

un grand merci pour ton aide, je vais pouvoir avancer maintenant!
Bonne fêtes de fin d'année à tous

Gilbert
 

GCFRG

XLDnaute Occasionnel
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonjour Docmarti, Le forum,

Petit bémol, dans mon tableau original la première ligne est figé, et dès la deuxième page, le cadre passe sous cette dernière, ors il est important que cette ligne soit figé pour une bonne lisibilité, j'ai retourné le problème dans tous les sens, et je bloque, quelqu'un auras peut être une solution.
fichier joint avec 1ère ligne figée et zone d'impression défini.

Merci d'avance

Gilbert
 

Pièces jointes

  • GCFRG_ExcelDownloads_002b002_3.xlsm
    30.5 KB · Affichages: 42

Docmarti

XLDnaute Occasionnel
Re : problème gestion hauteur de ligne aléatoire dans tableau excel VBA

Bonjour Gilbert

Je vois deux façons d'uniformiser la bordure inférieure des titres:

1) Ajouter une bordure inférieure sous la ligne 1. Ainsi il y aurait une bordure sous le titre de toutes les pages.

2) Pour ne pas avoir de bordure sous les titres :
a) Définir PrintTitleRows = "$1:$1" pour déterminer où sont les sauts de pages
b) Insérer une ligne au-dessus de chaque saut de page (en commençant par le dernier) et y copier la ligne 1
c) Définir PrintTitleRows = ""

Docmarti
 

Discussions similaires

Réponses
9
Affichages
451

Statistiques des forums

Discussions
311 711
Messages
2 081 796
Membres
101 817
dernier inscrit
carvajal