XL 2016 Nom d'un fichier d'une cellule copiée d'un autre classeur

RomainPOIRET

XLDnaute Occasionnel
Bonjour à tous,

Voici le contexte :

Je copie le contenu d'une cellule "A1" du classeur "B" que je colle dans un classeur "A", en cellule "A1",
Je souhaiterai avoir le nom du fichier du classeur "B" (dont le contenu de la cellule a été copié) dans la cellule "A2" de mon classeur "A"
Est-ce possible ?

Merci d'avance pour vos réponses,

Romain
 
Solution
Bonsoir RomainPOIRET,

Il suffit d'ajouter une ligne dans la macro pour obtenir le chemin d'accès :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Target(1)
With Application
    If Intersect(Target, Columns(1)) Is Nothing Or .CutCopyMode = 0 Then Exit Sub
    .ScreenUpdating = False
    .EnableEvents = False
    On Error Resume Next 'sécurité
    Paste Link:=True 'collage avec liaison
    If Selection.Count > 1 Then Application.DisplayAlerts = False: Application.Quit 'sécurité
    Target(1, 2) = Mid(Target.Formula, 3)
    Target(1, 2) = Replace(Left(Target(1, 2), InStr(Target(1, 2), "]") - 1), "[", "")
    Target(1, 2) = Workbooks(Target(1, 2).Text).FullName 'avec le chemin d'accès
    Target = Target 'supprime la...

job75

XLDnaute Barbatruc
Bonjour RomainPOIRET, bienvenue sur XLD,

Et bravo pour ce 1er message, la question est intéressante.

Collez cette macro dans le code de la feuille du classeur "A" (clic droit sur l'onglet et Visualiser le code) :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
With Application
    If Intersect(Target, [A1]) Is Nothing Or .CutCopyMode = 0 Then Exit Sub
    .ScreenUpdating = False
    .EnableEvents = False
    On Error Resume Next 'sécurité
    .Undo
    Paste Link:=True 'collage avec liaison
    [A2] = Mid([A1].Formula, 3)
    [A2] = Replace(Left([A2], InStr([A2], "]") - 1), "[", "")
    [A1] = [A1] 'supprime la formule
    .EnableEvents = True
End With
End Sub
Puis faites manuellement le copier-coller que vous indiquez.

A+
 

RomainPOIRET

XLDnaute Occasionnel
Bonjour job75 , désolé pour le temps d'attente,

Impeccable ça marche chez moi,
J'ai fais une mauvaise manipulation la dernière fois,

Pour clore cette discussion, serais-ce possible de voir comment cela fonctionne avec une boucle ? pour dupliquer le code sur les colonnes B, C, D ...

Merci encore pour votre implication,

Romain
 

job75

XLDnaute Barbatruc
Bonjour Romain, le forum,

Je ne vois pas pourquoi on ferait une boucle :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Target(1) 'une seule cellule
With Application
    If Intersect(Target, Rows(1)) Is Nothing Or .CutCopyMode = 0 Then Exit Sub
    .ScreenUpdating = False
    .EnableEvents = False
    On Error Resume Next 'sécurité
    .Undo
    Paste Link:=True 'collage avec liaison
    If Selection.Count > 1 Then Application.DisplayAlerts = False: Application.Quit 'sécurité
    Target(2) = Mid(Target.Formula, 3)
    Target(2) = Replace(Left(Target(2), InStr(Target(2), "]") - 1), "[", "")
    Target = Target 'supprime la formule
    .EnableEvents = True
End With
Rows("1:2").Columns.AutoFit 'ajustement largeurs
End Sub
Bonne journée.
 

Pièces jointes

  • A(1).xlsm
    21.6 KB · Affichages: 6

job75

XLDnaute Barbatruc
Alors voyez ce fichier (2) et la macro :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Target(1)
With Application
    If Intersect(Target, Columns(1)) Is Nothing Or .CutCopyMode = 0 Then Exit Sub
    .ScreenUpdating = False
    .EnableEvents = False
    On Error Resume Next 'sécurité
    .Undo
    Paste Link:=True 'collage avec liaison
    If Selection.Count > 1 Then Application.DisplayAlerts = False: Application.Quit 'sécurité
    Target(1, 2) = Mid(Target.Formula, 3)
    Target(1, 2) = Replace(Left(Target(1, 2), InStr(Target(1, 2), "]") - 1), "[", "")
    Target = Target 'supprime la formule
    .EnableEvents = True
End With
Columns("A:B").AutoFit 'ajustement largeur
End Sub
 

Pièces jointes

  • A(2).xlsm
    21.7 KB · Affichages: 7

job75

XLDnaute Barbatruc
Bonsoir RomainPOIRET,

Il suffit d'ajouter une ligne dans la macro pour obtenir le chemin d'accès :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Target(1)
With Application
    If Intersect(Target, Columns(1)) Is Nothing Or .CutCopyMode = 0 Then Exit Sub
    .ScreenUpdating = False
    .EnableEvents = False
    On Error Resume Next 'sécurité
    Paste Link:=True 'collage avec liaison
    If Selection.Count > 1 Then Application.DisplayAlerts = False: Application.Quit 'sécurité
    Target(1, 2) = Mid(Target.Formula, 3)
    Target(1, 2) = Replace(Left(Target(1, 2), InStr(Target(1, 2), "]") - 1), "[", "")
    Target(1, 2) = Workbooks(Target(1, 2).Text).FullName 'avec le chemin d'accès
    Target = Target 'supprime la formule
    .EnableEvents = True
End With
Columns("A:B").AutoFit 'ajustement largeurs
End Sub
Edit : .Undo n'était pas nécessaire, je l'ai supprimé.

A+
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 109
Messages
2 085 386
Membres
102 880
dernier inscrit
ADEL N