web-dev-qa-db-fra.com

Comment désactiver le changement automatique de référence de cellule Excel après copier/coller?

J'ai un énorme tableur Excel 2003 sur lequel je travaille. Il y a beaucoup de très grandes formules avec beaucoup de références de cellules. Voici un exemple simple.

='Sheet'!AC69+'Sheet'!AC52+'Sheet'!AC53)*$D$3+'Sheet'!AC49

La plupart d'entre eux sont plus compliqués que cela, mais cela donne une bonne idée de ce avec quoi je travaille. Peu de ces références de cellules sont absolues ($ s). J'aimerais pouvoir copier ces cellules dans un emplacement différent sans changer les références de cellules. Je sais que je peux simplement utiliser f4 pour rendre les références absolues, mais il y a beaucoup de données et il se peut que je devrais utiliser Fill plus tard. Existe-t-il un moyen de désactiver temporairement la référence de cellule en changeant de copier-coller/remplir sans rendre les références absolues?

EDIT: Je viens de découvrir que vous pouvez le faire avec VBA en copiant le contenu de la cellule sous forme de texte au lieu d’une formule. J'aimerais ne pas avoir à le faire car je veux copier des lignes/colonnes entières à la fois. Y a-t-il une solution simple qui me manque?

42
Bat Masterson

Od http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_a_range_of_formulas_take_2 :

  1. Programme Umieść Excel w trybie widoku formuły. Najłatwiej to zrobić naciskającCtrl+`(ta postać jeste „apostrofem wstecz” i zwykle znajduje siê na tym samym kluczu, który ma ~ (tyldę).
  2. Wybierz zakres do skopiowania.
  3. NaciśnijCtrl+C
  4. Uruchom Notatnik systemu Windows
  5. NaciśnijCtrl+Vprzeszacować skopiowane dane do Notatnika
  6. W Notatniku naciśnijCtrl+Aśledzony przezCtrl+Cskopiować tekst
  7. Aktywuj Excel i aktywuj górną lewą komórkę, avec les règles du jeu. Upewnij się, l'arkusz, le meilleur du genre, le meilleur du genre.
  8. NaciśnijCtrl+Vwkleić.
  9. NaciśnijCtrl+`aby wyłączyć tryb przeglądania formuł.

Uwaga: Je suis en ligne Musisz uruchomić Kreatora konwersji tekstu na kolumny. Wybierz opcję Rozdzielone i kliknij Dalej. À propos de nous Nous contacter Nous contacter Nous contacter pour écrire des commentaires Tab Ogranicznik z wyjątkiem Tab.

Lub z http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_a_range_of_formulas/ :

If you're a VBA programmer, you can simply execute the following code: 
With Sheets("Sheet1")
 .Range("A11:D20").Formula = .Range("A1:D10").Formula
End With
54
Whit Kemmey

Une solution très simple consiste à sélectionner la plage que vous souhaitez copier, puis Rechercher et remplacer (Ctrl + h), en remplaçant = par un autre symbole non utilisé dans votre formule (par exemple #).

Ensuite, copiez et collez la plage sélectionnée dans son nouvel emplacement. 

Enfin, Recherchez et remplacez pour que # redevienne = dans la plage d'origine et dans la nouvelle, rétablissant ainsi les deux plages en tant que formules.

22
Alistair Collins

Je suis venu sur ce site à la recherche d'un moyen facile de copier sans changer les références de cellules. Mais maintenant, je pense que ma propre solution de contournement est plus simple que la plupart de ces méthodes. Ma méthode repose sur le fait que Copy modifie les références, mais Move ne le fait pas. Voici un exemple simple.

Supposons que vous ayez des données brutes dans les colonnes A et B et une formule dans C (par exemple, C = A + B) et que vous souhaitiez utiliser la même formule dans la colonne F, mais la copie de C à F conduit à F = D + E.

  1. Copiez le contenu de C dans n'importe quelle colonne temporaire vide, par exemple R. Les références relatives changeront en R = P + Q mais l'ignoreront même si elles sont signalées comme des erreurs.
  2. Retournez à C et déplacez-le (non copiez) vers F. La formule doit rester inchangée, donc F = A + B.
  3. Maintenant, allez à R et recopiez-le dans C. La référence relative reviendra à C = A + B
  4. Supprimer la formule temporaire dans R.
  5. Bob est ton oncle.

Comme je l'ai fait avec une gamme de cellules, j'imagine que cela fonctionnerait avec n'importe quel niveau de complexité. Vous avez juste besoin d'une zone vide pour garer les cellules coiped. Et bien sûr, vous devez vous rappeler où vous les avez laissés.

6
JimH

Cette astuce simple fonctionne: Copier et coller. Ne pas couper et coller. Une fois que vous avez collé, resélectionnez la partie que vous avez copiée et accédez à ÉDITER, glissez jusqu'à EFFACER et EFFACER LE CONTENU.

1
Bob R

Je pense que vous êtes coincé avec la solution de contournement que vous avez mentionnée dans votre édition.

Je commencerais par convertir chaque formule de la feuille en un texte à peu près comme ceci:

Dim r As Range

For Each r In Worksheets("Sheet1").UsedRange
    If (Left$(r.Formula, 1) = "=") Then
        r.Formula = "'ZZZ" & r.Formula
    End If
Next r

où le 'ZZZ utilise le ' pour désigner une valeur de texte et le ZZZ en tant que valeur que nous pouvons rechercher lorsque nous voulons reconvertir le texte en une formule. Évidemment, si l'une de vos cellules commence réellement par le texte ZZZ, changez la valeur ZZZ de la macro VBA en autre chose.

Une fois la réorganisation terminée, je reconvertirais alors le texte en une formule comme celle-ci:

For Each r In Worksheets("Sheet1").UsedRange
    If (Left$(r.Formula, 3) = "ZZZ") Then
        r.Formula = Mid$(r.Formula, 4)
    End If
Next r

Un inconvénient réel de cette méthode est que vous ne pouvez pas voir les résultats d'une formule pendant que vous réorganisez. Vous constaterez peut-être que lorsque vous reconvertissez du texte en formule, vous avez par exemple une série d'erreurs #REF.

Il peut être intéressant de travailler par étapes et de revenir à des formules de temps en temps pour vérifier qu'aucune catastrophe ne s'est produite.

0
barrowc

J'ai trouvé cette solution qui automatise la solution @Alistair Collins.

Fondamentalement, vous changerez le = dans n'importe quelle formule en * puis ferez la pâte après quoi

        Dim cell As Range

msgResult = MsgBox("Yes to lock" & vbNewLine & "No unlock ", vbYesNoCancel + vbQuestion, "Forumula locker")

If msgResult = vbNo Then
    For Each cell In Range("A1:i155")
        If InStr(1, cell.Value, "*") > 0 Then
            cell.Formula = Replace(cell.Formula, "*", "=")
        End If
    Next cell
ElseIf msgResult = vbYes Then
    For Each cell In Range("A1:i155")
        If cell.HasFormula = True Then
            cell.Formula = Replace(cell.Formula, "=", "*")
        End If
    Next cell
End If
0
eyadt4

Il est courant d'utiliser la fonction Rechercher/Remplacer pour désactiver les formules lors des manipulations. Par exemple, copier avec transposer. La formule est désactivée en plaçant un espace réservé (par exemple, "$ =") devant celle-ci. Trouver remplacer peut vous en débarrasser une fois la manipulation terminée. 

Cette vba automatise simplement la recherche/remplacement pour la feuille active.

' toggle forumlas on active sheet as active/ inactive
' by use of "$=" prefix

Sub toggle_active_formulas()
    Dim current_calc_method As String
    initial_calc_method = Application.Calculation
    Application.Calculation = xlCalculationManual
    Dim predominant As Integer
    Dim c As Range
    For Each c In ActiveSheet.UsedRange.Cells
        If c.HasFormula Then
            predominant = predominant + 1
        ElseIf "$=" = Left(c.Value, 2) Then
            predominant = predominant - 1
        End If
    Next c
    If predominant > 0 Then
        For Each c In ActiveSheet.UsedRange.Cells
            On Error Resume Next
            If c.HasFormula Then
                c.Value = "$" & c.Formula
            End If
        Next c
    Else
        For Each c In ActiveSheet.UsedRange.Cells
            On Error Resume Next
            If "$=" = Left(c.Value, 2) Then
                c.Formula = Right(c.Value, Len(c.Value) - 1)
            End If
        Next c
    End If
    Application.Calculation = initial_calc_method
End Sub
0
Chris

Cette macro fait tout le travail.

Sub Absolute_Reference_Copy_Paste()
'By changing "=" in formulas to "#" the content is no longer seen as a formula.
' C+S+e (my keyboard shortcut)

Dim Dummy As Range
Dim FirstSelection As Range
Dim SecondSelection As Range
Dim SheetFirst As Worksheet
Dim SheetSecond As Worksheet

On Error GoTo Whoa

Application.EnableEvents = False

' Set starting selection variable.
Set FirstSelection = Selection
Set SheetFirst = FirstSelection.Worksheet

' Reset the Find function so the scope of the search area is the current worksheet.
Set Dummy = Worksheets(1).Range("A1:A1").Find("Dummy", LookIn:=xlValues)

' Change "=" to "#" in selection.
Selection.Replace What:="=", Replacement:="#", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

' Select the area you want to paste the formulas; must be same size as original
  selection and outside of the original selection.
Set SecondSelection = Application.InputBox("Select a range", "Obtain Range Object", Type:=8)
Set SheetSecond = SecondSelection.Worksheet

' Copy the original selection and paste it into the newly selected area. The active
  selection remains FirstSelection.
FirstSelection.Copy SecondSelection

' Restore "=" in FirstSelection.
Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

' Select SecondSelection.
SheetSecond.Activate
SecondSelection.Select

' Restore "=" in SecondSelection.
Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

' Return active selection to the original area: FirstSelection.
SheetFirst.Activate
FirstSelection.Select

Application.EnableEvents = True

Exit Sub

Whoa:
' If something goes wrong after "=" has been changed in FirstSelection, restore "=".
FirstSelection.Select
Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

End Sub

Notez que vous devez faire correspondre la taille et la forme de la sélection d'origine lorsque vous effectuez votre nouvelle sélection.

0
Bill Martz