Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2021 Export d'un Userform au format Docx;

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 !

jeff1494

XLDnaute Occasionnel
Bonsoir à toutes et tous;

Je suis en train de me faire une petite boite à outils me permettant d'avoir des informations pour m'aider à monter une sorte de documentation du projet VBE.
Mon idée est de regrouper des informations du projet me permettant de monter une documentation cohérente du projet.

J'ai créé quelques macros pour me fournir des éléments, qui me serviront à créer de la doc, comme par exemple :
  1. Liste de tous les formulaires du projet.
  2. Liste des contrôles par formulaire.
  3. Liste des feuilles avec les attributs "masquée, protégée".
  4. Liste des noms de cellules et tableaux du classeur.
J'aimerai aussi pouvoir créer au format Word '.Docx' une documentation sur les formulaires. Pouvoir insérer dans un fichier ".docx" une capture des formulaires, et ainsi pouvoir documenter chaque contrôle par exemple.

J'ai trouvé une macro créée par @kiki29 il y a déjà un bon moment (Pris dans son récap des possibilités de jouer avec les PDF et Excel dont voici le lien).

Mon problème est qu'il exporte la capture d'écran au format PDF. Cela fonctionne parfaitement, mais je voudrais bien, en fait, sauvegarder la capture comme image dans un fichier Word.
J'ai bien sûr essayer de voir le code et si je pouvais le modifier. Mais le Hic est que Kiki29 a utilisé des concepts que je ne connais pas. Du genre "Const VK_SNAPSHOT = 44" voire " keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0" et d'autres.

Donc j'avoue humblement que d'une part j'aimerais bien comprendre ce genre d'instruction (L'aide sur les "Constantes KeyCode" m'a permis de comprendre l'idée générale, mais c'est tout.).

Je vous joins un fichier exemple très simple qui utilise la macro de Kiki29, et qui marche parfaitement bien.
Si une personne charitable pouvait :
  1. M'expliquer le code de kiki29.
  2. M'aider à créer une macro qui ferait le même genre de chose, à savoir:
    1. Prendre un "cliché" du formulaire au format Bmp, ou autre (.jpg, ...). Le format n'est une contrainte pour autant qu'il puisse être inclus dans un document.
    2. Pouvoir créer un document Word (format .docx) qui contiendrait ce cliché du formulaire. Le doc sera créé dans le répertoire du classeur, et avec le nom du formulaire.
Je vous joins un petit fichier qui m'a permis de tester la macro de kiki29. Il est minimaliste, juste un formulaire avec quelques contrôles bidons, et 3 boutons.
Un pour l'export vers PDF = "CommandButton1", le deuxième "CommandButton2" qui ne sert à rien d'autre que d'exister, et un troisième "CommandButton3" qui me servirait à créer le fameux document Word;

Si une âme charitable pouvait m'aider je lui en serais reconnaissant.
En attendant je vous souhaite à tous une bonne soirée.
 

Pièces jointes

Solution
bonsoir jeff
VB:
Private Sub CommandButton3_Click()
    PrintScreen
    DoEvents
    Dim wdApp As Object, wdDoc As Object
    ' creation de l'object application word
    Set wdApp = CreateObject("Word.Application")
    wdApp.Visible = True
    ' on créé un document
    Set wdDoc = wdApp.Documents.Add
    ' on colle la capture dans le document
    wdApp.Selection.Paste
    'on centre le tout
    wdApp.Selection.ParagraphFormat.Alignment = 1 ' 0=Left, 1=Center, 2=Right
    ' enregistrement du document
    wdDoc.SaveAs2 Environ("userprofile") & "\desktop\mon userform.docx"
    'on ferme
    wdDoc.Close
    wdApp.Quit
    MsgBox "enregistrement de la capture dans un fichier docw(word) terminé"
End Sub
@job75 : Je vais tester ta solution, dans la journée et te tiendrais au courant. En principe cela devrait fonctionner.
D'après le post #45 de Patrick ça ne va pas, alors Patrick essaie :
VB:
Private Sub CommandButton1_Click()
Dim Wapp As Object, Wdoc As Object
 
    Application.ScreenUpdating = False
    PrintScreen
    DoEvents
  
    Set Wapp = CreateObject("Word.Application")
    Wapp.Visible = True
    Set Wdoc = Wapp.Documents.Add
    Wapp.Selection.Range.Text = "Ci-dessous la copie d'écran" & vbCrLf & vbCrLf & "Fin de la copie d'écran" '3 paragraphes
    Wdoc.Paragraphs(2).Range.Select
    Wapp.Selection.Paste
    Do: DoEvents: Loop Until Wdoc.Shapes.Count + Wdoc.InlineShapes.Count > 0 'en attente du collage
    If Wdoc.Shapes.Count Then
        Wdoc.Shapes(1).Left = (Wdoc.PageSetup.PageWidth - Wdoc.Shapes(1).Width) / 2 - Wdoc.PageSetup.LeftMargin 'centrage
        With Wapp.Selection.ParagraphFormat: .SpaceAfter = .SpaceAfter + Wdoc.Shapes(1).Height - .LineSpacing: End With
    ElseIf Wdoc.InlineShapes.Count Then
        Wapp.Selection.ParagraphFormat.Alignment = 1 'centrage avec le texte
    End If
  
    Wdoc.SaveAs ActiveWorkbook.Path & "\UserForm.docx"
    Wdoc.ExportAsFixedFormat ActiveWorkbook.Path & "\UserForm.pdf", 17 'wdExportFormatPDF
    Wdoc.Close False
    Wapp.Quit
    MsgBox "Les fichiers 'UserForm.docx' et 'UserForm.pdf' ont été créés..."
    Unload Me
End Sub
Si ça ne va toujours pas chez toi je te laisse voir pourquoi et corriger car chez moi c'est bon.
 

Pièces jointes

de tout ce que j'ai pu constater
si je me contente de faire simple dans les bonne pratiques a savoir simplement demander le centrage du paragrapheformat c'est nickel
des qu'on sort de ce contexte il y a des soucis
ma conclusion:
mieux vaut rester simple
 
Bon je pense avoir résolu le problème : il faut créer au départ 4 paragraphes pour bien fonctionner avec une InlineShape :
VB:
Private Sub CommandButton1_Click()
Dim Wapp As Object, Wdoc As Object
 
    Application.ScreenUpdating = False
    PrintScreen
    DoEvents
    
    Set Wapp = CreateObject("Word.Application")
    Wapp.Visible = True
    Set Wdoc = Wapp.Documents.Add
    Wapp.Selection.Range.Text = "Ci-dessous la copie d'écran" & vbCrLf & vbCrLf & vbCrLf & "Fin de la copie d'écran" '4 paragraphes
    Wdoc.Paragraphs(2).Range.Select
    Wapp.Selection.Paste
    Do: DoEvents: Loop Until Wdoc.Shapes.Count + Wdoc.InlineShapes.Count > 0 'en attente du collage
    If Wdoc.Shapes.Count Then
        Wdoc.Shapes(1).Left = (Wdoc.PageSetup.PageWidth - Wdoc.Shapes(1).Width) / 2 - Wdoc.PageSetup.LeftMargin 'centrage
        With Wapp.Selection.ParagraphFormat: .SpaceAfter = .SpaceAfter + Wdoc.Shapes(1).Height - .LineSpacing: End With
        Wdoc.Paragraphs(3).Range.Delete 'supprime le 3ème paragraphe
    ElseIf Wdoc.InlineShapes.Count Then
        Wapp.Selection.ParagraphFormat.Alignment = 1 'centrage avec le texte
    End If
    
    Wdoc.SaveAs ActiveWorkbook.Path & "\UserForm.docx"
    Wdoc.ExportAsFixedFormat ActiveWorkbook.Path & "\UserForm.pdf", 17 'wdExportFormatPDF
    Wdoc.Close False
    Wapp.Quit
    MsgBox "Les fichiers 'UserForm.docx' et 'UserForm.pdf' ont été créés..."
    Unload Me
End Sub
J'espère que tout le monde a compris que ce code fonctionne quelle que soit l'image, Shape ou InlineShape.
 

Pièces jointes

Maintenant en convertissant la Shape (chez moi) en InlineShape c'est plus simple :
VB:
Private Sub CommandButton1_Click()
Dim Wapp As Object, Wdoc As Object
 
    Application.ScreenUpdating = False
    PrintScreen
    DoEvents
    
    Set Wapp = CreateObject("Word.Application")
    Wapp.Visible = True
    Set Wdoc = Wapp.Documents.Add
    Wapp.Selection.Range.Text = "Ci-dessous la copie d'écran" & vbCrLf & vbCrLf & vbCrLf & "Fin de la copie d'écran" '4 paragraphes
    Wdoc.Paragraphs(2).Range.Select
    Wapp.Selection.Paste
    Do: DoEvents: Loop Until Wdoc.Shapes.Count + Wdoc.InlineShapes.Count > 0 'en attente du collage
    If Wdoc.Shapes.Count Then Wdoc.Shapes(1).ConvertToInlineShape: Wdoc.Paragraphs(3).Range.Delete
    Wapp.Selection.ParagraphFormat.Alignment = 1 'centrage avec le texte
    
    Wdoc.SaveAs ActiveWorkbook.Path & "\UserForm.docx"
    Wdoc.ExportAsFixedFormat ActiveWorkbook.Path & "\UserForm.pdf", 17 'wdExportFormatPDF
    Wdoc.Close False
    Wapp.Quit
    MsgBox "Les fichiers 'UserForm.docx' et 'UserForm.pdf' ont été créés..."
    Unload Me
End Sub
 

Pièces jointes

test du post#53 en reduisant le userform de largeur et hauteur
la on voit que ca centre



et en elargissant on se rend compte que la capture est adaptée a la largeur max

le post #53 est donc un bon compromis entre version simple et complexe
 
a d'accords je comprends mieux
tu es revenu au centrage du paragraphe simple en convertissant pour vous le shape en inline shape

VB:
 Do: DoEvents: Loop Until Wdoc.Shapes.Count + Wdoc.InlineShapes.Count > 0 'en attente du collage
    If Wdoc.Shapes.Count Then Wdoc.Shapes(1).ConvertToInlineShape: Wdoc.Paragraphs(3).Range.Delete
    Wapp.Selection.ParagraphFormat.Alignment = 1 'centrage avec le texte
j'avais donc raison depuis le debut c'est bien le paragraphe alignement c'est juste que sur vos versions vous avez accès a la collection shapes et moi non
 
donc maintenant que le paragraphe alignement fonctionne chez toi
EN CONVERTISSANT EN INLINESHAPE
on peut revenir a mon point de depart
qui etait d'ajouter un paragraphe a chaque ajout texte ou capture
on a ainsi la parfaite maitrise progressive de la construction du document plutot que de shunter des saut de ligne arbitraire
donc on reviens au depart avec :
VB:
Private Sub CommandButton1_Click()
    PrintScreen
    DoEvents
    Dim wApp As Object, wDoc As Object
    ' creation de l'object application word
    Set wApp = CreateObject("Word.Application")
    wApp.Visible = True
    ' on créé un document
    Set wDoc = wApp.Documents.Add
    'on ecrit le texte avant
    wApp.Selection.TypeText "Voici la capture d'écran :" & vbCrLf
    ' on colle la capture dans le document
    wApp.Selection.Paste
    'on centre le shape
    Do: DoEvents: Loop Until wDoc.Shapes.Count + wDoc.InlineShapes.Count > 0 'en attente du collage
    If wDoc.Shapes.Count Then wDoc.Shapes(1).ConvertToInlineShape: wDoc.Paragraphs(3).Range.Delete
    wApp.Selection.ParagraphFormat.Alignment = 1 'centrage avec le texte
    'on ecrit du texte appres
    wApp.Selection.TypeParagraph
    wApp.Selection.ParagraphFormat.Alignment = 0 ' 0=Left, 1=Center, 2=Right
    wApp.Selection.TypeText "Fin de la capture." & vbCrLf
    ' enregistrement du document
    wDoc.SaveAs2 Environ("userprofile") & "\desktop\mon userform.docx"
    'on ferme
    wDoc.Close
    wApp.Quit
    MsgBox "enregistrement de la capture dans un fichier docx (word) terminé"
End Sub
 
- 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

Réponses
16
Affichages
467
Réponses
5
Affichages
364
Réponses
7
Affichages
117
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…