Zones d'impression VBA

Bonjour,

J'ai un fichier avec une Macro VBA zone d''impression qui n'est pas au point. Elle me délimite bien la zone d'impression en fonction de la dernière cellule active. Problème j'intègre une image en première page à coté de mes données. et du coup si je n'ai pas beaucoup de données l'image est coupée. Je souhaite systématiquement que la 1er page s'imprime entièrement et que la deuxième s'imprime si il y a des données dans l'une d'elles.

Je ne sais pas comment coder cela? je vous joint mon fichier en cours de travaux. La feuille en questions est Rapport

Merci de votre aide

23rapport-travaux.xlsm (104.30 Ko)

bonjour Bioval,

Sub Impression()
     With Sheets("Rapport")
          .Range("F5:F1000").Name = "Colonne_F"     'cette partie de la colonne F de "rapport"
          x = [max(if(len(colonne_F)>0,row(colonne_F)))]     'derniere cellule F non-vide dans cette plage
          .PageSetup.PrintArea = "A1:L" & x + 4     'il faut encore ajouter les 4 lignes suivantes ???
          .PrintPreview                      '>>>> plus tard vous pouvez supprimer cette ligne
     End With
End Sub

Bonjour,

c'est un bon début,

Le problème est que si par exemple j'ai deux trois données dans la 1er feuille il me coupe a cette endroit. J’intègre forcement une image sur la partie gauche, et du coup elle est coupée. je souhaiterais que systématiquement la 1er page soit imprimée entièrement puis la seconde si mes données arrive en deuxième page.

Je ne sais pas si j'arrive a me faire comprendre

re

bonsoir

controle le topleftcell et le bottomrightcell de ton image
si ca correspond pas
remplace ton pagesetup.printarea par le
range (tonimage.topleftcell,tonimagae.bottomrightcell)

tout simplement

re,

Sub imprime()

     Dim Arr, r, x, HPB

     With Sheets("Rapport")
          .PageSetup.PrintArea = "A1:L300"
          For Each HPB In .HPageBreaks
               If VarType(Arr) = vbEmpty Then ReDim Arr(1 To 1) Else ReDim Preserve Arr(1 To UBound(Arr) + 1)
               Arr(UBound(Arr)) = HPB.Location.Row
          Next
          ReDim Preserve Arr(1 To UBound(Arr) + 1)
          Arr(UBound(Arr)) = Arr(UBound(Arr) - 1) + 50

          .Range("F5:F300").Name = "Colonne_F"     'cette partie de la colonne F de "rapport"
          x = [max(if(len(colonne_F)>0,row(colonne_F)))]     'derniere cellule F non-vide dans cette plage
          r = Application.Match(x, Arr, 1)
          If Arr(r) < x Then r = r + 1
          .PageSetup.PrintArea = "A1:L" & Arr(r) - 1   'il faut encore ajouter les 4 lignes suivantes ???
          .PrintPreview                      '>>>> plus tard vous pouvez supprimer cette ligne
        Application.Dialogs(xlDialogPrint).Show , , , 1
     End With

End Sub

re

Bonjour

finalement ca n'a pas vraiment quelque chose a voir avec ton image mais plustot les pages remplies ou non
dans ce cas là c'est simple tu n'imprime que les pages remplies(en contrôlant la colonne "F")

 .PrintOut From:=1, To:=X ' x etant l'index de derniere page à imprimer 

tu laisse tes paramètres de printarea comme ils sont

donc

Sub ImprimerVpat()
    Dim X&, HpB, ligne&, i&
    X = 1
    With Sheets("Rapport")
        .PageSetup.PrintArea = "A1:L300"
        For i = 1 To .HPageBreaks.Count
            ligne = .HPageBreaks(i).Location.Row
            If .Cells(ligne, "F").Text <> "" Then X = X + 1
        Next
           .PrintOut From:=1, To:=X, Copies:=1, Collate:=True, IgnorePrintAreas:=False
    End With
End Sub

oui c'est ça j'aimerais imprimer la page 1 seulement si F5 non vide et les deux pages si F89 non vide.

Je n'aurais jamais plus de deux page a imprimer.

Je n'arrive pas a faire fonctionner votre macro.

12rapport-travaux.xlsm (157.18 Ko)

re,

fichier avec les 2 macros proposées

Génial!! çà marche comme je le souhaite . Merci a tous!

Il me reste juste mon problème avec l'export de CSV et mon fichier sera impeccable!! je vous joint le lien si vous avez des idées!

https://forum.excel-pratique.com/excel/exportation-feuille-en-csv-parametrable-190590

En tous cas merci

re

perso je trouve que si l'on cherche un peu plus loin on trouve une solution pour le pdf (1 ou 2 pages) de la même manière que pour
ma version de l'impression

From:=1, To:=x

de cette manière
a° tu ne touche pas à ta mise en page
b° tu ne touche pas au printarea

te reste plus qu'a adapter le chemin de destination du pdf

'patricktoulon
Sub ImprimerVpat()
    Dim x&, HPB, ligne&, i&
    x = 1
    With Sheets("Rapport")
        .PageSetup.PrintArea = "A1:L150"
        For i = 1 To .HPageBreaks.Count
            ligne = .HPageBreaks(i).Location.Row
            If .Cells(ligne, "F").Text <> "" Then x = x + 1
        Next
        .PrintOut From:=1, To:=x, Copies:=1, Collate:=True, IgnorePrintAreas:=False
        .PrintPreview                      'attention, le prview montre tous les pages, le printout imprime les premiers x
    End With
End Sub

'patricktoulon
Sub regToPdf_Vpat()
    Dim chemin$
    chemin = ThisWorkbook.Path & "\monfichier.pdf"
    Dim x&, HPB, ligne&, i&
    x = 1
    With Sheets("Rapport")
        .PageSetup.PrintArea = "A1:L150"
        For i = 1 To .HPageBreaks.Count
            ligne = .HPageBreaks(i).Location.Row
            If .Cells(ligne, "F").Text <> "" Then x = x + 1
        Next
        .ExportAsFixedFormat Type:=xlTypePDF, Filename:=chemin, Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                             IgnorePrintAreas:=False, From:=1, To:=x, OpenAfterPublish:=False
    End With
End Sub

c'est bien quand les choses sont simple
ca devient plus facile

Rechercher des sujets similaires à "zones impression vba"