web-dev-qa-db-fra.com

Copier une feuille de calcul Excel et conserver la référence de cellule relative dans les formules

Un autre problème de copie dans Excel:

Comment puis-je copier une feuille de travail de WorkbookA.xlsx dans WorkbookB.xlsx sans que la feuille de travail copiée fasse toujours référence à WorkbookA.xlsx, par exemple? la formule =B!23 devient =[WorkbookA.xlsx]!B!23 lors de la copie.

Je veux conserver des références de cellules "relatives" au lieu de références de cellules "absolues" (j'inventerai cette terminologie dans le monde Excel si elle n'existe pas encore).

Une autre alternative possible que je ne parviens pas à faire fonctionner consiste à ne coller que les "valeurs" de cellule. Excel considère les "valeurs" comme des valeurs calculées plutôt que comme les formules réelles de la cellule. Si je choisis la formule de collage, elle donne toujours des références absolues.

Plus d'informations sur les raisons pour lesquelles j'ai besoin de ceci: J'ai un xlsx de production utilisé pour les opérations quotidiennes. Nous devons constamment apporter des "mises à niveau" à ce xlsx afin qu'une personne puisse créer une copie et ses modifications pour une seule feuille. Parallèlement, une autre personne peut également apporter des modifications à une autre feuille. Etant donné que ces feuilles n'ont pas de cellules dépendantes sur d'autres feuilles , comme un rapport de synthèse, il est souhaitable que nous copions et fusionnions simplement les feuilles dans le xlsx d'origine. Mais le référencement "absolu" donne beaucoup de problèmes.

37
Jake

Essayez d'utiliser Ctrl + ~ pour afficher les formules. Puis utiliser Ctrl + A pour tout sélectionner, copiez-le puis collez-le dans le bloc-notes.

Enfin, copiez-le dans le bloc-notes et collez-le dans votre autre classeur.

20
SVandenBerg

J'ai souvent trouvé qu'il était plus facile de faire ce qui suit:

  • copier la feuille dans un nouveau classeur
  • activer la nouvelle feuille dans le nouveau classeur
  • tout sélectionner (Ctrl+A)
  • faire une recherche/remplacement sur
    • trouver: [WorkbookA.xlsx]!
    • remplacer: <laisser vide>
  • remplace tout
23
Yoheeb

La réponse non signée juste en dessous de celle-ci est celle qui a fonctionné pour moi, avec une très légère variation.

  1. Créez et enregistrez une feuille de calcul de destination.

  2. Utilisez "déplacer", "copier" ou faites glisser votre page avec les formules dans la nouvelle feuille de calcul. Cela laisse les formules de la nouvelle page pointant sur l'ancienne feuille de calcul. Enregistrez ensuite la nouvelle feuille de calcul au même emplacement que l'ancienne feuille de calcul.

  3. Ensuite, accédez à l'onglet Données> cliquez sur Modifier les liens. L'option ne sera active que si la page contient des liens.

  4. Dans la boîte de dialogue qui en résulte, sélectionnez le nom du fichier source, puis cliquez sur "Modifier la source".

  5. Dans la boîte de dialogue d'ouverture de fichier qui apparaît ensuite, sélectionnez le nom de la nouvelle feuille de calcul.

Cliquez sur Fermer et vous avez terminé.

10
Pete

Ou simplement faire ce qui suit:

Convertir ceci:

=database_feed!A1

pour ça:

=INDIRECT("database_feed!A1")

et plus aucun changement à vos références lorsque vous copiez entre les feuilles de calcul.

Si vous n'avez pas beaucoup de feuilles référencées, une autre alternative serait d'utiliser

=INDIRECT("'"&B1&"'!A1")

et entrez le nom de la feuille de référence dans la cellule B1. Vous ne disposez plus que d'une cellule à mettre à jour lors de la copie dans la nouvelle feuille de calcul.

9
Jason Higbee

Le code ci-dessous peut être adapté à vos besoins. Il prend toutes les formules de la feuille sur wb1 et les applique à une feuille d'un nouveau classeur. Les formules sont appliquées en tant que Strings, il n'y a donc aucune insertion de référence dans le classeur d'origine. En outre, ce code est très rapide car il n'utilise pas le presse-papiers et ne nécessite aucune boucle entre les cellules.

Sub copyformulas()

Dim wb1 As Workbook, wb2 As Workbook
Dim s1 As Worksheet, s2 As Worksheet
Dim formArr() As Variant

Set wb1 = ThisWorkbook
Set s1 = wb1.Sheets("Sheet1")
Set wb2 = Workbooks.Add
Set s2 = wb2.Sheets("Sheet1")

formArr = s1.UsedRange.Formula
s2.Range("A1").Resize(UBound(formArr, 1), UBound(formArr, 2)).Formula = formArr

End Sub
3
Excellll
  • copier la feuille de calcul dans 'WorkbookB.xlsx'
  • ouvrir la feuille de calcul dans le nouveau fichier
  • tout sélectionner
  • allez dans le menu Données, cliquez sur les liens d'édition
  • éditez les liens pour que le lien vers l'ancien fichier soit maintenant un lien vers le fichier actuellement ouvert

Cela fonctionne pour moi.

2
user259817

Comme 99% des réponses ne répondaient même pas à la question initiale, voici la réponse appropriée.

  1. Copiez les feuilles du fichier d'origine (Original.xlsx) dans le nouveau fichier Excel (New.xlsx) comme vous le feriez normalement. Généralement, je clique avec le bouton droit sur le nom et choisissez "Déplacer ou copier ...".

  2. Enregistrez le deuxième fichier nouvellement créé (New.xlsx).

  3. Dans le nouveau fichier, sous Données, cliquez sur "Modifier les liens".

  4. Dans la fenêtre pop-up, choisissez "Change Source ..."

  5. Localisez le fichier (New.xlsx) et cliquez sur Ouvrir.

Toutes les références à l'original (Original.xlsx) seront supprimées.

TERMINÉ!

1
David

Bonjour, voici une solution simple à ce problème:

  1. Copiez les cellules comme d'habitude.
  2. Dans la formule, sélectionnez et copiez le texte le reliant au classeur précédent [WorkbookA.xlsx].
  3. Sélectionnez toutes les cellules que vous souhaitez modifier, appuyez sur CTRL+F et sélectionnez l'onglet Remplacer.
  4. Remplacez [WorkbookA.xlsx] par un espace vide (n'écrivez rien dans le champ Replace with, appuyez sur Replace All.

Voilà, c'est fait.

0
Niklas

Sélectionnez les cellules que vous souhaitez déplacer. Maintenant, essayez de les déplacer par glisser-déposer vers une autre feuille de calcul (onglet différent).

Je sais, ça défile. Voici la partie la plus délicate: appuyez simplement sur cmd (mac) ou alt (win) pour laisser les cellules tomber dans un autre onglet.

0
Andy Abel

Pour ce faire, j'ai normalement copié les cellules dans la nouvelle feuille de calcul, puis recherché un remplacement pour supprimer l'ancien chemin de fichier dans les formules.

Par exemple. si la première formule est =J2 et que cela devient =[filepath]J2, il suffit alors de rechercher et de remplacer la nouvelle feuille de calcul entière pour [filepath] et de ne rien remplacer. Cela le supprime et restaure la formule à =J2.

Non VB requis!

0
cdpinker
  1. Copiez la feuille comme d'habitude. (Cliquez avec le bouton droit de la souris sur l'onglet et allez sur 'déplacer ou copier') C'est pour le formatage.

  2. Copier toutes les cellules de la feuille d'origine (en utilisant Ctrl+A ou triangle en haut à gauche et Ctrl+C)

  3. Coller en tant que valeurs dans le nouveau classeur (sur la feuille "étape 1") (Options de collage> 123)

0
eru

Autre astuce: avant de copier la feuille de calcul source, remplacez tous les qualificateurs de formule = par un autre jeu de caractères (par exemple, ###=).

Copiez la feuille de calcul, puis, après la copie, remplacez le qualificatif de formule (en remplaçant ###= par =).

Assurez-vous que toutes les références de feuilles au sein des formulaires sont également copiées dans la nouvelle feuille avant la feuille de référence.

0
Tamer Salama

Si vous devez le faire automatiquement parce que vous extrayez des feuilles dans un programme VBA. Utilisez ceci:

Public Sub ChangeSource()
'
' ChangeSource Macro
' Edit the links to point to the current workbook.
'
    Dim allLinks As Variant
    allLinks = ThisWorkbook.LinkSources(xlExcelLinks)
    If Not IsEmpty(allLinks) Then
        Dim eachLink As Long
        For eachLink = 1 To UBound(allLinks)
            If InStr(3, "String found in source book name.", allLinks(eachLink)) Then
                ThisWorkbook.ChangeLink Name:=allLinks(eachLink), NewName:=ThisWorkbook.FullName, Type:=xlExcelLinks
            End If
        Next eachLink
    End If
End Sub

Il suffit de changer "Chaîne trouvée dans le nom du livre source". pour correspondre aux anciens liens que vous souhaitez remplacer. Vous pouvez supprimer cette option si vous souhaitez remplacer tous les liens.

0
HackSlash

J'avais un problème similaire. La raison pour laquelle les formules ont été collées avec le lien vers WBA est que l'onglet (feuille) sur lequel je travaillais dans WBA portait un nom différent de celui de WBB. Pour moi, c'était toujours "la dernière feuille", mais l'une s'appelait "MinFlow" et l'autre "NormalFlow". J'ai renommé les deux résultats en "Résultats" et le copier/coller a fonctionné comme je le voulais - une "pâte relative".

0
Janet

Les deux classeurs doivent être ouverts pour que cela fonctionne. Vous exécutez cette macro et copiera workbookA!sheet1 dans workbookB!sheet1, puis remplacera toutes les références workbookA. C'est brut, mais ça marche. Vous pouvez évidemment modifier le code afin qu'il corresponde à vos noms WorkbookA.xlsx, mais assurez-vous qu'ils portent l'extension correcte et restent entre guillemets.

Oh, pour créer une macro, au cas où vous ne le sauriez pas, appuyez sur alt + F11 pour faire apparaître Visual Basic Editor. Cliquez ensuite avec le bouton droit de la souris sur WBA insert - module et copiez/collez le code ci-dessous dans le module. Puis frappe F5 exécuter la macro. Si la macro ne s'exécute pas, c'est probablement parce que les macros ne sont pas activées, alors sauvegardez-la et ouvrez-la à nouveau. Quand il vous invite à activer les macros, activez-les.

Sub copysheetremoveWBref()

    Application.ScreenUpdating = False

    'activate WBA
    Application.Workbooks("workbooka.xlsx").Activate
    'Select WBA Sheet1
    Application.Workbooks("workbooka.xlsx").Sheets("Sheet1").Select
    'copy WBA!sheet1 to WBB!sheet1
    Sheets("Sheet1").copy Before:=Workbooks("WorkbookB.xlsx").Sheets("sheet2")
    'find WBA references and remove them
    Cells.Replace What:="=[workbookA.xlsx]", Replacement:="=", LookAt:=xlPart _
        , SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

    Application.ScreenUpdating = True


End Sub
0
Raystafarian