Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
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/01/2012, 12h53   #1
Membre habitué
 
Avatar de CODYCO
 
Homme
Webplanneur
Inscription : avril 2009
Messages : 141
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Webplanneur
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 141
Points : 144
Points : 144
Par défaut liaison avec word

Bonjour à tous et bonne année!

Dans un document word je possède un grand nombre de liaison excel créer par copier collage spéciale avec liaison sur des tableaux excel.

Je souhiaterais pouvoir modifier le chemin de la source excel par code vba afin de ne pas avoir a répéter l'opération, modifier la source et aller pointé le bon fichier.

J'ai chercher sur le forum et sur nénette mais je ne trouve pas mon bonheur.
J'ai quelques piste avec "Fields" "Fields.Index" ou ".Text" et ".code" mais je ne parviens pas à modifier le chemin et mettre à jour.

Merci d'avance
CODYCO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 15h26   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Tu es sur la bonne piste je pense.
En bouclant sur les Fields, il faut tester le Type, vérifier qu'il soit bien wdFieldLink.
Si c'est le cas, tu peux modifier la propriété LinkFormat.SourceFullName.

Je n'ai pas fait de test, mais essaie déjà avec ça.

PS : C'est du VBA Word et non Excel...

Voici un bout de code que j'ai testé. Ca à l'air de marcher, je n'ai pas préparé de documents pour faire des tests plus importants. Il faut juste se méfier car j'ai l'impression que quand tu changes le SourceFullName, il créé un autre Field.

Après, j'ai mis un fichier bidon, mais il faut adapter en fonction de ce que tu veux faire (le même fichier pour tous les liens, juste le chemin qui change pour chaque fichier...)
Il y a aussi des propriétés pour modifier les plages concernées et tout.

Code :
1
2
3
4
5
6
7
8
9
10
Dim f As Field
Dim i As Integer
 
For i = 1 To ThisDocument.Fields.Count
    Set f = ThisDocument.Fields(i)
 
    If f.Type = wdFieldLink Then
        f.LinkFormat.SourceFullName = "D:\Classeur1.xls"
    End If
Next i
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 08h27   #3
Membre habitué
 
Avatar de CODYCO
 
Homme
Webplanneur
Inscription : avril 2009
Messages : 141
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Webplanneur
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 141
Points : 144
Points : 144
Par défaut re

Je te remercie pour ce bout de code qui est plus propre et plus net que le miens, mais nous sommes sur le meme fonctionnement.
Il semblerait pourtant que cela ne fonctionne pas parfaitement, du moins avec mon code, a savoir que sur d'ancien document la modification ne se fait pas, alors que si je créer un nouveau doc et un nouvel objet le code fonctionne parfaitement.

Je re teste avec ton code et reviens vers toi pour je l'espere cloturer ce sujet et te remercier...

Code :
1
2
3
4
5
6
7
8
9
10
11
 
For Each aField In ActiveDocument.Fields
        With aField
        If .Type = wdFieldLink Then
        With .LinkFormat
            .SourceFullName = "W:\ECM\Exploitation\2012\Rapports d'exploitation\CBRE\MONTREUIL - Terra Nova II\2012 Conso_Terra Nova II HQE.xls"
            .AutoUpdate = True
       End With
        End If
        End With
    Next aField
CODYCO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 10h04   #4
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Il faut se méfier du For ... Each, car comme je te le disais, j'ai l'impression qu'il créé un nouveau Field quand on modifie le chemin, du coup, ça risque de tourner en boucle.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 11h34   #5
Membre habitué
 
Avatar de CODYCO
 
Homme
Webplanneur
Inscription : avril 2009
Messages : 141
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Webplanneur
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 141
Points : 144
Points : 144
Bon avec ton code j'ai bien avancé voila ou j'en suis :

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
28
 
Sub liaison()
'Mise à jour du chemin de liaison avec excel
Dim f As Field
Dim i As Integer
Dim Source As Variant
Dim objExcel
 
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
Set objExcel = Application.FileDialog(msoFileDialogFilePicker)
With objExcel
If .Show = -1 Then
            For Each Source In .SelectedItems
                chemin = Source
            Next Source
End If
End With
 
'Boucle et compte le nombre d'objet du document
For i = 1 To ThisDocument.Fields.Count
    Set f = ThisDocument.Fields(i)
'Vérifie le type d'objet, si bien un objet coller excel, alors change le chemin source
    If f.Type = wdFieldLink Then
            f.LinkFormat.SourceFullName = chemin 
    End If
Next i
End Sub
L'ouverture de la boite de dialogue permet à l'utilisateur de définir le fichier de liaison stocker dans la variable chemin.

Tout fonctionne bien, sauf le problème des graphiques, il plante sur la liaison des graphiques.

Dans le label du "Field" il ne trouve de correspondance de cellule (cellule vide)

Je pense que le type du Field pour les graphique est différent et qu'il doit etre testé, mais je ne trouve pas quel est le type OLE pour les graphiques.

Avez vous une idée pour ce problème?

Merci
CODYCO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 11h45   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
J'avais trouvé celui pour les plages de cellules en jouant avec le débuggeur, tu dois pouvoir faire pareil non ?
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 12h57   #7
Membre habitué
 
Avatar de CODYCO
 
Homme
Webplanneur
Inscription : avril 2009
Messages : 141
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Webplanneur
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 141
Points : 144
Points : 144
Justement c'est ce que j'ai charger a faire, mias je ne vois pas...
CODYCO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 14h12   #8
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Après un petit test, c'est le même type.
Par contre, il faut peut-être également modifié le OleFormat.Label qui a l'air de contenir le nom du classeur.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 15h46   #9
Membre habitué
 
Avatar de CODYCO
 
Homme
Webplanneur
Inscription : avril 2009
Messages : 141
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Webplanneur
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 141
Points : 144
Points : 144
Désolé mais je ne comprend pas ce que tu veux dire par modifié le OLEFormat label. Effectivement le type est identique c'est ce que j'avais vu.
Dans le OLE format label l'index du graphique est contenu donc je ne vois pas pourquoi le modifier. Le nom étant le même il devrait pouvoir faire la mise à jour uniquement du chemin?
CODYCO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 19h14   #10
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
En fait, de mon coté, j'avais l'impression quand dans ce label, il y avait à la fois le chemin du fichier et le nom du graphique.
Mes tests étaient peut-être un peu trop rapide, je ne sais pas.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 09h39   #11
Membre habitué
 
Avatar de CODYCO
 
Homme
Webplanneur
Inscription : avril 2009
Messages : 141
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Webplanneur
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 141
Points : 144
Points : 144
c'est bien ca dans le cas d'un tableau tu as le nom de l'onglet et les références du tableau et d'un graphique le nom de l'onglet et l'index du graphique.

La solution serait de pouvoir identifier quand l'objet est un graphique ou un tableau.
De pouvoir obtenir la liste des graphiques contenu dans l'onglet permettrais aussi de stocké ce nom et de le comparé.

Mais je n'arrive pas à obtenir cette liste...
CODYCO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 10h14   #12
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Bon, je me suis créé 2 fichiers excel pour faire le test. En fait ça marche très bien pour les plages de cellules et pour les graphiques "onglet", mais pas pour les graphiques intégrés à une feuille.
Parce que leur propriété .OleFormat.Label est de la forme Feuil1![nomFichier.xls]Feuil1 Graphique 1 et que cette propriété est en lecture seule je n'arrive donc pas à la modifier avec le code suivant :

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
28
29
30
Option Explicit
 
Private Const chemin1 As String = "D:\DONNEES\Downloads\test\version1.xls"
Private Const chemin2 As String = "D:\DONNEES\Downloads\test\version2.xls"
 
 
Public Sub changerChemin()
    Dim i As Integer
    Dim f As Field
    Dim newChemin As String
    Dim oldName As String
    Dim newName As String
 
    For i = 1 To ThisDocument.Fields.Count
        Set f = ThisDocument.Fields(i)
        If f.Type = wdFieldLink Then
            oldName = f.LinkFormat.SourceName
            If f.LinkFormat.SourceFullName = chemin1 Then
                newChemin = chemin2
            Else
                newChemin = chemin1
            End If
 
            newName = Mid(newChemin, InStrRev(newChemin, "\") + 1)
 
            f.LinkFormat.SourceFullName = newChemin
            f.OLEFormat.Label = Replace(f.OLEFormat.Label, "[" & oldName & "]", "[" & newName & "]")
        End If
    Next i
End Sub
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 11h49   #13
Membre habitué
 
Avatar de CODYCO
 
Homme
Webplanneur
Inscription : avril 2009
Messages : 141
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Webplanneur
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 141
Points : 144
Points : 144
Avant tout je te remercie de toutes ces investigations...

J'en suis arriver depuis ce matin à la même conclusion que toi je chercher justement à renomer la propriété "OLEFormat.Label" qui contient justement l'onglet et le nom du graphique mais ce n'est effectivement pas possible apparement.

Ta solution semble etre viable, le couack pour moi est que j'ai une floppé de graphique, ce qui me ferais autant d'onglet. De plus vu ma quantité de doc du meme type il faudrait que je commence par repositionner les graphs sur des onglets, pas glop!

Je vais faire une derniere tentative en détectant le mot "graphique" dans ce fameux label et en fonction rompre le lien et le refaire, mais je n' ycrois pas trop.

Je ne ferme pas la discusion pour le moment juste au cas ou qq d'autres aurait une idée "lumineuse"...
CODYCO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 12h08   #14
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Oui, je pensais à ça en dernier recours, effacer et recréer la liaison. C'est possible mais un peu lourd...
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 11h47   #15
Membre habitué
 
Avatar de CODYCO
 
Homme
Webplanneur
Inscription : avril 2009
Messages : 141
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Webplanneur
Secteur : Bâtiment

Informations forums :
Inscription : avril 2009
Messages : 141
Points : 144
Points : 144
Par défaut YES!!

Bon finalement l'idée lumineuse elle sera pour moi, mais je dois quand meme rendre un grand merci à Zebreloup pour son active participation

Je vous donne mon code finale...

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
Sub ModifLien()
Dim alink As Field, linktype As Range, linkfile As Range
Dim linklocation As Range, i As Integer, j As Integer, linkcode As Range
Dim Message, Title, Default, Newfile
Dim counter As Integer
 
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
Set objExcel = Application.FileDialog(msoFileDialogFilePicker)
With objExcel
If .Show = -1 Then
            For Each Source In .SelectedItems
                chemin = Source
                Temp = Replace(chemin, "\", "\\")
                chemin = "\\\\" & Temp
            Next Source
End If
End With
 
counter = 0
For Each alink In ActiveDocument.Fields
If alink.Type = wdFieldLink Then
 
Set linkcode = alink.Code
i = InStr(linkcode, Chr(34))
Set linktype = alink.Code
linktype.End = linktype.Start + i
j = InStr(Mid(linkcode, i + 1), Chr(34))
Set linklocation = alink.Code
linklocation.Start = linklocation.Start + i + j - 1
If counter = 0 Then
Set linkfile = alink.Code
linkfile.End = linkfile.Start + i + j - 1
linkfile.Start = linkfile.Start + i
Message = "Veuillez confirmer le nouveau chemin"
Format " & linkfile "
Title = "Update Lien"
Default = chemin
Newfile = InputBox(Message, Title, Default)
End If
linkcode.Text = linktype & Newfile & linklocation
counter = counter + 1
End If
Next alink
End Sub
Voila apres 2 jours de prise de tête je suis assé satisfait du résultat.

Si vous le souhaitez vous pouvez toujours noter la discution...
CODYCO est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/01/2012, 12h03   #16
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Bien joué, je n'avais pas fouillé dans le .Code
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h37.


 
 
 
 
Partenaires

Hébergement Web