[VBA] Convertir un tableau structuré en PDF

Bonjour, je continue ma découverte du VBA, et aujourd'hui je souhaiterais convertir un tableau structuré de mon fichier excel en PDF.

Ce tableau se nomme TS_ipam

Pour le remplissage et la conversion, je passe par un formulaire qui se valide une fois rempli par le bouton create_ipam.

Je souhaiterai que le nom du fichier soit "[Date du jour au format 20221115] - Ajout de bulles techniques dans l'IPAM et hybridation", et que le fichier s'enregistre à cet endroit C:\Users\XXXXXXXX\Downloads (là où réside la petite subtilité c'est que le XXXXXXX est le login du user (différent en fonction de qui lancera la macro, celui ci peut il être récupérer par la macro?)

Enfin, le format de ce PDF doit être en paysage.

Je reste bien entendu à l'écoute de toute proposition.

Excellente journée

Bruno

Bonjour,

Peut-être ainsi :

Sub Impr_TS_Pdf()
Dim Le_Nom As String, Le_Path As String
Le_Nom = Format(Date, "yyyymmdd") & " - Ajout de bulles techniques dans l'IPAM et hybridation"
Le_Path = "C:\Users\" & Environ("UserName") & "\Downloads\"
Range("TS_ipam[#All]").Select 'Rajout pour bien sélectionner l'onglet
With ActiveSheet
    With .PageSetup
        .PrintArea = Range("TS_ipam[#All]").Address 'zone d'impression
        .CenterHorizontally = True 'centrer horizontalement
        .Orientation = xlLandscape 'impression paysage
        .FitToPagesWide = 1 '1 page de largeur
    End With
    .Range(.PageSetup.PrintArea).ExportAsFixedFormat Type:=xlTypePDF, Filename:=Le_Path & Le_Nom, OpenAfterPublish:=True 'si tu veux ouvrir le fichier
End With
End Sub

Bonne apm (et bon courage)

Edit : Attention, il faut pour cela que l'onglet contenant le TS est bien actif

Pour en être sûr, rajoute la ligne .Select

Salut à toi Cousinhub, super pour le code, juste un souci, il me met en pdf la feuille active...

et non pas celle où se trouve mon TS_ipam, une idée?

Re-,

Je viens de rajouter un Edit..

Mais avec ce code, il n'y aura plus de sélection :

Sub Impr_TS_Pdf2()
Dim Le_Nom As String, Le_Path As String
Dim Sh As Worksheet
Le_Nom = Format(Date, "yyyymmdd") & " - Ajout de bulles techniques dans l'IPAM et hybridation"
Le_Path = "C:\Users\" & Environ("UserName") & "\Downloads\"
Set Sh = Sheets(Range("TS_ipam[#All]").Parent.Name)
With Sh
    With .PageSetup
        .PrintArea = Range("TS_ipam[#All]").Address 'zone d'impression
        .CenterHorizontally = True 'centrer horizontalement
        .Orientation = xlLandscape 'impression paysage
        .FitToPagesWide = 1 '1 page de largeur
    End With
    .Range(.PageSetup.PrintArea).ExportAsFixedFormat Type:=xlTypePDF, Filename:=Le_Path & Le_Nom, OpenAfterPublish:=True
End With
End Sub

J'ai bien vu ta remarque mais du coup peut on forcer l'export d'une feuille même si pas active? (pour compléter ma question précédente)

Fait

.Range(.PageSetup.PrintArea).ExportAsFixedFormat Type:=xlTypePDF, Filename:=Le_Path & Le_Nom, OpenAfterPublish:=True

Il me demande de debogger à cette ligne

Tu as bien pris mon dernier code?

ça marchait avec le 1er? (même si c'était l'onglet actif?)

Oui le premier fonctionnait cousinhub, le second j'ai bien regardé pour moi je le copie sans erreur.

Etrange il s'agit de la même ligne

je retente...

Dans le ruban "Formules", "Gestionnaire de noms", est-ce que tu as quelque chose comme ça? (image issue de mon fichier d'essai, et le code avait été déroulé à partir de l'autre onglet, sans pb...)

image

Il fonctionne! Va comprendre. Cependant il n'adapte pas une page sur une...

RE-,

Non, c'est pas prévu..

Juste sur 1 page en largeur

Ajuster à 1 seule page peut amener à réduire tellement que c'en est illisible, si tu as plusieurs dizaines (centaines) de lignes

Si tu le veux quand même, rajoute cette ligne à la place de .FitToPagesWide

.FitToPagesTall = 1

J'aurai au maximum par ajout de bulles techniques 8 lignes pour 11 colonnes, je teste et je clôture si tout est ok.

Un immense merci!

Amicalement

Tjs pas ajuster une sur une...

En parallèle, si je veux vider mon TS_Ipam avant chaque nouvelle insertion (ligne 4 à 50, bien que max 8 seront remplies à chaque export), j'ai ajouter cette ligne

Mais je ne pense pas que la syntaxe soit la bonne.

Rows("4:100").Delete

Re-,

Sinon, l'enregistreur peut t'aider pour l'ajustement...

Et pour vider ton TS, privilégie cette méthode :

Range("TS_ipam").ListObject.DataBodyRange.Delete

L'enregistreur?

Désolé la tu m'as perdu

J'ai réussi en utilisant les options de mise en page du classeur

Merci cousinhub

Au top comme à chaque fois

L'enregistreur?

Désolé la tu m'as perdu

Tu sais, tout en bas, tu as un bouton comme ça : (S'il n’apparaît pas, c'est que le ruban "Développeur" n'est pas présent, il faut l'afficher "Fichier/Options/Personnaliser le ruban", et à droite, valider "Développeur")

image

Quand tu appuies dessus, il enregistre tout ce que tu fais dans ton classeur, et dès que tu ré appuies, il arrête l'enregistrement, et le code généré est visible dans l'éditeur VBE...

C'est hyper pratique, et normalement, on commence comme ça..

Après, il faut dire que le code généré n'est pas le plus optimisé qui soit, mais en trifouillant, bidouillant, essayant, on arrive à en tirer kekchose...

Bonne découverte

Merci pour tes conseils

Rechercher des sujets similaires à "vba convertir tableau structure pdf"