Autres Macro VBA qui coince...sous Word

Rénato

XLDnaute Occasionnel
Bonjour le forum

J'ai fouillé sur différents forums, sans trouver mon bonheur, alors je me lance ici sur un souci VBA mais sur du Word. (Veuillez m'excuser, si je n'ai pas tout à fait visé la bonne classification)

J'aurais le besoin suivant : j'ai des documents avec des extensions "exotiques" répartis dans de nombreux répertoires et je souhaiterais que chacun d'entre eux soit intégré dans un document word (Insertion\objet\créé à partir du fichier\affiché sous forme d’icone) et porterait le nom du fichier.

Exemple : j'ai les fichiers toto.xxxx, titi.yyyy et tutu.zzzz dans le répertoire MACHIN. Une fois que ma macro (qui se trouve dans un document Word et également dans le répertoire MACHIN) aura tourné, je vais trouver dans mon répertoire MACHIN un fichier toto.docx, un fichier titi.docx et un fichier tutu.docx.
Et si j'ouvre toto.docx, dans le document word, j'y trouve toto.xxxx, si j'ouvre titi.docx, dans le document word, j'y trouve titi.yyyy etc....

Je me suis essayé avec le code ci-dessous, mais ce que je cherche c'est que la macro me traite tous les fichiers les uns après les autres dans le répertoire.


Sub Encapsuler()
Dim chemin As String

chemin = ActiveDocument.Path 'la macro est exécutée dans le répertoire où se trouvent les fichiers à traiter
MyName = Dir("*.*")
intPos = InStrRev(MyName, ".") 'objectif retirer l'extension dans le nom plus bas
While MyName <> "" 'boucle pour traiter tous les fichiers contenus dans le répertoire
Documents.Add 'ouverture d'un fichier word
With Selection 'c'est surtout dans les 4 lignes suivantes ou je souhaite que la boucle soit variable au regard de chaque fichier traité et ...ou je coince.

.InlineShapes.AddOLEObject ClassType:="AcroExch.Document.DC", _
FileName:=MyName, LinkToFile:=False, DisplayAsIcon:=True, IconFileName:= _
"C:\windows\Installer\{AC76BA86-7AD7-1036-7B44-AC0F074E4100}\PDFFile_8.ico" _
, IconIndex:=0, IconLabel:="Test.pdf"

MyName = Left(MyName, intPos - 1) 'je ne retiens que la partie du nom que je veux accoler à la nouvelle extension
ActiveDocument.SaveAs2 FileName:=chemin & "\" & MyName & ".docx" 'enregistré-sous au format docx dans le répertoire "Chemin"
ActiveDocument.Close 'je referme le document actif une fois celui-ci enregistré
End With
MyName = Dir()
Wend 'je boucle sur le fichier suivant
MsgBox "fin du traitement"
J'espère avoir été suffisamment clair, toute modification ou suggestion sera la bienvenue
Merci d'avance pour votre temps et pour votre aide
Rénato
N.B. je suis sous office 2013
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, Renato

Renato
Sorti de la poussière de mes archives
(Pour être sur, je viens de retester sur XL 2013 - test OK)
VB:
Sub WRD_Inserer_En_Tant_Qu_Objet()
'code pour Microsoft Word [test OK sur mon PC]
Dim FoundFile As Variant, strClass As String, strIco As String
Dim strFullName As String, strName As String, strExt As String
With Application.FileDialog(FileDialogType:=msoFileDialogFilePicker)
  If .Show = -1 Then
    For Each FoundFile In .SelectedItems
      strFullName = FoundFile: strName = Split(strFullName, "\")(UBound(Split(strFullName, "\")))
      strExt = UCase(Right(strName, Len(strName) - InStrRev(strName, ".")))
      Select Case strExt
        Case "PDF"
          strClass = "AcroExch.Document"
          strIco = "C:\WINDOWS\Installer\{AC76BA86-1033-F400-7760-000000000003}\_PDFFile.ico"
        Case "XLS", "XLSX", "XLSM"
          strClass = "Excel.Sheet"
          strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\xlicons.exe"
        Case "DOC", "DOCX", "DOCM"
          strClass = "Word.Document"
          strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\wordicon.exe"
        Case Else:
          strClass = "Package"
          strIco = "C:\WINDOWS\system32\packager.dll"
      End Select
      Selection.InlineShapes.AddOLEObject ClassType:=strClass, _
        FileName:=strFullName, IconFileName:=strIco, IconIndex:=0, _
        IconLabel:=strName, LinkToFile:=False, DisplayAsIcon:=True
    Next
  End If
End With 'SRC:6518_0619 - xfm(°)mpod
End Sub
 

Rénato

XLDnaute Occasionnel
Bonsoir le forum, STAPLE 1600

Merci pour ta réactivité STAPLE 1600

Ceci fonctionne très bien si je souhaite intégrer les fichiers un par un manuellement, chaque document se trouvera bien packagé mais dans le même document word.
Mon objectif est sensiblement différent, puisque je souhaite que tous les fichiers soient traités en boucle et chacun packagé dans son propre document word.
Du coup, j'ai essayé de combiner ton code et le mien mais le code bug. (voir ci-dessous)
Quoi qu'il en soit, merci pour ta patience et ton expertise.
Cordialement
Rénato

Sub Encapsuler2()
Dim chemin As String

Call CreationSousRepertoire
chemin = ActiveDocument.Path 'la macro est exécutée dans le répertoire où se trouvent les fichiers à traiter
MyName = Dir(chemin & "\*.*")
intPos = InStrRev(MyName, ".") 'objectif retirer l'extension dans le nom plus bas
'While
Do While MyName <> "" Or MyName <> "toto*.*" 'boucle pour traiter tous les fichiers contenus dans le répertoire sauf celui qui contient "Toto"
Documents.Add 'ouverture d'un fichier word
With Selection 'c'est dans les 4 lignes plus bas ou je souhaite que la boucle soit variable au regard de chaque fichier traité et ...ou je coince.

strFullName = FoundFile: strName = Split(strFullName, "\")(UBound(Split(strFullName, "\")))
strExt = UCase(Right(strName, Len(strName) - InStrRev(strName, ".")))
Select Case strExt
Case "PDF"
strClass = "AcroExch.Document"
strIco = "C:\WINDOWS\Installer\{AC76BA86-1033-F400-7760-000000000003}\_PDFFile.ico"
Case "XLS", "XLSX", "XLSM"
strClass = "Excel.Sheet"
strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\xlicons.exe"
Case "DOC", "DOCX", "DOCM"
strClass = "Word.Document"
strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\wordicon.exe"
Case Else:
strClass = "Package"
strIco = "C:\WINDOWS\system32\packager.dll"
End Select
Selection.InlineShapes.AddOLEObject ClassType:=strClass, _
FileName:=strFullName, IconFileName:=strIco, IconIndex:=0, _
IconLabel:=strName, LinkToFile:=False, DisplayAsIcon:=True

MyName = Left(MyName, intPos - 1) 'je ne retiens que la partie du nom que je veux accoler à la nouvelle extension
ActiveDocument.SaveAs2 FileName:=chemin & "\RepTransformation\" & MyName & ".docx" 'enregistré sous au format docx dans le répertoire "Chemin"
ActiveDocument.Close 'je referme le document actif une fois enregistrer
End With
MyName = Dir()
Loop 'je boucle sur le fichier suivant
'Wend
MsgBox "fin du traitement"
End Sub

Sub CreationSousRepertoire()
Dim mavariable As String
chemin = ActiveDocument.Path
mavariable = "RepTransformation"
If Dir(chemin & "\" & mavariable, vbDirectory) = "" Then _
MkDir chemin & "\" & mavariable
End Sub
 

Staple1600

XLDnaute Barbatruc
Re

Avec une légère adaptation du code que j'ai posté au message#2
Cela semble OK, non ?
VB:
Sub WRD_Inserer_En_Tant_Qu_Objet_V2()
'code pour Microsoft Word [test OK sur mon PC]
Dim FoundFile As Variant, strClass As String, strIco As String
Dim strFullName As String, strName As String, strExt As String
Dim strPath As String
strPath = ActiveDocument.Path & "\"
With Application.FileDialog(FileDialogType:=msoFileDialogFilePicker)
  If .Show = -1 Then
    For Each FoundFile In .SelectedItems
     strFullName = FoundFile: strName = Split(strFullName, "\")(UBound(Split(strFullName, "\")))
      strExt = UCase(Right(strName, Len(strName) - InStrRev(strName, ".")))
      Select Case strExt
        Case "PDF"
          strClass = "AcroExch.Document"
          strIco = "C:\WINDOWS\Installer\{AC76BA86-1033-F400-7760-000000000003}\_PDFFile.ico"
        Case "XLS", "XLSX", "XLSM"
          strClass = "Excel.Sheet"
          strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\xlicons.exe"
        Case "DOC", "DOCX", "DOCM"
          strClass = "Word.Document"
          strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\wordicon.exe"
        Case Else:
          strClass = "Package"
          strIco = "C:\WINDOWS\system32\packager.dll"
      End Select
      Documents.Add
      ActiveDocument.Range(Start:=startRange).InlineShapes.AddOLEObject ClassType:=strClass, _
        FileName:=strFullName, IconFileName:=strIco, IconIndex:=0, _
        IconLabel:=strName, LinkToFile:=False, DisplayAsIcon:=True
      ActiveDocument.SaveAs2 strPath & Split(strName, ".")(0) & ".docx"
      ActiveDocument.Close True
    Next
  End If
End With 'SRC:6518_0619 - xfm(°)mpod
End Sub
 

Rénato

XLDnaute Occasionnel
Merci pour cette nouvelle adaptation STAPLE 1600.Oui en effet, j’ai ajouté un sous répertoire dans le dossier de travail, pour y déposer tout les docx packagés. (Ça me simplifiera la vie pour l’exploitation, en fait j’ai près de 150 répertoires à traiter). Là mes obligations familiales m’ont rattrapées. Je fais un nouvel essai demain et je te tiendrai informé bien sûr.
Bonne nuit le Forum.
 

Rénato

XLDnaute Occasionnel
Bonjour Staple 1600 , bonjour le Forum

Je suis motivé pour faire avancer mon projet, du coup ça m'a sorti du lit ce matin.
Je te remercie encore STAPLE 1600 et effectivement, je suis presque à la cible, modulo :
- que je préfèrerai vu le nombre de fichiers à traiter ne pas avoir à les sélectionner un par un à la main, mais qu'une fois la macro lancée, qu'elle les traite tous à la suite. (cf mon message hier 22h02 "les fichiers soient traités en boucle")
- si possible que les fichiers packagés soient enregistrés (cf fin de mon code hier 22h02) dans un répertoire particulier, afin que je puisse bien les distinguer des autres.
- enfin "cerise sur le gateau", que le fichier word qui contient la macro ne soit pas à son tour packagé, car c'est inutile, que je le retrouve dans le répertoire des fichiers packagés, il faudra le cas échéant que je le retire.

Quoi qu'il en soit, ce que tu m'as proposé m'est déjà d'une grande aide, merci pour ta patience et ton appui
Rénato
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

VB:
Sub Version3()
Dim strPath$, strFullName$, fich$, i&
On Error GoTo ErrHandler
With Application.FileDialog(4)
  .AllowMultiSelect = 0: .Title = "Choisir le répertoire"
  If .Show = -1 Then strPath = .SelectedItems(1)
End With
If strPath = "" Then Exit Sub
fich = Dir(strPath & "\*.*")
Do While fich <> vbNullString
strFullName = strPath & "\" & fich
strName = Split(fich, ".")(0)
strExt = UCase(Split(fich, ".")(1))
      Select Case strExt
        Case "PDF"
          strClass = "AcroExch.Document"
          strIco = "C:\WINDOWS\Installer\{AC76BA86-1033-F400-7760-000000000003}\_PDFFile.ico"
        Case "XLS", "XLSX", "XLSM"
          strClass = "Excel.Sheet"
          strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\xlicons.exe"
        Case "DOC", "DOCX", "DOCM"
          strClass = "Word.Document"
          strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\wordicon.exe"
        Case Else:
          strClass = "Package"
          strIco = "C:\WINDOWS\system32\packager.dll"
      End Select
      Documents.Add
      ActiveDocument.Range(Start:=startRange).InlineShapes.AddOLEObject ClassType:=strClass, _
        FileName:=strFullName, IconFileName:=strIco, IconIndex:=0, _
        IconLabel:=strName, LinkToFile:=False, DisplayAsIcon:=True
        ActiveDocument.SaveAs2 strPath & "\" & strName & ".docx"
        ActiveDocument.Close True
fich = Dir()
Loop
Exit Sub
ErrHandler:
MsgBox "Aucun fichier dans le dossier choisi!", vbCritical, "Erreur"
End Sub
PS: Il faut juste sélectionner le dossier d'un seul clic, puis cliquer sur OK (quand la boite de dialogue s'affiche)
 

Staple1600

XLDnaute Barbatruc
Re

Et pour finir, pendant que la soupe mitonne, une version qui crée un répertoire dédié à la compilation des fichiers.
;)
Bon appétit.
VB:
Sub Version4()
Dim strPath$, strFullName$, fich$, DossierExport$
DossierExport = "toto"
On Error GoTo ErrHandler
With Application.FileDialog(4)
  .AllowMultiSelect = 0: .Title = "Choisir le répertoire"
  If .Show = -1 Then strPath = .SelectedItems(1)
End With
If strPath = "" Then Exit Sub
DossierExport = InputBox("Nom du dossier pour la compilation des fichiers?", "Création dossier")
CreateFolder strPath & "\" & DossierExport
fich = Dir(strPath & "\*.*")
Do While fich <> vbNullString
strFullName = strPath & "\" & fich
strName = Split(fich, ".")(0)
strExt = UCase(Split(fich, ".")(1))
      Select Case strExt
        Case "PDF"
          strClass = "AcroExch.Document"
          strIco = "C:\WINDOWS\Installer\{AC76BA86-1033-F400-7760-000000000003}\_PDFFile.ico"
        Case "XLS", "XLSX", "XLSM"
          strClass = "Excel.Sheet"
          strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\xlicons.exe"
        Case "DOC", "DOCX", "DOCM"
          strClass = "Word.Document"
          strIco = "C:\WINDOWS\Installer\{91140000-0011-0000-0000-0000000FF1CE}\wordicon.exe"
        Case Else:
          strClass = "Package"
          strIco = "C:\WINDOWS\system32\packager.dll"
      End Select
      Documents.Add
      ActiveDocument.Range(Start:=startRange).InlineShapes.AddOLEObject ClassType:=strClass, _
        FileName:=strFullName, IconFileName:=strIco, IconIndex:=0, _
        IconLabel:=strName, LinkToFile:=False, DisplayAsIcon:=True
        ActiveDocument.SaveAs2 strPath & "\" & DossierExport & "\" & strName & ".docx"
        ActiveDocument.Close True
fich = Dir()
Loop
Exit Sub
ErrHandler:
MsgBox "Aucun fichier dans le dossier choisi!", vbCritical, "Erreur"
End Sub
Sub CreateFolder(sFolder As String)
If Len(Dir(sFolder, vbDirectory)) = 0 Then
MkDir sFolder
End If
End Sub
 

Rénato

XLDnaute Occasionnel
Bonsoir le Forume, Staple

Merci encore Staple 1600, c'est le top. Ma difficulté désormais va être de parvenir à décomposer tout ton code et ça c'est une autre affaire.

Pour le fun, pour toi ou un autre visiteur du forum, ne sachant pas si tu repasserais par là, j'ai tout de même poursuivi sur mon script initial.
Finalement, je ne suis pas très loin du résultat escompté ...sauf que la boucle pour que tous les fichiers du répertoires soient traités (packagés) les uns après les autres ne fonctionne pas.
Je confie mon bout de code à votre perspicacité.


Sub Encapsuler2()

Call CreationSousRepertoire
chemin = ThisDocument.Path
NomComplet = ThisDocument.FullName
NomFichier = Split(NomComplet, "\")(UBound(Split(NomComplet, "\")))
intPos = InStrRev(NomFichier, ".")
Do While NomComplet <> ""

Documents.Add 'ouverture d'un fichier word
With Selection
.InlineShapes.AddOLEObject ClassType:="Package", _
FileName:=NomComplet, LinkToFile:=False, DisplayAsIcon:=True, IconFileName:="C:\windows\system32\packager.dll" _
, IconIndex:=0, IconLabel:=NomFichier

NomAbrege = Left(NomFichier, intPos - 1)
ActiveDocument.SaveAs2 FileName:=chemin & "\RepTransformation\" & NomAbrege & ".docx" 'enregistré sous au format docx dans le répertoire "Chemin"
ActiveDocument.Close
End With
NomComplet = Dir() ' <-- je présume que mon souci vient de là
Loop
MsgBox "fin du traitement"
End Sub

Sub CreationSousRepertoire()
Dim mavariable As String
chemin = ActiveDocument.Path
mavariable = "RepTransformation"
If Dir(chemin & "\" & mavariable, vbDirectory) = "" Then _
MkDir chemin & "\" & mavariable
End Sub

Je terminerai en disant que sous ton avatar, la mention XLDnaute Barbatruc, n'est pas usurpée.

Rénato
 

Staple1600

XLDnaute Barbatruc
Re

[suspicion d'un début de petite blessure egotique]
Je te laisse poursuivre ton chemin puisque tu sembles préférer continuer sur ton propre code...
(je ne retrouve rien de ma version 4 dans ton dernier message :rolleyes:)

Mais bon, suis habitué, je m'en remettrai après une bonne nuit de sommeil
[/suspicion d'un début de petite blessure égotique]

PS: La notion de Barbatruc ne veut pas dire grand chose.
(Au début du forum, cela signalait juste que tu étais un membre qui avait posté au moins 2000 messages)
 

Rénato

XLDnaute Occasionnel
Pas du tout STAPLE, ne te méprends pas, la V4 fait très bien le boulot...elle est pile poil à la cible et le choix du répertoire à l'initiative de l'utilisateur est un plus auquel je n'avais pas pensé.

Un détail pour toi, qui l'est moins pour moi, il faudra simplement que j'ajoute une ligne qui je supprime (Kill xxx) le fichier qui contient la macro car lui même est packagé avec les autres dans le répertoire créé. il surcharge les répertoires et est inutile (cf point 3 de mon mail ce matin 05h44)

Si je revenais sur mon code, c'est parceque je l'ai trituré dans tous les sens et pensais être tout proche du résultat avec un assemblage que j'ai pioché ça et là....pour moi ça aurait été une petite victoire.

Au plaisir STAPLE
Rénato
 

Staple1600

XLDnaute Barbatruc
Re

Il suffit que le fichier contenant la macro soit dans un autre dossier puisque on choisit le dossier à traiter par la boite de dialogue et la macro n’insère rien dans le fichier, elle crée N fichiers word dans lesquels elle insère les fichiers.??? trouvés.
Ou même dans un fichier non enregistré (c'est comme cela que j'ai fait mon dernier test)
Donc nul besoin de Kill, ni de Bill ;)

Je te laisse triturer en paix ;)
 

Rénato

XLDnaute Occasionnel
Merci pour ta réactivité et pour ce dernier éclairage Staple, je partais bille en tête de laisser la macro dans le même répertoire.
Je vais mettre en pratique la V4 et n’exclus pas de revenir pour d’autres possibles échanges.
Bonne nuit STAPLE et le Forum
 

Rénato

XLDnaute Occasionnel
Bonsoir le forum et bonsoir Staple...si tu devais repasser sur ce fil.

j'ai réalisé différents tests avec des extensions diverses et variées, ça marche plutôt bien.
Cependant, je rencontre un petit souci avec les extensions "docm". (pas avec "docx" et pas non plus avec "doc")
lorsque la macro traite des extension "docm", l'enregistré-sous ne se fait pas correctement. Les fichiers sont pourtant bien générés dans le répertoire cible mais ne peuvent pas s'ouvrir. .... je soumets ce nouveau problème à ta sagacité.

Bonne soirée
Rénato
 

Discussions similaires

  • Question
Microsoft 365 Code VBA
Réponses
10
Affichages
701

Statistiques des forums

Discussions
314 588
Messages
2 110 988
Membres
111 002
dernier inscrit
Lolo73i