J'essaie de déplacer (décaler) uniquement des parties de l'emplacement de la colonne de formule vers un emplacement de colonne différent d'une quantité spécifiée de colonnes. Les cellules de formule changent de feuille en feuille. J'ai des milliers de formules qui ont toutes des emplacements de cellules différents. Donc, je préfère une sorte de solution macro vba. C'est la formule originale:
=IF(AND($A$9=1,GH10=GT12),0,IF(AND($A$9=2,GI10=GS13),0,IF(AND($A$9=3,GJ10=GR14),0,1)))
et veulent que cela change en ceci:
=IF(AND($A$9=1,GI10=GT12),0,IF(AND($A$9=2,GJ10=GS13),0,IF(AND($A$9=3,GK10=GR14),0,1)))
c'est une colonne de plus, mais seulement le numérateur (GH10 -> GI10 et GI10 -> GJ10, etc.). Et avoir le même numéro de ligne constant.
J'ai trouvé ce code (ci-dessous). Il me permet de choisir dans une liste déroulante le nombre de colonnes à déplacer (PAS NÉCESSAIRE tant que je peux le saisir manuellement dans le code), mais cela change également le dénominateur de la formule. (NOTE: JE NE PEUX PAS ajouter $ aux parties de la formule que je ne veux pas changer. La formule doit rester dynamique).
Sub Macro1()
Dim nbr As Long, cel As Range, cels As Range, sh As Worksheet
Set cels = Selection
nbr = CLng(InputBox("Enter offset:"))
Set sh = Worksheets.Add
For Each cel In cels
If cel.HasFormula Then
sh.Cells(cel.Row, cel.Column + nbr).FormulaR1C1 = cel.FormulaR1C1
cel.Formula = sh.Cells(cel.Row, cel.Column + nbr).Formula
End If
Next
Application.DisplayAlerts = False
sh.Delete
Application.DisplayAlerts = True
End Sub
Ceci est pour une cellule à la fois. Si le code VBA fonctionne, peut-il accepter une plage sélectionnée, par opposition à une seule cellule à la fois?
la source
OFFSET
, comme dans leOffset(GH10,,cell_reference)
cas où la référence de cellule contiendrait le décalage de colonne pour cette feuille.Find & Replace
avecFormula Option
, ou je peux suggérer VBA pourFind & Replace
. Dites-moi comment vous pouvez changer de lignesGJ10
avecGK10
?GJ
avecGK
dans les formules de la colonne appropriée? Si vous ne voulez pas le faire manuellement, vous pouvez facilement l’automatiserRange.Replace
.