2016-12-10 3 views
1

Ich habe eine harte Zeit Formatierung einer Tabelle ... vielleicht können Sie mir helfen.Ersetzen Sie Teil einer Zelle Formel dynamisch mit Wert einer anderen Zelle

Ich muss einen Teil einer Formel in aprox ersetzen. 1700 Zellen.

die ursprüngliche Formel, die in jedem dieser Zellen im Einklang mit dem folgende Format:

='2014-12'!$F$7 

Ich bin interessiert, den '2014-12' Teil der Formel mit dem Wert der Zelle in der ersten Reihe jeder colum in Ersetzen . Beachten Sie, dass sich der $F$7 Teil in jeder Zelle ändert.

Bsp .:

enter image description here

Wie Sie die erste Zeile von meiner Tabelle sehen können, enthält das Jahr, dass ich in den Formeln ersetzen muss, die in den Zellen direkt über dem Jahr geschrieben werden.

Daten gehen aus:

  • Zeile 5 bis 96 (nicht jede Zelle in der Spalte enthält Formeln)
  • Spalt 2 bis 25

Meine erste Idee Python zu verwenden war um dies zu erreichen ... aber ich konnte es nicht mit pyoo, oosheet oder arbeiten lassen. So kam ich zu Excel und versuchte, ein Makro zu schreiben, macht folgendes:

Makro Idee:

  1. für Spalte i = 2 bis 25,
  2. Cell(1, i).Value erhalten,
  3. für Zeile j = 5-96,
  4. erhalten Cell(j, i).Formula
  5. ersetzen die '2014-12' Teil in Cell(j, i).Formula, mit Cell(1, i).Value

enter image description here


Mein Code bisher getan:

Sub replace_content_of_formula() 

Dim i, j As Integer 

For i = 2 To 25 
    year = Cells(1, i).Value 

    For j = 5 To 96 
     prev_formula = Cells(j, i).Formula 
     new_formula = prev_formula[:2] & year & prev_formula[9:] <<< I DONT KNOW HOW TO DO THIS 
     Cells(j, i).Select 
     ActiveCell.FormulaR1C1 = new_formula <<< I DONT KNOW HOW TO DO THIS 

    Next j 
Next i 
End Sub 

Ich würde jede Hilfe dankbar.

Ps .: Ich kann python oder vba verwenden.

+0

Hallo. Können Sie bitte angeben, wie sich die * Zellreferenz * ändert? '= 'Sheet Reference'! Zellreferenz'. –

Antwort

3

Die Hauptsache, die Sie lernen mussten, war die Mid Funktion oder die Replace Funktion. Überarbeiteter Code ist wie folgt:

Sub replace_content_of_formula() 
    Dim i As Integer, j As Integer 
    Dim prev_formula As String 
    Dim new_formula As String 
    Dim YearValue As String 

    For i = 2 To 25 
     YearValue = Cells(1, i).Value 

     For j = 5 To 96 
      prev_formula = Cells(j, i).FormulaR1C1 
      new_formula = Replace(prev_formula, "2014-12", YearValue) 
      'Or 
      'new_formula = Mid(prev_formula, 1, 2) & YearValue & Mid(prev_formula, 10) 
      Cells(j, i).FormulaR1C1 = new_formula 
     Next j 
    Next i 
End Sub 
2

Ich bin nicht an einem Computer mit Windows installiert, aber das funktioniert in LibreOffice Calc ...

Wenn Sie schreiben, in Zelle A5, =A$1, wird es (offensichtlich) auf A1 beziehen. Wenn Sie das kopieren und über Ihr Blatt einfügen, wird es als =B$1 in Spalte B, =C$1 in Spalte C usw. eingefügt. So wird es immer die erste Zeile nachschlagen.

Wenn die erste Zeile formatierte Datumsangaben anstelle von Text enthält, können sie unter Verwendung von =Text(C$1, "YYYY-MM") in Text konvertiert werden, um den Blattnamen zu entsprechen.

Als nächstes können wir die Adresse der Zelle auf dem anderen Blatt mit der Address Funktion schreiben.

=Address(1, 1, 4, True, Text(C$1, "YYYY-MM")) produzieren die Text'2015-12'!A1

=Address(1, // the row 
     1, // the column 
     4, // absolute or relative format. A number from 1 to 4. 4 is relative row & relative column 
     True, // A1 or R1C1 format. True is A1 
     Text(C$1, "YYYY-MM") // the sheet name 
     ) 

Wenn wir die Row() und Column() Funktionen für die ersten beiden Argumente der Ausgang des Address verwenden auf einem anderen Blatt auf die gleiche Zelle beziehen:

=Address(Row(), Column(), 4, True, Text(C$1, "YYYY-MM")) wird '2015-12'!C5 in Zelle C5 produzieren.

Sie können dann die Offsets hinzufügen, indem Sie Row() und Column() hinzufügen - hoffentlich sind diese Offsets die gleichen für alle Zellen, die Sie suchen!

=Address(Row() + 2, Column() + 3, 4, True, Text(C$1, "YYYY-MM")) wird '2015-12'!F7 in Zelle C5 produzieren.

Schließlich drehen Sie den Text aus Address in einen Nachschlag mit der Indirect Funktion:

=Indirect(Address(Row() + 2, Column() + 3, 4, True, Text(C$1, "YYYY-MM")))

Sie sollten dann in der Lage sein, diese Formel über Ihr Blatt kopieren und einfügen.

+0

Sie sind auf dem richtigen Weg, aber die Formel gibt ein #REF zurück! Fehler, aufgrund der Tatsache, dass die 'F7' Zelle nicht in Anführungszeichen steht. Dies funktioniert '= INDIREKT (" '"& C $ 1 &"'! F7 ")', mit einem Haken. OP sagte, dass der "F7" -Teil variabel ist. –

+1

OK, versuchen wir 'Address' und nicht' Indirect' ... –

+1

Tolle Idee. Das sollte funktionieren. '= INDIREKT (" '"& C $ 1 &"'! "& ADRESSE (7; 6; 1; 1))'. Das OP sollte entscheiden, wie sich die Argumente 'row_num' und' column_num' ändern. Verwenden Sie dann zum Beispiel "ROWS" oder "COLUMNS" als Argumentwerte. –

Verwandte Themen