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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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.
@+
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:\monserveur\Image...
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
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 ?
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
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~
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)
Salutations *Circé* !
Dans <news:mn.8d057d5974f04d83.20493@aea.gr>
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:\monserveur\Image...
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)
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)
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é
@+
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
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
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
~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.
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".
Salutations *Anacoluthe* !
Dans <news:%23LPs$LEvFHA.3452@TK2MSFTNGP14.phx.gbl>
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".
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".
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
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
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
~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...
Salutations *Anacoluthe* !
Dans <news:%23OisGJIvFHA.3792@TK2MSFTNGP10.phx.gbl>
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...
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...