Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/05/2011, 12h09   #1
Invité de passage
 
Homme
Rédacteur technique
Inscription : mars 2004
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Rédacteur technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2004
Messages : 17
Points : 3
Points : 3
Envoyer un message via AIM à Selpoivre Envoyer un message via MSN à Selpoivre Envoyer un message via Yahoo à Selpoivre
Par défaut Enregistrer les images à l'intérieur du fichier Word

Bonjour à tous !

Je viens à vous car je rencontre un problème assez pénible avec un bout de code VBA depuis mon passage de Word 2007 à Word 2010.

Sous 2007, le bout de code suivant fonctionnait parfaitement et me permettait d'inclure automatiquement toutes les images d'un document dans ce document (le fichier Word est généré par une autre appli qui enregistre les images séparément).

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    'First, embed all document images in Word file
    With ActiveDocument
        ' embed linked InlineShapes
        For idx = .InlineShapes.Count To 1 Step -1
            Set oILS = .InlineShapes(idx)
            If Not oILS.LinkFormat Is Nothing Then
                oILS.LinkFormat.SavePictureWithDocument = True
                oILS.LinkFormat.BreakLink
            End If
        Next
 
        ' embed linked Shapes
        For idx = .Shapes.Count To 1 Step -1
            Set oShp = .Shapes(idx)
            If Not oShp.LinkFormat Is Nothing Then
                oShp.LinkFormat.SavePictureWithDocument = True
                oShp.LinkFormat.BreakLink
            End If
        Next
    End With
Sous 2010, j'obtiens l'erreur suivante :
Citation:
Run-time error '5352'
The link does not exist.
Après investigation, il semblerait que la méthode LinkFormat retourne désormais un objet en lecture seule (alors qu'en 2007 et avant, cet objet pouvait être modifié).

Quelqu'un saurait comment contourner ce problème ou forcer l'objet LinkFormat à accepter les modifs ?

D'avance merci !


SP
Selpoivre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 00h47   #2
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonsoir.

A mon avis, la propriété LinkFormat renvoie un objet LinkFormat, comme avec 2007.

Par contre, plutôt que de vérifier si Shape contient un objet LinkFormat, je pense qu'il serait préférable de vérifier son type. Ainsi, pour les inlineShapes, je remplacerais
Code :
If Not oILS.LinkFormat Is Nothing Then
Par :
Code :
If oILS.Type = wdInlineShapeLinkedPicture Then
Mais ce n'est qu'une idée, et peut-être pas la bonne!

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 09h39   #3
Invité de passage
 
Homme
Rédacteur technique
Inscription : mars 2004
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Rédacteur technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2004
Messages : 17
Points : 3
Points : 3
Envoyer un message via AIM à Selpoivre Envoyer un message via MSN à Selpoivre Envoyer un message via Yahoo à Selpoivre
Hello ! Merci pour le coup de main

J'ai déjà essayé cette astuce mais malheureusement cela ne résout rien.

En fait l'objet LinkFormat retourné est bien valide, seulement il est retourné en "lecture seule" (alors qu'en 2007 il était en read/write). C'est ce que la doc officielle m'a confirmé d'ailleurs.

Du coup je pensais utiliser ce bout de code pour supprimer chaque image et la remplacer par la même "embeddée" mais cela ne semble pas fonctionner non plus :

Code :
1
2
3
4
5
6
7
8
    For Each InlineShape In ActiveDocument.InlineShapes
        If Not InlineShape.LinkFormat Is Nothing Then
            Set oILS = InlineShape
            fileName = ActiveDocument.Path & "/" & oILS.LinkFormat.SourcePath & "/" & oILS.LinkFormat.SourceName
            Set newInlineImage = ActiveDocument.InlineShapes.AddPicture(fileName, False, True, oILS.Range)
            oILS.Delete
        End If
    Next
Tu aurais une idée ?
Selpoivre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 13h57   #4
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonjour

Citation:
Envoyé par Selpoivre Voir le message
En fait l'objet LinkFormat retourné est bien valide, seulement il est retourné en "lecture seule" (alors qu'en 2007 il était en read/write). C'est ce que la doc officielle m'a confirmé d'ailleurs.
Je suis très surpris par cette info . Quelle est cette doc officielle?

Ce n'est pas du tout ce que je vois dans la doc Wd 2010 et d'ailleurs j'ai testé le code suivant
Code :
1
2
3
4
5
6
7
8
9
10
11
12
Sub testphoto()
Dim oILS As Word.InlineShape
 
For Each oILS In ThisDocument.InlineShapes
    If oILS.Type = wdInlineShapeLinkedPicture Then
        MsgBox oILS.LinkFormat.SourceFullName
        oILS.LinkFormat.SavePictureWithDocument = True
        oILS.LinkFormat.BreakLink
    End If
Next oILS
 
End Sub
Et cela fonctionne très bien

Je pense que le pb est ailleurs.

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 14h58   #5
Invité de passage
 
Homme
Rédacteur technique
Inscription : mars 2004
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Rédacteur technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2004
Messages : 17
Points : 3
Points : 3
Envoyer un message via AIM à Selpoivre Envoyer un message via MSN à Selpoivre Envoyer un message via Yahoo à Selpoivre
C'est l'aide en ligne qui m'affirme cela (celle qui s'affiche lorsque je fais F1)...

J'ai essayé ton code (en remplaçant ThisDocument par ActiveDocument parceque ma Sub se trouve dans le Normal.dotm) mais j'obtiens toujours la même erreur
Selpoivre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 15h37   #6
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Selpoivre,

Citation:
Envoyé par Selpoivre Voir le message
C'est l'aide en ligne qui m'affirme cela (celle qui s'affiche lorsque je fais F1)...
Peux-tu copier le texte correspondant?

C'est quelle ligne du code qui lève une erreur?

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 15h50   #7
Invité de passage
 
Homme
Rédacteur technique
Inscription : mars 2004
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Rédacteur technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2004
Messages : 17
Points : 3
Points : 3
Envoyer un message via AIM à Selpoivre Envoyer un message via MSN à Selpoivre Envoyer un message via Yahoo à Selpoivre
C'est la ligne suivante qui lève l'erreur "the link does not exist" :
Code :
oILS.LinkFormat.SavePictureWithDocument = True
Pour la doc, j'avoue que je me sens assez bête : je suis persuadé qu'hier elle indiquait "read boolean" ou quelque chose du genre. Là cette aprem elle indique effectivement bien Read/write
Soit j'ai mal lu toute la journée d'hier soit c'était une typo corrigée entre temps...

Encore merci pour ton aide !
Selpoivre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 17h05   #8
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Re,

Citation:
Envoyé par Selpoivre Voir le message
C'est la ligne suivante qui lève l'erreur "the link does not exist" :
Code :
oILS.LinkFormat.SavePictureWithDocument = True
Et tu as d'abord bien fait le test
Code :
If oILS.Type = wdInlineShapeLinkedPicture Then
?

A ce stade, il faut être très précis. Peux-tu donner ton code modifié en précisant la première erreur levée?

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 17h34   #9
Invité de passage
 
Homme
Rédacteur technique
Inscription : mars 2004
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Rédacteur technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2004
Messages : 17
Points : 3
Points : 3
Envoyer un message via AIM à Selpoivre Envoyer un message via MSN à Selpoivre Envoyer un message via Yahoo à Selpoivre
voilà mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Sub test()
    Dim oILS As InlineShape
    'Dim newInlineImage As InlineShape
    'Dim fileName As String
 
    Dim oShp As Shape
    'Dim newImage As Shape
 
    For Each oILS In ActiveDocument.InlineShapes
        MsgBox (oILS.LinkFormat.SourceFullName)
        If oILS.Type = wdInlineShapeLinkedPicture Then
            'MsgBox oILS.LinkFormat.SourceFullName
            oILS.LinkFormat.SavePictureWithDocument = True
            oILS.LinkFormat.BreakLink
        End If
    Next oILS
 
    For Each oShp In ActiveDocument.Shapes
        MsgBox (oShp.LinkFormat.SourceFullName)
        If oShp.Type = wdShapeLinkedPicture Then
            'MsgBox oShp.LinkFormat.SourceFullName
            oShp.LinkFormat.SavePictureWithDocument = True
            oShp.LinkFormat.BreakLink
        End If
    Next oShp
 
End Sub
La première erreur est levée à la ligne 13.
Je ne sais pas si cela a une importance mais le code est situé dans le fichier Normal.dotm (je n'ai pas le choix, la méthode devra être appelée pour un paquet de fichiers différents) et le fichier sur lequel je travaille est un .doc (format 2003 normalement donc).
Selpoivre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 18h15   #10
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Re,

Je viens de faire la manip :
  • je crée un .doc avec Wd 2000
  • Sur un poste Wd 2010, je mets la macro dans Normal
  • J'active le .doc et je lance la procédure
AU résultat, cela fonctionne. Le code que j'utilise ne diffère que par l'endroit des MsgBox
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub test()
    Dim oILS As InlineShape
    'Dim newInlineImage As InlineShape
    'Dim fileName As String
 
    Dim oShp As Shape
    'Dim newImage As Shape
 
    For Each oILS In ActiveDocument.InlineShapes
        If oILS.Type = wdInlineShapeLinkedPicture Then
            MsgBox oILS.LinkFormat.SourceFullName
            oILS.LinkFormat.SavePictureWithDocument = True
            oILS.LinkFormat.BreakLink
        End If
    Next oILS
 
    For Each oShp In ActiveDocument.Shapes
        If oShp.Type = wdShapeLinkedPicture Then
            MsgBox oShp.LinkFormat.SourceFullName
            oShp.LinkFormat.SavePictureWithDocument = True
            oShp.LinkFormat.BreakLink
        End If
    Next oShp
 
End Sub La première erreur est l
Tu rencontres la première erreur sur la ligne 13 de ton code. DOnc tu passes par un MsgBox en 10. Ca affiche quoi?

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 15h09   #11
Invité de passage
 
Homme
Rédacteur technique
Inscription : mars 2004
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Rédacteur technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2004
Messages : 17
Points : 3
Points : 3
Envoyer un message via AIM à Selpoivre Envoyer un message via MSN à Selpoivre Envoyer un message via Yahoo à Selpoivre
Hello !

Si je lance ton code sans le retoucher, j'obtient tout d'abords ce message :
Citation:
gif/Highlight.gif
(ce qui correspond bien au chemin complet de la première image du document).

Puis l'erreur suivante se déclenche sur la ligne oILS.LinkFormat.SavePictureWithDocument = True
Citation:
Run-time error '5352':
The link does not exist.
Selpoivre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 17h00   #12
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonjour.

Je trouve ce chemin complet un peu court, pas très complet pour tout dire.Mais tu dis que c'est le bon.

Je pense qu'on ne peut plus améliorer le code et que le pb est ailleurs.

L'erreur semble indiquer qu'il n'y a rien au bout du lien sur la machine qui travaille. Il faudrait vérifier cela.

Si ça ne donne rien, je te propose d'essayer sur une autre machine.

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 18h09   #13
Invité de passage
 
Homme
Rédacteur technique
Inscription : mars 2004
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Rédacteur technique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2004
Messages : 17
Points : 3
Points : 3
Envoyer un message via AIM à Selpoivre Envoyer un message via MSN à Selpoivre Envoyer un message via Yahoo à Selpoivre
Bonjour,

Désolé pour le temps de réponse mais j'ai été pas mal accaparé par autre chose ces jours-ci...

J'ai vérifié et il y a bien un fichier à cet emplacement relatif. Malheureusement je n'ai pas d'autre machine avec Word 2010 sous la main pour tester. Je vais essayer de dégager un peu de temps pour monter une VM et tester ça d'ici le début de semaine prochaine.

Tu penses que ca pourrait venir d'un problème de paramétrage de Word sinon ?
Selpoivre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 22h48   #14
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonsoir

Citation:
Envoyé par Selpoivre Voir le message
J'ai vérifié et il y a bien un fichier à cet emplacement relatif.
En l'occurence, c'est aspect relatif m'inquiète un peu. A ta place j'irais au bout des investigations dans ce sens...

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h14.


 
 
 
 
Partenaires

Hébergement Web