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

41

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!23devient =[WorkbookA.xlsx]!B!23lors 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 pour laquelle je ne parviens pas à le faire fonctionner est la possibilité de coller uniquement 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.

Pour en savoir plus sur les raisons pour lesquelles j'ai besoin de cela: 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. Étant 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.

Jake
la source
Je suis un peu confus. Vous souhaitez copier la feuille 1 de WBA dans WBB et vous souhaitez copier les formules relatives à WBB plutôt que WBA. Ceci n'est possible que si la feuille WBB 2 est identique à la feuille WBA 2. Est-ce le cas? En outre, si vous souhaitez uniquement des valeurs, vous pouvez copier la feuille select all - copy - paste special - valuespour n’avoir que des valeurs. Si vous voulez tout faire pendant la copie plutôt que de vous fier à l'utilisateur final pour exécuter ces étapes, eh bien, j'y ai travaillé. Dites-nous exactement comment vous voulez que ce soit en termes de WorkbookA (ou 1) et WBB (2) et les feuilles #
Raystafarian
J'ai déjà essayé de l'expliquer dans mon dernier paragraphe, mais je pense que ce n'était toujours pas clair. Oui, WBA et WBB sont identiques à ceux attendus pour une feuille WBA. Lors de la conception de cette feuille dans WBA, il est prévu que toutes les références de cellule soient relatives au classeur de la feuille. La fonction de copie de la feuille de calcul ajoute toutes les formules de cellule avec WBA, ce qui la rend "absolue" et je ne le souhaite pas.
Jake
les valeurs spéciales de pâte ne font que coller les valeurs calculées. J'ai besoin que les formules soient copiées, SANS WBA.xls ajoutées.
Jake
Ok je suis clair. Je
posterai
Ne pouvez-vous pas simplement faire une copie de tout le classeur, puis supprimer ce dont vous n'avez pas besoin de la nouvelle copie?
dwolters

Réponses:

21

Essayez d’utiliser Ctrl+ ~pour afficher les formules. Puis utilisez Ctrl+ Apour 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.

SVandenBerg
la source
1
@ Jake: Mais vous avez dit que votre classeur comporte des boutons, des menus déroulants et autres; et des plages nommées. Cette technique ne les copiera pas (ou des choses banales comme le formatage) - comment / pourquoi le considérez-vous comme acceptable?
Scott
Sur une grande feuille de calcul, la technique Éditer les liens / Changer la source était extrêmement lente, mais rapide.
Tony Pulokas
24

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
  • sélectionner tout ( Ctrl+ A)
  • faire une recherche / remplacement sur
    • trouver: [WorkbookA.xlsx]!
    • remplacer: <laisser vide>
  • remplace tout
Yoheeb
la source
11

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é.

Pete
la source
9

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 le nouveau tableur.

Jason Higbee
la source
1
Bonne idée, fonctionne si vous avez une feuille de modèle avec des formules et que vous la copiez dans un nouveau classeur avec VBA. J'ai constaté que vous devez conserver la référence entre guillemets et ajouter TRUE pour conserver les références de type A1. par exemple. = INDIRECT ("'Sheet1'! A1", TRUE)
RogerB
2
INDIRECTest une formule volatile, elle sera donc recalculée à chaque fois (plutôt que seulement lorsqu'elle sera modifiée), ce qui peut réellement ralentir des classeurs plus complexes, alors utilisez-le avec prudence
Andy Terra
3

Le code ci-dessous peut être adapté à vos besoins. Il prend toutes les formules de la feuille wb1et 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érences 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
Excellent
la source
3

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É!

David
la source
Devrait être plus élevé dans la liste des réponses
sabre23t
2
  • 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.

utilisateur259817
la source
0

Les deux classeurs doivent être ouverts pour que cela fonctionne . Vous exécutez cette macro et il va copier workbookA!sheet1 à workbookB!sheet1, puis remplacer toutes les workbookAréférences. C'est brutal, 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 sachiez pas, appuyez sur alt + F11pour afficher Visual Basic Editor. Puis faites un clic droit sur WBA insert - moduleet copiez et collez le code ci-dessous dans le module. Puis appuyez sur F5pour exécuter la macro. Si la macro ne s'exécute pas, c'est probablement parce que les macros ne sont pas activées. Par conséquent, sauvegardez-la et ouvrez-la à nouveau. Lorsque le système 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
Raystafarian
la source
1
Une seule routine est agréable comme je le suis manuellement à CTRL+Hprésent, mais tout cela ne résout pas les références pour les contrôles, par exemple les boutons, les menus déroulants, etc. et des plages nommées.
Jake
0

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 =J2et que cela devient =[filepath]J2, alors il suffit de rechercher et de remplacer la nouvelle feuille de calcul dans son intégralité pour [filepath]ne rien remplacer. Cela le supprime et restaure la formule =J2.

Aucun VB requis!

cdpinker
la source
Malheureusement, Excel ne semble fonctionner que par intermittence lorsqu'il s'agit de trouver des sous-chaînes dans des formules: /. Il ne semble pas non plus être capable de trouver quoi que ce soit avec des guillemets simples.
Douglas Gaskell
0

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".

Janet
la source
0

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.

Andy Abel
la source
Pouvez-vous développer votre réponse un peu? Il n'est pas clair comment / où déposer sur un autre onglet tout en faisant glisser. Merci.
fix1234
0

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, puis appuyez sur CTRL+Fet sélectionnez l'onglet Remplacer.
  4. Remplacez [WorkbookA.xlsx] par un espace vide (c’est-à-dire que vous n’écrivez rien dans le Replace withchamp, appuyez sur Replace All.

Voilà, c'est fait.

Niklas
la source
0

Un autre "truc" - avant de copier la feuille de calcul source, remplacez tous les qualificatifs de formule = par un autre jeu de caractères (par exemple ###=).

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

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

Tamer Salama
la source
0
  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 le 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)

eru
la source
0

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.

HackSlash
la source
-1

Ouvrez les deux classeurs. Dans le classeur source (WorkbookA.xlsx), sélectionnez la feuille que vous souhaitez copier. Cliquez avec le bouton droit de la souris sur l'onglet de la feuille et sélectionnez «Déplacer ou copier…». Dans la boîte de dialogue «Déplacer ou copier», sélectionnez «WorkbookB.xlsx» dans la liste déroulante «Pour réserver», choisissez l'emplacement de votre choix dans le livre et cochez «Créer une copie». (Et cliquez sur “OK”.)

Scott
la source
-1

Faites une copie de la feuille que vous souhaitez déplacer, à partir de laquelle ce cas serait WorkbookA.xlsx. Renommez-le en "Copie de WorkbookA.xlsx". Ouvrez maintenant ce nouveau classeur ainsi que le classeur vers lequel vous souhaitez déplacer la feuille, qui dans ce cas serait WorkbookB.xlsx. Cliquez avec le bouton droit de la souris sur les feuilles du classeur de copie que vous avez créé, par exemple, Copie de WorkbookA.xlsx, sélectionnez «Déplacer ou copier», puis déplacez ces feuilles vers WorkbookB.xlsx. Vous avez terminé !

Nishant
la source
Il n'est pas clair comment votre réponse résout le problème de la question. Pourquoi bougera-t-il fonctionnera-t-il différemment alors que copier fonctionnerait?
Máté Juhász
J'ai essayé votre solution proposée et cela ne fonctionne pas. Il n'y a pas de différence entre copier et déplacer des feuilles entières.
nixda