FAQ Excel
FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
Il est possible d'utiliser :
Application.AskToUpdateLinks
=
True
Néanmoins cela ne supprime que la boîte de dialogue et les liaisons sont mises à jour. Pour empêcher la mise à jour des liaisons sans boîte de dialogue, il faut mettre le paramètre UpdateLinks de la méthode Open de l'objet Workbook à False.
Vous pouvez obtenir une vue des liaisons en utilisant le menu Edition/Liaisons.
La boîte de dialogue qui s'affiche permet de gérer ces liaisons.
La macro ci dessous extrait les fichiers liés au classeur. Une option permet de vérifier si le chemin du fichier lié existe toujours sur le disque dur.
Sub
ExtraitDocumentLies
(
)
Dim
TabLiaisons As
Variant
Dim
x As
Integer
'Renvoie un tableau de TabLiaisons
TabLiaisons =
ThisWorkbook.LinkSources
'Vérifie si le tableau est vide
If
Not
IsEmpty
(
TabLiaisons) Then
'Boucle sur le tableau
For
x =
1
To
UBound
(
TabLiaisons)
Debug.Print
TabLiaisons
(
x)
If
Dir
(
TabLiaisons
(
x)) =
""
Then
_
MsgBox
"La liaison est erronée:"
&
vbCrLf
&
_
"'"
&
TabLiaisons
(
x) &
"'"
Next
x
End
If
End
Sub
Ce n'est pas toujours évident. Pour supprimer les liaisons il y a globalement deux méthodes. Une recherche complète permettant la récupération de ce qui est récupérable
Sub
ChercheLiaison
(
)
Dim
NomFichier As
String
, MonClasseur As
Workbook, Liaisons As
Variant
Dim
compteur As
Long
, comptCar As
Long
, Cible As
Range
Dim
FirstAddress As
String
, PlageLiee As
Range, comptFeuille As
Long
, Reponse As
Integer
Dim
MaFeuille As
Worksheet, MonGraphe As
Chart, MonGraphe1 As
ChartObject, MaSerie As
Series
NomFichier =
Application.GetOpenFilename
Workbooks.Open
NomFichier, False
Set
MonClasseur =
ActiveWorkbook
Liaisons =
MonClasseur.LinkSources
If
IsEmpty
(
Liaisons) Then
Exit
Sub
'parcours les feuilles
For
Each
MaFeuille In
MonClasseur.Worksheets
MaFeuille.Activate
MaFeuille.Cells.Select
For
compteur =
1
To
UBound
(
Liaisons)
For
comptCar =
Len
(
Liaisons
(
compteur)) To
1
Step
-
1
If
Mid
(
Liaisons
(
compteur), comptCar, 1
) =
"\"
Then
Liaisons
(
compteur) =
Mid
(
Liaisons
(
compteur), comptCar +
1
)
Exit
For
End
If
Next
comptCar
Set
Cible =
Selection.Find
(
What:=
Liaisons
(
compteur), After:=
ActiveCell, LookIn:=
xlFormulas, _
LookAt:=
xlPart, SearchOrder:=
xlByRows, SearchDirection:=
xlNext, _
MatchCase:=
False
)
If
Not
Cible Is
Nothing
Then
FirstAddress =
Cible.Address
Do
If
PlageLiee Is
Nothing
Then
Set
PlageLiee =
Cible Else
Set
PlageLiee =
Union
(
PlageLiee, Cible)
Set
Cible =
Selection.FindNext
(
After:=
Cible)
Loop
While
Not
Cible Is
Nothing
And
Cible.Address
<>
FirstAddress
End
If
Next
compteur
If
Not
PlageLiee Is
Nothing
Then
Reponse =
MsgBox
(
"La feuille "
&
MaFeuille.Name
&
" contient "
&
PlageLiee.Cells.Count
&
_
" cellules avec des liaisons"
&
vbCrLf
&
_
"voulez-vous les supprimer ?"
, vbYesNo
+
vbQuestion
, "Liaisons trouvées"
)
If
Reponse =
6
Then
For
Each
Cible In
PlageLiee.Cells
Cible.Formula
=
Cible.Value
Next
End
If
Set
PlageLiee =
Nothing
End
If
For
Each
MonGraphe1 In
MaFeuille.ChartObjects
For
Each
MaSerie In
MonGraphe1.SeriesCollection
For
compteur =
1
To
UBound
(
Liaisons)
If
InStr
(
1
, MaSerie.Formula
, Liaisons
(
compteur), vbTextCompare) >
0
Then
Reponse =
MsgBox
(
"le graphe de la feuille "
&
MonGraphe1.Name
&
_
" contient une série "
&
MaSerie.Name
&
" avec des liaisons"
&
vbCrLf
&
_
"Voulez-vous les supprimer ?"
, vbYesNo
+
vbQuestion
, "Liaisons trouvées"
)
If
Reponse =
6
Then
MaSerie.Delete
Exit
For
End
If
End
If
Next
compteur
Next
Next
Next
For
Each
MonGraphe In
MonClasseur.Charts
For
Each
MaSerie In
MonGraphe.SeriesCollection
For
compteur =
1
To
UBound
(
Liaisons)
If
InStr
(
1
, MaSerie.Formula
, Liaisons
(
compteur), vbTextCompare) >
0
Then
Reponse =
MsgBox
(
"le graphe de la feuille "
&
MonGraphe.Name
&
_
" contient une série "
&
MaSerie.Name
&
" avec des liaisons"
&
vbCrLf
&
_
"voulez-vous les supprimer ?"
, vbYesNo
+
vbQuestion
, "Liaisons trouvées"
)
If
Reponse =
6
Then
MaSerie.Delete
Exit
For
End
If
End
If
Next
compteur
Next
Next
End
Sub
Une méthode beaucoup plus violente qui consiste à modifier les liaisons par le nom du classeur source. Cela va créer des références circulaires qu'il faudra alors supprimer. Les données anciennement liées seront perdues.
Dim
Nom As
String
, objWorkbook As
Workbook, TabLiaison As
Variant
, cmpt As
Long
Dim
objWorksheet As
Worksheet, objRange As
Range
Set
objWorkbook =
Application.Workbooks.Open
(
Application.GetOpenFilename
, UpdateLinks:=
0
)
TabLiaison =
objWorkbook.LinkSources
(
xlExcelLinks)
If
IsEmpty
(
TabLiaison) Then
Exit
Sub
For
cmpt =
LBound
(
TabLiaison) To
UBound
(
TabLiaison)
objWorkbook.ChangeLink
TabLiaison
(
cmpt), objWorkbook.FullName
, xlLinkTypeExcelLinks
Next
cmpt
For
Each
objWorksheet In
objWorkbook.Worksheets
Do
Set
objRange =
objWorksheet.CircularReference
If
Not
objRange Is
Nothing
Then
objRange.Value
=
objRange.Value
Loop
While
Not
objRange Is
Nothing
Next
objWorksheet