Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA : Word 97 : Changement de liens d'images

7 réponses
Avatar
~Jean-Marc~
Bonjour à tous,

J'écris un petit script VBS pour automatiser le
changement de liens des images incluses dans
différents modèles de documents. (Les images
étaient linkées sur un serveur qui n'existe plus et
non sauvées avec les documents...)

Le script VBS en lui-même ne pose pas de problèmes,
c'est la partie VBA qui plante :

[snip]

' partie incluse dans une boucle d'énumération des fichiers .dot
' oWord est l'objet Word
' oWordActiveDoc est le .dot actuellement ouvert
' fso est le FileSystemObject de VBS
' NewImgs est le nouveau chemin vers les images

Do
I = I + 1
If oWordActiveDoc.Shapes(I).Type = 11 Then
iSPath = oWordActiveDoc.Shapes(I).LinkFormat.SourceFullName
if not fso.FileExists(iSPath) then
Wscript.echo "--> " & iSPath
iSPath = NewImgs & "\" & fso.GetFileName(iSPath)
if fso.FileExists(iSPath) then
oWordActiveDoc.Shapes(I).LinkFormat.SourceFullName = iSPath
Wscript.echo "----> Lien remplacé : " & iSPath & vbCrLf
else
oWordActiveDoc.Shapes(I).Delete
Wscript.echo "----> Image supprimée" & vbCrLf
end if
end if
End If
loop until I = oWordActiveDoc.Shapes.Count

Wscript.echo "--------------------" & vbCrLf

Wscript.sleep 500

' On ferme le document Word
oWordActiveDoc.Activate

Wscript.echo "close"
oWordActiveDoc.close -1

' On plante systèmatiquement WINWORD à la sauvegarde
' du document si il contient des images linkées (cpu à 99%
' sur winword)

Le problème est reproductible sous Word "pur" en VBA sans
pilotage par VBS.

Dès le moment où on déclenche la sauvegarde, Word crashe.
(soit par save, soit par close)

La question est double :
- Comment sauvegarder sans crasher ?
- Est-il possible d'employer une autre méthode ?

Merci de vous pencher sur ce problème ardu.

@+

--
~Jean-Marc~
Contact : http://msmvps.com/docxp/contact.aspx
Site : http://perso.wanadoo.fr/doc.jm/ http://docxp.mvps.org
WebLog : http://msmvps.com/docxp/

7 réponses

Avatar
Circé
Bonsoir,

Moi je ferais plus simple et tout en vba.

Une insertion d'image est un champ INCLUDEPICTURE.
Il suffit de créer une macro où on visualise les champs et où on fait
un rechercher remplace de la partie du champ avec le chemin :
INCLUDEPICTURE "X:monserveurImage...
en mettant le nouveau chemin.

Cette partie peut se faire avec l'enregistreur de macro. Ne pas oublier
aussi de faire le recherche-remplace dans les entêtes si nécessaire.

Utiliser ensuite la batchmacro magique d'anacoluthe pour effectuer ce
remplacement dans la série de modèles. La batchmacro ouvre les
fichiers, exécute la macro choisie, enregistre les fichiers et les
ferment.
http://faqword.free.fr/download.php?lng=fr&pgs6" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faqword.free.fr/download.php?lng=fr&pgs6

Circé
http://faqword.free.fr

Il se trouve que ~Jean-Marc~ a formulé :
Bonjour à tous,

J'écris un petit script VBS pour automatiser le
changement de liens des images incluses dans
différents modèles de documents. (Les images
étaient linkées sur un serveur qui n'existe plus et
non sauvées avec les documents...)

Le script VBS en lui-même ne pose pas de problèmes,
c'est la partie VBA qui plante :

[snip]

' partie incluse dans une boucle d'énumération des fichiers .dot
' oWord est l'objet Word
' oWordActiveDoc est le .dot actuellement ouvert
' fso est le FileSystemObject de VBS
' NewImgs est le nouveau chemin vers les images

Do
I = I + 1
If oWordActiveDoc.Shapes(I).Type = 11 Then
iSPath = oWordActiveDoc.Shapes(I).LinkFormat.SourceFullName
if not fso.FileExists(iSPath) then
Wscript.echo "--> " & iSPath
iSPath = NewImgs & "" & fso.GetFileName(iSPath)
if fso.FileExists(iSPath) then
oWordActiveDoc.Shapes(I).LinkFormat.SourceFullName = iSPath
Wscript.echo "----> Lien remplacé : " & iSPath & vbCrLf
else
oWordActiveDoc.Shapes(I).Delete
Wscript.echo "----> Image supprimée" & vbCrLf
end if
end if
End If
loop until I = oWordActiveDoc.Shapes.Count

Wscript.echo "--------------------" & vbCrLf

Wscript.sleep 500

' On ferme le document Word
oWordActiveDoc.Activate

Wscript.echo "close"
oWordActiveDoc.close -1

' On plante systèmatiquement WINWORD à la sauvegarde
' du document si il contient des images linkées (cpu à 99%
' sur winword)

Le problème est reproductible sous Word "pur" en VBA sans
pilotage par VBS.

Dès le moment où on déclenche la sauvegarde, Word crashe.
(soit par save, soit par close)

La question est double :
- Comment sauvegarder sans crasher ?
- Est-il possible d'employer une autre méthode ?

Merci de vous pencher sur ce problème ardu.

@+


Avatar
~Jean-Marc~
Salutations *Circé* !
Dans <news:
tu nous disais :
Moi je ferais plus simple et tout en vba.

Une insertion d'image est un champ INCLUDEPICTURE.
Il suffit de créer une macro où on visualise les champs et où on fait
un rechercher remplace de la partie du champ avec le chemin :
INCLUDEPICTURE "X:monserveurImage...
en mettant le nouveau chemin.

Cette partie peut se faire avec l'enregistreur de macro. Ne pas
oublier aussi de faire le recherche-remplace dans les entêtes si
nécessaire.
Utiliser ensuite la batchmacro magique d'anacoluthe pour effectuer ce
remplacement dans la série de modèles. La batchmacro ouvre les
fichiers, exécute la macro choisie, enregistre les fichiers et les
ferment.
http://faqword.free.fr/download.php?lng=fr&pgs6


Merci pour la piste, je regarde ça Lundi ou Mardi et je vous tiens au courant.
(ça marche aussi sous Word 97, je suppose)

@+

--
~Jean-Marc~
Contact : http://msmvps.com/docxp/contact.aspx" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://msmvps.com/docxp/contact.aspx
Site : http://perso.wanadoo.fr/doc.jm/ http://docxp.mvps.org
WebLog : http://msmvps.com/docxp/

Avatar
Circé
Re...

Merci pour la piste, je regarde ça Lundi ou Mardi et je vous tiens au
courant.
(ça marche aussi sous Word 97, je suppose)


Oui, mais lis bien le lisez-moi d'anacoluthe qui se trouve dans le zip.
Il y a une petite différence.

Circé

@+


Avatar
Anacoluthe
Bonjour !

'~Jean-Marc~' nous a écrit ...
Le script VBS en lui-même ne pose pas de problèmes,
c'est la partie VBA qui plante :
- Comment sauvegarder sans crasher ?


Je n'ajouterai rien à la réponse de Circé (coucou!)

Juste pour dire qu'à la lecture rapide de votre code (incomplet)
vous vous exposez à une erreur de 'disqualification'
http://support.microsoft.com/kb/189618/fr
laquelle est peut-être à la source de votre plantage...

Anacoluthe
« Savez-vous planter les choux?
A la mode, à la mode.
Savez-vous planter les choux?
A la mode de chez nous? »
- Comptine traditionnelle

Avatar
~Jean-Marc~
Salutations *Anacoluthe* !
Dans <news:%23LPs$
tu nous disais :
Juste pour dire qu'à la lecture rapide de votre code (incomplet)


Oui, je n'ai pas voulu saturer les lecteurs par du code non essentiel
à la compréhension du problème.

vous vous exposez à une erreur de 'disqualification'
http://support.microsoft.com/kb/189618/fr
laquelle est peut-être à la source de votre plantage...


Je viens de lire l'article et je ne pense pas être dans ce cas là.

De plus, le problème est reproductible sous Word sans utiliser
VBS.

La nuit m'ayant porté conseil, je me suis également aperçu que
mon incrémentation (i = i + 1) était mal positionnée : elle n'a pas
lieu d'être lorsque je supprime un "Shapes".

En tout cas, je vérifierai ces points.

Merci de ton aide.

--
~Jean-Marc~
Contact : http://msmvps.com/docxp/contact.aspx" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://msmvps.com/docxp/contact.aspx
Site : http://perso.wanadoo.fr/doc.jm/ http://docxp.mvps.org
WebLog : http://msmvps.com/docxp/

Avatar
Anacoluthe
Bonjour !

'~Jean-Marc~' nous a écrit ...
De plus, le problème est reproductible sous Word sans utiliser
VBS.


OK ça élimine une erreur de qualification d'automation

La nuit m'ayant porté conseil, je me suis également aperçu que
mon incrémentation (i = i + 1) était mal positionnée


D'une façon générale, il faut être extrêmement prudent avec
des boucles comportant des itérations de ce genre
CollectionObjets(I).Delete
car en vba l'indexation et la réindexation des collections
varient énormément d'une classe d'objets à une autre ...

Si j'ai une collection de 3 objets et que je supprime
le premier, celui qui était n°2 est-il toujours indicé 2
ou est-il devenu n°1 ? Et le n°3 a-t-il encore un sens ?

Anacoluthe
« Il y a trois sortes de personnes : ceux qui savent compter
et ceux qui ne savent pas. »
- Benjamin DERECA

Avatar
~Jean-Marc~
Salutations *Anacoluthe* !
Dans <news:%
tu nous disais :
D'une façon générale, il faut être extrêmement prudent avec
des boucles comportant des itérations de ce genre
CollectionObjets(I).Delete
car en vba l'indexation et la réindexation des collections
varient énormément d'une classe d'objets à une autre ...

Si j'ai une collection de 3 objets et que je supprime
le premier, celui qui était n°2 est-il toujours indicé 2
ou est-il devenu n°1 ? Et le n°3 a-t-il encore un sens ?


Oui, c'est très "piègeux" et source d'erreurs. J'ai ajouté
un test IsNull dans mon code pour contrer une anomalie
de ce genre.

Bon, pour revenir à mon problème, il s'agit de "Shapes"
flottants et donc, pas de champ...

Après de nombreux essais et recherches, je ne vois pas
d'autre solution que de tout faire manuellement. Dès que
l'on ne fait qu'énumérer les shapes, ça plante à la fermeture
du document. (Je n'arrive pas non plus à faire un
ConvertToInlineShapes ou même un Shapes(I).delete
sans planter à la fermeture)

En plus, quand on lance la macro 2 fois de suite sans fermer
Word, il plante également assez sévèrement...

Il semblerait que ce soit un bug de Word 97...

En tout cas, merci de votre aide à tous les deux.

Cordialement

--
~Jean-Marc~
Contact : http://msmvps.com/docxp/contact.aspx" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://msmvps.com/docxp/contact.aspx
Site : http://perso.wanadoo.fr/doc.jm/ http://docxp.mvps.org
WebLog : http://msmvps.com/docxp/