Verlinkung von einer Zelle zu einer anderen in einer Schleife

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Verlinkung von einer Zelle zu einer anderen in einer Schleife

    Hallo Leute,

    ich habe heute ein simples Problem welches ich aber nicht lösen kann. Ich hoffe ihr könnt mir weiterhelfen :)

    Ich habe 2 Arbeitsblätter die ich hier mal Blatt1 und Blatt2 nenne.

    Auf Blatt1 sind sehr viele Daten und in Blatt2 ist eine strukturierte Oberfläche. Ich möchte hier nun auf die Werte in Blatt1 verlinken.
    Von Hand würde in einer Zelle auf Blatt2 stehen: =Blatt1!B12
    Diesen Eintrag wird dann noch mit einer Zelle auf Blatt 2 multipliziert sodass am Ende in der Zelle auf Blatt2 steht: =Blatt1!B12*L8

    Ich mache das ganze pro Zeile in Blatt2 dreimal. Also:
    =Blatt1!B12*L8
    =Blatt1!G12*L8
    =Blatt1!T12*L8

    Da aber auf blatt2 1300 Einträge sind und ich ungern 1300*3 verknüpfungen per hand machen möchte, habe ich an ein Makro gedacht welches diese arbeit übernimmt.

    Mit dem Recorder kam die funktion ActiveCell.FormulaR1C1 = "=Blatt1!R[]C[]*R[]C[]" zu tage.
    Wie ich rausgefunden habe sind die zahlen in den Klammern die von der aktiven Zelle zur Zielzelle. Ich habe probiert die Zahlen durch Variabeln zu ersetzen da ich ja eine For-Schleife nutzen möchte. Es kam die Fehlermeldung >>Erwartet: Anweisungsende<< was vermutlich an den Gänsefüßchen liegt.

    Kann man das über ActiveCell mit den Formula funktionen machen oder muss ich stattdessen eine andere funktion wählen?

    lanbo schrieb:

    Da aber auf blatt2 1300 Einträge sind und ich ungern 1300*3 verknüpfungen per hand machen möchte, habe ich an ein Makro gedacht welches diese arbeit übernimmt.
    Die sind doch sicher alle in einer Spalte, die du einfach herunterziehen (oder mit FillDown vervielfältigen) kannst.
    Wenn du's nur einmal brauchst, ist ein Macro die aufwendigere Lösung.

    lanbo schrieb:

    Kann man das über ActiveCell mit den Formula funktionen machen oder muss ich stattdessen eine andere funktion wählen?

    Visual Basic-Quellcode

    1. For each c in Intersect(UsedRange, Range("B:B"))
    2. c.FormulaR1C1 = "..." 'für R1C1-Adressierung
    3. 'oder
    4. c.Formula="..." 'falls du lieber mit A1-Methode adressieren willst
    5. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Die Werte in Blatt1 sind aber unsortiert, sodass man nicht "runterziehen" kann.
    Ich suche also erstmal jeden Wert.
    Beispiel:
    Blatt2 ZelleA1 hat den Wert 145879. Diesen Wert suche ich in Blatt2 Spalte B. Wenn ich den gefunden habe Row=12 setzte ich die Verlinkungen. Die Werte auf die ich verweise sind dann zwar alle in Row 12, aber der nächste Wert in Blatt2 ZelleA2 findet sich in Row=45 auf Blatt1.

    Das Suchen wollte ich mit Range.Find machen, da habe ich schonmal mit gearbeitet und kann das hier für umsetzen.

    Edit:
    Ich habe es mal mit ActiveCell.Formula probiert und die Zellen per A1 adressiert. Das Makro hat die Werte wie in R1C1 verarbeitet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „lanbo“ ()

    So ich hab mir nun fast alles zusammen, nur eins läuft nicht. Der Zelleneintrag.

    VB.NET-Quellcode

    1. Cells(i, 10).Select 'Zelle auf Blatt2 auswählen
    2. ActiveCell.Formula = "=Blatt1!R[145]C[12] * R[14]C[5]" 'Formel eintragen
    3. Cells(i, 18).Select 'Zelle auf Blatt2 auswählen
    4. ActiveCell.Formula = "=Blatt1!R[145]C[34] * R[14]C[13]" 'Formel eintragen
    5. Cells(i, 36).Select 'Zelle auf Blatt2 auswählen
    6. ActiveCell.Formula = "=Blatt1!R[145]C[58] * R[14]C[41]"

    Das macht er für jeden Wert i in der For-Schleife.
    Die Zeile auf Blatt1 (hier 145) ändert sich für jedes i. Leider nicht immer +1 sondern querbeet. In der A1 Notierung sind die Spaltenwerte(12, 34, 58) immer gleich.

    Die Zelle mit der multipliziert wird ist immer die gleiche. Der Wert in der Zelle muss änderbar bleiben. Den Wert der Zelle habe ich einer Variabel zugewiesen.

    VB.NET-Quellcode

    1. ActiveCell.Formula = "=Blatt1!R[(" & Zeile & ")]C[58] * (" & Var & ")"

    So wünsche ich es mir, nur nimmt der die Variabel Zeile nicht so. Zeile ist ein Integer und Var ein Double.
    Wie baue ich nun die Variabeln richtig ein?

    lanbo schrieb:

    Cells(i, 10).Select 'Zelle auf Blatt2 auswählen
    ActiveCell.Formula = "=Blatt1!R[145]C[12] * R[14]C[5]" 'Formel eintragen
    Punkt 1:
    NICHT mit Select arbeiten, sondern direkt adressieren.

    Visual Basic-Quellcode

    1. Cells(i, 10).Formula = "=Blatt1!R[145]C[12] * R[14]C[5]"


    Punkt2:
    Wenn du Formula benutzt, musst du auch A1-Adressierung verwenden

    Visual Basic-Quellcode

    1. Cells(i, 10).Formula = "=Blatt1!L145*$E$5"

    Wenn du R1C1-Notierung verwenden willst, musst du FormulaR1C1 verwenden.
    Ausserdem kannst du absolut und relativ adressieren.

    Visual Basic-Quellcode

    1. Cells(i, 10).FormulaR1C1 = "=Blatt1!R[145]C[12]*R[14]C[5]" 'relativ
    2. Cells(i, 10).FormulaR1C1 = "=Blatt1!R145C12*R14C5" 'absolut


    Im übrigen bin ich immer noch der Meinung, dass eine Lösung ohne VBA einfacher wäre.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Danke dir erstmal für die Hilfe.

    Okay, also direkt ansprechen und auch richtig Adressieren.
    1. Wie ersetze ich die 145 durch eine Variabel? Spalte L ist konstant, nur die Zeile ändert sich.

    2. =SVERWEIS(B1;Blatt1!H7:ER1673;141;FALSCH)*L8 <- ist das ergebniss ohne vba. wie schaffe ich es das die Matrix(H7:ER1673) und L8 sich nicht hochaddiert wenn ich den Befehl "runterziehe"? B1 Soll sich hochaddieren da dort der Suchparameter drin steht.