56 votes

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

Un autre problème de copie dans Excel :

Comment puis-je copier une feuille de calcul du classeurA.xlsx dans le classeurB.xlsx sans que la feuille de calcul copiée fasse toujours référence au classeurA.xlsx, par exemple la formule =B!23 devient =[WorkbookA.xlsx]!B!23 lorsqu'il est copié.

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

Une autre alternative possible que je n'arrive pas à faire fonctionner est l'option de coller uniquement les "valeurs" des cellules. Excel traite les "valeurs" comme des valeurs calculées plutôt que comme des formules réelles dans la cellule. Si je choisis de coller la formule, cela donne toujours des références absolues.

En savoir plus sur la raison pour laquelle j'en ai besoin : J'ai un xlsx de production utilisé pour les opérations quotidiennes. Nous avons constamment besoin d'apporter des "améliorations" à ce xlsx et une personne peut donc créer une copie et y apporter ses modifications pour une seule feuille. Simultanément, une autre personne peut également apporter des modifications à une autre feuille. Étant donné que ces feuilles n'ont pas de cellules dépendantes d'autres feuilles Dans le cas d'un rapport de synthèse, il est souhaitable de copier et de fusionner les feuilles dans le fichier xlsx d'origine. Mais le référencement "absolu" pose beaucoup de problèmes.

4voto

user259817 Points 21
  • copier la feuille de calcul dans 'WorkbookB.xlsx'.
  • ouvrir la feuille de calcul dans le nouveau fichier
  • sélectionner tout
  • aller dans le menu Données, cliquer sur modifier les liens
  • modifier les liens de manière à ce que le lien vers l'ancien fichier soit désormais un lien vers le fichier de la nouvelle version. fichier actuellement ouvert

Cela fonctionne pour moi.

3voto

Excellll Points 12428

Le code ci-dessous peut être adapté à vos besoins. Il reprend toutes les formules de la feuille sur wb1 et les applique à une feuille dans un nouveau classeur. Les formules sont appliquées en tant que String de sorte qu'il n'y a pas d'insertion de références au classeur d'origine. De plus, ce code est très rapide car il n'utilise pas le presse-papiers et ne nécessite pas de boucles dans 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

1voto

HackSlash Points 4170

Si vous devez le faire automatiquement parce que vous tirez 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 modifier "String found in source book name." pour qu'il corresponde aux anciens liens que vous souhaitez remplacer. Vous pouvez supprimer ce bloc si vous souhaitez remplacer tous les liens.

0voto

Raystafarian Points 21292

Les deux classeurs doivent être ouverts pour que cela fonctionne. . Vous exécutez cette macro et elle copiera workbookA!sheet 1 à workbookB!sheet1 puis remplacer tous les workbookA des références. C'est rudimentaire, mais ça marche . Vous pouvez évidemment modifier le code pour qu'il corresponde à vos noms WorkbookA.xlsx, mais veillez à ce qu'ils aient l'extension correcte et qu'ils restent entre guillemets.

Oh, pour faire une macro, au cas où vous ne le sauriez pas, appuyez sur alt + F11 pour faire apparaître l'éditeur Visual Basic. Cliquez ensuite avec le bouton droit de la souris sur WBA insert - module et copier-coller le code ci-dessous dans le module. Ensuite, appuyez sur F5 pour 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 enregistrez-la et ouvrez-la à nouveau, et lorsqu'elle vous demande d'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

0voto

cdpinker Points 1

Pour ce faire, j'ai copié les cellules dans la nouvelle feuille de calcul comme d'habitude, puis j'ai effectué une recherche et un remplacement pour supprimer l'ancien chemin d'accès au fichier dans les formules.

Par exemple, si la première formule est =J2 et cela devient =[filepath]J2 Il suffit ensuite de rechercher et de remplacer l'ensemble de la nouvelle feuille de calcul par les éléments suivants [filepath] et remplacer par rien. Cela le supprime et rétablit la formule à =J2 .

Pas besoin de VB !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X