OVH Cloud OVH Cloud

liens import:

11 réponses
Avatar
rick
Bonjour,

une fois que j'importe d'un fichier source(test1.xls) à un fichier de
destination(test2.xls).

comment enlever via une macro: le lien que j'ai dans les cellules du
classeur de destination

=[test1.xls]feuil1!S17

apres l'import je souhaite avoir
=feuil1!S17

merci d'avance

1 réponse

1 2
Avatar
MichDenis
Bonjour Rick,

A ) Pourquoi fais-tu une boucle sur chacune des feuilles ? Les liaisons sont définies au niveau du classeur. En clair, ce que la
petite procédure fait, elle modifie dans la fenêtre (barre des menus/ edition / liaisons /) liaison, la référence qui apparaîtrait
du classeur dont sont issues les données par le chemin et le nom du classeur dans lequel les données ont été copiées. En retournant
la référence vers le classeur lui-même, Excel retire cette référence des cellules. Excel met à jour lui-même le contenu de chacune
des cellules de tout le classeur (de toutes les feuilles) .

J'ai fait un petit test avec 3 feuilles dont la plage de cellule A1:AX1360 contenait des formules. Le temps requis pour faire le
travail est négligeable.

ATTENTION : la procédure supposait que toutes les liaisons sont issues du classeur source. Si dans le classeur Source, il y avait
plusieurs références à différents classeurs, ces références ne sont pas altérées par la procédure.

Ceci Rick, est mon dernier message sur le sujet. Je t'ai fourni plusieurs procédures sur le même sujet (copie de feuilles d'un
classeur à l'autre, et, toutes ne s'exécutent pas comme elles le devraient. Il y a sûrement des trucs dans ton classeur qui
interfèrent avec les procédures et que tu ne dis pas ou que tu ne sais pas. Moi, je n'ai pas d'autres alternatives à te proposer.


Salutations!




"rick" a écrit dans le message de news:
la macro d'import de données fonctionne bien, c'est seulement celle des liens
qui ne se terminent pas:

Sub feuil1_Bouton4_QuandClic()

Dim leClassACopier As Workbook
Dim leNouvClass As Workbook

'Set leNouvClass = ThisWorkbook
Set leClassACopier = Workbooks("test1.xls")
Set leNouvClass = Workbooks("test2.xls")
Dim sh As Worksheet

MsgBox "appuyer sur OK et patientez pendant l'import"
Dim I As Long
For I = 1 To Sheets.Count
Sheets(I).Unprotect "pa"

Next

On Error Resume Next
Windows(leClassACopier).Activate
'A adapter éventuellement avec le chemin qui va bien
If Err <> 0 Then Workbooks.Open (leClassACopier)
On Error GoTo 0
For Each sh In leClassACopier.Worksheets
If Not FeuilleExiste(leNouvClass, sh.Name) Then
leNouvClass.Worksheets.Add
leNouvClass.ActiveSheet.Name = sh.Name
leClassACopier.Worksheets(sh.Name).Cells.Copy _
leNouvClass.Worksheets(sh.Name).Range("A1")
leNouvClass.Worksheets(sh.Name).Visible = xlSheetVeryHidden
End If
If FeuilleExiste(leNouvClass, sh.Name) Then
leClassACopier.Worksheets(sh.Name).Cells.Copy _
leNouvClass.Worksheets(sh.Name).Range("A1")
Cells.Copy
Cells.PasteSpecial Paste:=xlPasteValues
'leNouvClass.Worksheets(sh.Name).Visible = xlSheetVeryHidden
End If
Next sh
Set sh = Nothing
For I = 1 To Sheets.Count
Sheets(I).Protect "pa"

Next
ModifierLiens Workbooks("test1.xls"), ThisWorkbook

MsgBox "import terminé"

End Sub
Function FeuilleExiste(wbk As Workbook, F As String) As Boolean
On Error Resume Next
Set Feuille = wbk.Worksheets(F)
FeuilleExiste = Err = 0
Err.Clear
End Function


Sub ModifierLiens(wkSource As Workbook, Wkdest As Workbook)
Dim Liens As Variant, LeLien
Dim I As Long
For I = 1 To Sheets.Count
Sheets(I).Unprotect "pa"
Next
Liens = Wkdest.LinkSources(xlExcelLinks)
For Each LeLien In Liens
If LeLien = wkSource.FullName Then
Wkdest.ChangeLink LeLien, Wkdest.FullName, xlExcelLinks
Wkdest.UpdateLink LinkSources
End If
Next
For I = 1 To Sheets.Count
Sheets(I).Unprotect "pa"
Next
End Sub


merci d'avance


Pourquoi ne pas publier l'intégralité de ta macro ?


Salutations!



"rick" a écrit dans le message de news:
l'execution de la macro met toujours autant de temps, meme avec ces lignes.

le sablier, est toujours présent?

je ne compren,d pas ?

merci d'avance


Bonjour Rick,

Introduit ceci dans ta procédure :

Place ceci avant d'exécuter la ligne de code
'------------------------------
Dim Kal As Long
Kal = Application.Calculation
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
'------------------------------

LaLigneDeCode

'Après la ligne de code
'----------------------------
Application.Calculation = Kal
Application.EnableEvents = True
'----------------------------


Salutations!



"rick" a écrit dans le message de news:
je parle de la macro de ce fil, car sur mon classeur, je copie environ 7
feuilles,
et pour enlever les liens cela met un temps fou?

je ne comprend pas pourquoi?

mes liens sont sur 450 lignes, comemnt accelerer la macro.

merci d'avance



Bonjour Rick,

Je ne sais pas de quelle macro que tu parles, mais celle que je propose sur ce fil, ne prend pas plus d'une seconde et encore
!!!


Salutations!


"rick" a écrit dans le message de news:
bonjour,
la macro fonctionne mais les temps d'executions sont très long, ce qui me
genere des message de memoire inssufisante, comment faire pour le limiter à
450 lignes seulement?
ainsi la macro va scruter seulement 450 ligne.s

Cela sera sans doute moins long?

merci d'avance




Bonjour Rick,

Après la section qui copie les données d'un classeur à l'autre. Quand le tout le processus de la copie est terminée, tu
insères
la
ligne de code. .Évidemment, les 2 classeurs doivent être ouverts.

Salutations!


"rick" a écrit dans le message de news:

merci j'essaie et je te tiens au courant,

mais a quelle niveau de mon programme, je doit mettre
cette ligne: ModifierLiens Workbooks("classeur1.xls"), ThisWorkbook

merci



Bonjour Rick,

Pour briser les liens après avoir importé des plages de cellules :

Tu inscris dans ta procédure d'importation des données cette ligne de code après que l'importation ait été effectuée

Workbooks("classeur1.xls") = Représente le classeur source d'où les données importées sont issues
ThisWorkbook = Représente le classeur de destination vers où les données ont été copiées.

IMPORTANT : Les 2 paramètres de la procédure appelée doivent être des objets représentants des classeurs. Il existe
différentes
possibilités comme dans mon exemple, ou en utilisant des VARIABLES DÉCLARÉES AS WORKBOOK qui pointent sur les 2 classeurs
impliqués
dans la transaction.

'Voici la ligne de commande à inscrire dans ton code
ModifierLiens Workbooks("classeur1.xls"), ThisWorkbook


à copier dans un module standard.
'-----------------------------------
Sub ModifierLiens(WkSource As Workbook, Wkdest As Workbook)
Dim Liens As Variant, LeLien

Liens = Wkdest.LinkSources(xlExcelLinks)
For Each LeLien In Liens
If LeLien = WkSource.FullName Then
Wkdest.ChangeLink LeLien, Wkdest.FullName, xlExcelLinks
Wkdest.UpdateLink LinkSources
End If
Next
End Sub
'-----------------------------------


Salutations!



"rick" a écrit dans le message de news:

Bonjour,

une fois que j'importe d'un fichier source(test1.xls) à un fichier de
destination(test2.xls).

comment enlever via une macro: le lien que j'ai dans les cellules du
classeur de destination

=[test1.xls]feuil1!S17

apres l'import je souhaite avoir
þuil1!S17

merci d'avance

























1 2