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?
Od http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_a_range_of_formulas_take_2 :
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
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.
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.
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.
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.
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.
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
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
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.