Dies ist eine Excel-Makrofrage. Gegeben sei eine Reihe von Formeln wie die folgenden:
= A1 + A2
= B2 + B2
usw., ...
Ich möchte jeden dieser Zellverweise durch die Werte ersetzen, ohne die ganze Zelle zu ersetzen.
= 1 + 2
= 3 + 4
Die Möglichkeit, dies manuell zu tun, besteht darin, jeden Verweis in der Formel hervorzuheben und zu drücken, F9um die Verweise durch Werte zu ersetzen. Ich muss dies jedoch für Tausende von Zellen tun. Gibt es ein Makro, um dies automatisch zu erledigen?
Antwort1
Das folgende Modul verwendet einen Bereich und ersetzt Zellreferenzen durch Werte, die in den referenzierten Zellen gefunden wurden. Wird verwendet, Range.Precedents
um die referenzierten Zelladressen in eine Zeichenfolge umzuwandeln und Split
diese in ein Array von Zelladressen umzuwandeln. Dieses Array wird dann verwendet, um übereinstimmenden Text in der Formel der Zielzelle zu finden und zu ersetzen.
Verwendung
- Kopieren Sie den gesamten Code in ein Standardcodemodul im Visual Basic-Editor.
- Rufen Sie das Unterprogramm mit auf
Call ReplaceReferencesWithValues(yourRange)
.
Das Test
Makro ruft die Subroutine auf, um die Referenzen im ausgewählten Bereich zu ersetzen.
Code
Option Explicit
Sub Test()
Call ReplaceReferencesWithValues(Selection)
End Sub
Sub ReplaceReferencesWithValues(rng As Range)
Dim cl As Range
Dim ws As Worksheet
Dim strTemp As String
Dim strRef() As String
Dim intIndex As Integer
For Each cl In rng
Set ws = cl.Worksheet
strTemp = cl.Formula
strRef() = ReferenceArray(cl)
For intIndex = LBound(strRef) To UBound(strRef)
strTemp = Replace(strTemp, strRef(intIndex), _
ws.Range(strRef(intIndex)).Value)
Next
cl.Formula = strTemp
Next
End Sub
Function ReferenceArray(rngSource As Range) As Variant
Dim rngRef As Range
Dim strTemp As String
On Error Resume Next
For Each rngRef In rngSource.Precedents.Cells
strTemp = strTemp & ", " & rngRef.Address(False, False)
Next
If Len(strTemp) > 0 Then strTemp = Mid(strTemp, 3)
ReferenceArray = Split(strTemp, ", ")
End Function
Anliegen
- Die Ersetzung erfolgt als
String
und als solche, wenn die Formel sowohl einen Verweis auf dieZelle"A1" und anderer Text, der "A1" enthält, wird der entsprechende Text ebenfalls durch den Wert von ersetzt.Zelle"A1". - Formeln, die zum Funktionieren einen Bereich benötigen (z. B. )
SUM
, funktionieren nicht mehr, wenn Sie versuchen, die Referenzen durch Zellwerte zu ersetzen.
Antwort2
Obwohl die gegebene @natancodes-Lösung machbar erscheint, ist die ursprüngliche Frage keine einfache Aufgabe, da sie Text durch Text ersetzt. Sie wird in diesem einfachen Fall abgebrochen: Formel sucht nach A1, wenn A1, A11, AA11 oder AA1 erscheinen, Referenzen werden versucht, mit falschen Werten zu überschreiben, und Makros werden nicht einmal funktionieren (abgesehen von „On Error Resume Next“). Verwenden Sie besser einen RegEx für die Such- und Ersetzungsoperation. Ein RegEx-Ausdruck wird hier bereitgestellt, aber aufgrund mangelnder Vertrauenswürdigkeit bei Ausdrücken bin ich mir nicht ganz sicher, ob er trotzdem funktioniert, und muss weiter getestet werden: ('?[a-zA-Z0-9\s[].]{1,99})?'?!?$?[a-zA-Z]{1,3}$?[0-9]{1,7}(:$?[a-zA-Z]{1,3}$?[0-9]{1,7})? (es kam vonhttps://www.get-digital-help.com/zellreferenzen-aus-einer-formel-extrahieren/).
Anderer Pfad, hier detaillierthttps://fastexcel.wordpress.com/2013/10/27/parsing-functions-from-excel-formulas-using-vba-is-mid-or-a-byte-array-the-best-method/, scheint etwas umständlich, aber es könnte in diesen Sonderfällen funktionieren.