Microsoft 365 VBA Exporter une sélection de plages nommées au format PDF

  • Initiateur de la discussion Initiateur de la discussion tnion
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

tnion

XLDnaute Nouveau
Bonjour à tous,

Je me permets de venir vers vous pour de l'aide concernant l'impression en PDF d'un groupe des plages de données.

Actuellement, j'ai le code ci-dessous pour extraire certaines plages de données nommées, sélectionné par l'utilisateur de différents onglets via un Userform. Les plages nommés sont ensuite qui sont regroupé dans un nouveau fichier excel. Je souhaiterais la capacité de laisser le choix à l'utilisateur de produire une extraction soit en excel ou en PDF. Et là, j'avoue que mon niveau de VBA n'est pas suffisant!

Pourriez-vous, svp, m'aider à modifier le code afin d'être capable de produire l'extraction finale en PDF à la place d'un fichier excel ? Je mettrais bien 2 boutons de contrôle afin que l'utilisateur final peut choisir le bouton pour excel ou pour PDF.

Je vous remercie d'avance!

VB:
Sub ExportNamedRangesToNewWorkbook()
    Dim selectedRanges As Collection
    Dim newWB As Workbook
    Dim ctrlSheet As Worksheet
    Dim i As Integer
    Dim destSheet As Worksheet
    Dim cell As Range
    Dim rngName As String
    Dim UserForm As UserForm1 
    Dim j As Integer
    Dim shape As shape
    Dim ws As Worksheet
    Dim rngTopLeft As Range
    Dim newShape As shape
    Dim rngAddress As String

    ' Show the UserForm to select ranges
    Set UserForm = New UserForm1 
    UserForm.Show

    ' Collect selected named ranges
    Set selectedRanges = New Collection
    With UserForm.lstRanges
        For j = 0 To .ListCount - 1
            If .Selected(j) Then
                selectedRanges.Add .List(j)
            End If
        Next j
    End With

    ' Unload the UserForm
    Unload UserForm

    ' Exit if no ranges are selected
    If selectedRanges.Count = 0 Then
        MsgBox "No named ranges selected.", vbInformation, "Export Aborted"
        Exit Sub
    End If

    ' Create new workbook
    Set newWB = Workbooks.Add

    ' Add a control sheet in the new workbook
    Set ctrlSheet = newWB.Sheets(1)
    ctrlSheet.Name = "Menu"
    ctrlSheet.Cells(1, 1).Value = "Named Ranges Overview"
    ctrlSheet.Cells(1, 1).Font.Bold = True

    ' Loop through selected named ranges
    For i = 1 To selectedRanges.Count
        ' Get the named range
        rngName = selectedRanges(i)
        
        ' Get the named range and resolve its reference
        On Error Resume Next
        rngAddress = Replace(ThisWorkbook.Names(rngName).refersTo, "=", "")
        Set cell = Nothing
        Set cell = ThisWorkbook.Sheets(WorksheetNameFromRefersTo(rngAddress)).Range(RangeAddressFromRefersTo(rngAddress))
        On Error GoTo 0

        ' Skip invalid ranges
        If cell Is Nothing Then
            MsgBox "Skipping invalid named range: " & rngName, vbExclamation, "Error"
            GoTo NextRange
        End If

        ' Add a new sheet for each named range
        Set destSheet = newWB.Sheets.Add(After:=newWB.Sheets(newWB.Sheets.Count))
        destSheet.Name = rngName

        ' Copy values and formatting
        cell.Copy
        destSheet.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
        destSheet.Range("A1").PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
        
        ' Adjust column width
        destSheet.Columns("A:Z").AutoFit
        
        ' Add hyperlink in control sheet
        With ctrlSheet
            .Hyperlinks.Add Anchor:=.Cells(i + 1, 1), Address:="", SubAddress:= _
                "'" & destSheet.Name & "'!A1", TextToDisplay:=rngName
        End With

        ' Add a visible hyperlink back to the Menu sheet in cell K1 on the new sheet
        destSheet.Range("K1").Value = "Back to Menu"
        destSheet.Hyperlinks.Add Anchor:=destSheet.Range("K1"), Address:="", SubAddress:="'Menu'!A1", TextToDisplay:="Back to Menu"
        destSheet.Range("K1").Font.Underline = xlUnderlineStyleSingle
        destSheet.Range("K1").Font.Color = RGB(0, 0, 255) ' Blue color for visibility

        ' Loop through all shapes in the original worksheet (to extract logos)
        Set ws = ThisWorkbook.Sheets(cell.Parent.Name)
        For Each shape In ws.Shapes
            ' Check if the shape is within the named range bounds
            If Not Intersect(shape.TopLeftCell, cell) Is Nothing Then
                ' Copy the shape (logo)
                shape.Copy

                ' Paste the shape into the new sheet at the same relative position
                Set rngTopLeft = destSheet.Range("A1") ' Start position to paste the logo
                destSheet.Paste

                ' Get the newly pasted shape and adjust its position if needed
                Set newShape = destSheet.Shapes(destSheet.Shapes.Count)
                newShape.Top = rngTopLeft.Top + shape.Top - cell.Top
                newShape.Left = rngTopLeft.Left + shape.Left - cell.Left
            End If
        Next shape

NextRange:
    Next i

    ' Adjust Control Sheet formatting
    ctrlSheet.Columns("A:A").AutoFit

    ' Notify user of success
    MsgBox "Export completed successfully!", vbInformation, "Export Finished"
End Sub

' Helper function: Extract worksheet name from RefersTo address
Function WorksheetNameFromRefersTo(refersTo As String) As String
    WorksheetNameFromRefersTo = Split(refersTo, "!")(0)
    WorksheetNameFromRefersTo = Replace(WorksheetNameFromRefersTo, "'", "")
End Function

' Helper function: Extract range address from RefersTo address
Function RangeAddressFromRefersTo(refersTo As String) As String
    RangeAddressFromRefersTo = Split(refersTo, "!")(1)
End Function
 

Pièces jointes

Dernière édition:
Bonjour tnion

28 messages et vous n'avez pas encore compris 🤨

1) vous devez mettre le code entre balises, grâce au bouton prévu à cet effet
1750988900048.png


2) Si vous voulez être aidé correctement, vous devez joindre un fichier anonymisé 🙄

Sur ce....
 
Bonjour tnion

28 messages et vous n'avez pas encore compris 🤨

1) vous devez mettre le code entre balises, grâce au bouton prévu à cet effet
Regarde la pièce jointe 1219763

2) Si vous voulez être aidé correctement, vous devez joindre un fichier anonymisé 🙄

Sur ce....

Mes excuses... j'ai fait les corrections demandées. J'espère que cela pourrait convenir.
 
Mes excuses... j'ai fait les corrections demandées. J'espère que cela pourrait convenir.
Bonjour,

"un fichier anonymisé", ne signifie pas un fichier vide.

D'après ce que j'ai compris. Au lieu de créer un nouveau fichier dans lequel tu copies les plages sélectionnées.

Ajoute une feuille à ton fichier pour y copier les plages sélectionnées et ensuite il te suffit d'éditer cette feuille en PDF.
 
Dernière édition:
Bonjour,

Je ne pensais pas que le fait qu'il n'y ait pas de données dans la plage sélectionnée aurait un impact sur l'extraction. 😕 Quand je lance l'extraction pour créer un fichier excel avec des tables sélectionnés, j'ai bien le fichier excel qui se créer comme il est censé de faire...

Il y a le bouton dans l'onglet "MOP" qui appel le code pour l'extraction (l'ensemble du code est dans mon premier message). Ce qui permets d'extraire les tableaux sélectionné par l'utilisateur et les copier sans formules dans un nouveau fichier excel. Il y a un table / onglet avec un onglet "Menu" pour naviguer entre les onglets dans le nouveau fichier excel.

Je souhaiterais proposer à l'utilisateur l'option d'extraire des plages de données sélectionnés via l'Userform (il faut peut être créer un deuxième form ou laisser l'option de choisir le format dans l'Userform ?) et au lieu de créer un fichier excel, j'aimerais qu'un PDF est crée avec les tables à la suite. Par contre, je ne sais pas comment modifier le code pour coller les tables sélectionnés à la suite dans un nouveau fichier excel avec le loop. La taille des mes tables peuvent varier d'un à l'autre, donc pas de nombre de lignes fixe.

Je suis vraiment navrée que ma demande n'est pas assez claire 😖
 
Bonjour à tous

@trion

Un fichier remplit avec des données même bidons permet de comprendre ce que tu veut faire et de voir quelle solution parait le plus judicieux.
Notamment avoir les titres de tes colonnes etc....

A priori en regardant vite fait ton code j'aurais mis 1 onglet par tarif et j'exporterai la ou les feuilles voulus dans un autre fichier mais ce n'est que mon idée vite fait

A quoi sert le code dans les modules 1 et 2 ?
Qui t'a fait la macro ? IA ???
 
Bonjour
tout et absolument tout est a revoir dans ce classeur
on voit que tu copy des colonnes ;
alors les select et paste il faudrait pu être se calmer hein
instancier une classe userform pour afficher le userform en mode responsif n'est pas nécessaire le userform est déjà une classe en lui même

voir si j'ai bien compris l'intention:
click su bouton pour ouvrir le dialog de copy(userform1)
choisir dans la liste les plages a copier (subnommées)
copier tout les range demandé dans un new workbook
avec le même non de feuille voir de range nommées aussi(j'ai pas bien compris)
enregistré en pdf ou excel au choix

est ce bien ça

apres pour le module 1 c'est sans commentaire cette chose peut être fait en 3/4 lignes max sans select sans paste
pour le module 2 je crois comprendre que tu décale des colonnes la aussi en quelques ligne c'est bouclé sans select et sans paste

bref c'est tellement le boxon que c'est difficile de comprendre ce que tu veux vraiment
d'autant plus qu'il manque des feuilles

le mieux à faire on supprime tout les codes dans les modules et on refait ça au propre
a condition que tout nous explique ce que tu veux dans un français intelligible

sinon sur temu j'ai vu une boule de cristal à 0€ si tu t'inscrit avant minuit
 
Bonjour à tous,

Tout d'abord, je m'excuse pour les éventuelles fautes de français, qui n'est pas ma langue maternelle. Je vais essayer de réexpliquer ma demande du mieux que je peux.

J'ai un fichier d'origine avec des tables de tarifs (gamme 1, 2, 3, etc.) regroupés par réseau de vente (ex. revendeur1, interne, revendeur 2...). Un réseau de vente = 1 onglet. J'ai au moins 30 réseaux de vente et 3 gammes/réseau.

L'utilisateur doit pouvoir sélectionner certaines tables à partir de différents onglets et les regrouper dans un nouveau fichier, sans formules, pour les envoyer aux clients. Les tables sont nommés qui permets de retrouver chaque table dans la liste du Userform et laisser le choix à l'utilisateur de prendre ceux qui l'intéressent. Le petit cadre dans l'onglet MOP du fichier d'origine est la pour expliquer le fonctionnement aux utilisateurs.

Dans le nouveau fichier excel, il y a un onglet qui est crée pour chaque table sélectionnée. Le nom de l'onglet correspond au nom de la plage dans le fichier Excel d'origine. Il y a également un onglet "Menu" pour aider à naviguer entre les onglets car ils peuvent être très nombreux. Ils souhaitent que chaque table à son propre onglet pour éviter de monter et descendre, qui sera le cas si toutes les tables ont étaient mise à la suite dans le même onglet.

Le code en place n'est pas élégant, mais c'est le mieux que j'ai pu faire pour répond à la demande de base des utilisateurs.

@Phil69970 Merci pour la proposition de mise en page des données. Donc au lieu de nommé les ranges pour extraction, vous auriez fait 1 table/ onglet? Le code est un mélange d'IA, des forums et moi-même...fin bref, un vrai bazar.

Aujourd'hui, les utilisateurs aimeraient l'option de sortir les tableaux sélectionnés dans l'Userform en excel ou en pdf.

Sachant que mes compétences en VBA sont très limitées, je ne sais pas comment leur offrir le choix du type de fichier généré (1 bouton / type de fichier dans l'Userform?), et si en PDF, comment assurer une mise en page adapté (paysage, colonnes ajustées..)? Le fichier de base sera stocké dans Teams. Est-ce que cela posera des soucis en plus pour le sauvegarde des fichiers générés?

Vous trouverez une autre copie du fichier, avec des données fictifs et la module pour l'extraction en excel.

Je vous remercie d'avance pour votre aide.
 

Pièces jointes

@tnion



Aucun retour pas cool.....
Bonjour,

Toutes mes excuses pour la réponse tardive, j'étais avec la personne qui va s'en servir du fichier que ce matin et j'attendais son retour avant de vous répondre.

Votre solution est carrément top! Non seulement cela répondre à ma demande initiale, mais cela permets de faire les deux types d'extraction en même temps et aussi de diminuer le nombre d'onglets dans le fichier pour l'utilisateur final, ce qui est aussi apprécié de leur part.

Je vous remercie beaucoup votre votre temps et expertise!
 
Bonjour à tous

@tnion
J'ai vu une petite coquille dans mon fichier du post #9 qui efface une partie de la ligne des titres

1752039561389.png


1752039602026.png


Il faut remplacer C4 par C5 dans le code VBA à l'endroit ci dessous et uniquement là.

Sub RAZ()
Dim DerLig&
DerLig = Range("A" & Rows.Count).End(xlUp).Row
Range("C4: D" & DerLig) = "" '<== Tu remplaces le 4 par le 5
Range("C5: D" & DerLig) = "" ' <== Après remplacement la ligne corrigée devient celle ci
End Sub

Si tu ne sais pas faire dis le moi et je le ferais

**************************

De plus j'ai fait une nouvelle version qui est différente de la 1ere version à savoir qu'il n'y a plus qu'un seul fichier excel au lieu de X fichier excel en clair suivant les croix que tu choisis j'ai regroupé tous les fichiers excel dans 1 seul avec lien hypertext, coté PDF rien ne change.

Tu auras par exemple ceci comme résultat pour excel

1752041852594.png


Dans les 2 versions tu peux rajouter autant de tarif que tu veux si tu respectes parfaitement le mode opératoire que j'ai décris dans la version 1

* A noter quelle que soit la version il n'y a pas d'image comme tu avais mis dans le fichier que tu as fourni je les ai remplacé pour plus de simplification de mon code ==> elle ne seront pas gérées si tu en mets


Dis moi quelle version tu préfères ?

Merci de ton retour
 

Pièces jointes

Bonjour à tous

@tnion
J'ai vu une petite coquille dans mon fichier du post #9 qui efface une partie de la ligne des titres

Regarde la pièce jointe 1220198

Regarde la pièce jointe 1220199

Il faut remplacer C4 par C5 dans le code VBA à l'endroit ci dessous et uniquement là.



Si tu ne sais pas faire dis le moi et je le ferais

**************************

De plus j'ai fait une nouvelle version qui est différente de la 1ere version à savoir qu'il n'y a plus qu'un seul fichier excel au lieu de X fichier excel en clair suivant les croix que tu choisis j'ai regroupé tous les fichiers excel dans 1 seul avec lien hypertext, coté PDF rien ne change.

Tu auras par exemple ceci comme résultat pour excel

Regarde la pièce jointe 1220200

Dans les 2 versions tu peux rajouter autant de tarif que tu veux si tu respectes parfaitement le mode opératoire que j'ai décris dans la version 1

* A noter quelle que soit la version il n'y a pas d'image comme tu avais mis dans le fichier que tu as fourni je les ai remplacé pour plus de simplification de mon code ==> elle ne seront pas gérées si tu en mets


Dis moi quelle version tu préfères ?

Merci de ton retour
Bonjour à tous,

@Phil69970 Je vous remercie encore pour votre réponse!

J'ai pu effectuer le changement de code (C4 pour C5) sans souci, merci pour la correction.

Je garderais bien la V1 sous la coudre, mais finalement c'est bien la V2 qui correspond encore mieux aux attentes avec les tableaux regroupés dans un même fichier excel ☺️

Pour faciliter l'identification des documents enregistrés, j'ai ajouté la date d'extraction dans le nom du fichier enregistré côté PDF

VB:
Ws2.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & Application.PathSeparator & Format(Date, "yyyymmdd") & NomFeuille
        NFichier = ThisWorkbook.Path & Application.PathSeparator & Format(Date, "yyyymmdd") & NomFeuille & ".PDF"

et j'ai réussi pour le côte Excel après quelques essais 🥴

VB:
Workbooks.Open Chemin & "Tarif_Export.xlsm"
    Supprimer_Feuilles "MOP", "Tarif"
    Workbooks("Tarif_Export.xlsm").SaveAs Chemin & Format(Date, "yyyymmdd") & "Tarif_Export.xlsx", 51
    Kill Chemin & Format(Date, "yyyymmdd") & "Tarif_Export.xlsm"
    Workbooks(Format(Date, "yyyymmdd") & "Tarif_Export.xlsx").Close True
    
    NFichier = Chemin & Format(Date, "yyyymmdd") & "Tarif_Export.xlsx"
    MsgBox "Le fichier excel est enregistré sur le disque dur " & vbCrLf & NFichier, vbInformation, "Emplacement fichier excel"


Si je peux me permets d'être très gourmande, comment faut faire pour prendre en compte des images? J'avais utilisé le code ci-dessous dans mon fichier de base, mais j'ai du mal à voir comment le modifier pour l'intégrer dans votre V2.

VB:
 ' Loop through all shapes in the original worksheet (to extract logos)
        Set ws = ThisWorkbook.Sheets(cell.Parent.Name)
        For Each shape In ws.Shapes
            ' Check if the shape is within the named range bounds
            If Not Intersect(shape.TopLeftCell, cell) Is Nothing Then
                ' Copy the shape (logo)
                shape.Copy

                ' Paste the shape into the new sheet at the same relative position
                Set rngTopLeft = destSheet.Range("A1") ' Start position to paste the logo
                destSheet.Paste

                ' Get the newly pasted shape and adjust its position if needed
                Set newShape = destSheet.Shapes(destSheet.Shapes.Count)
                newShape.Top = rngTopLeft.Top + shape.Top - cell.Top
                newShape.Left = rngTopLeft.Left + shape.Left - cell.Left
            End If
        Next shape


A nouveau, merci toujours pour votre expertise!
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour