Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Wie kann ich in einem Makro anstelle der Zellangabe einen in Excel vergebenen Namen im Befehl "Range" angeben?





Frage

Hallo, ich habe folgendes Problem: In Makros verwendet man ja immer wieder Zelladressen (bspw. um etwas von A nach B zu kopieren). Wenn jetzt irgendwann (vor allem von irgendjemand) in dem entsprechenden sheet eine Spalte und/oder Zeile hinzugefügt oder gelöscht wird, stimmen die im Makro angegebenen Adressen nicht mehr und das Makro fabriziert totales Chaos. Gibt es hierfür eine Lösung? Danke für eure Hilfe, Gruß Jojo

Antwort 1 von Beverly

Hi Jojo,

Range("Dein_Name").Copy Range("B10")


Bis später,
Karin

Antwort 2 von jojow

Hallo Karin,

das trifft es leider nicht ganz. Denn wenn jetzt jemand bspw. die 5. Zeile einfügt oder vor die Spalte A eine Spalte einfügt, wird das nächste Mal nicht mehr nach B10 kopiert. Genau das ist das Problem. Aus einem Namen heraus zu kopieren funktioniert ja ... oder müsste ich die Zieladressen auch jeweils mit einem Namen versehen? Wie klappt das dann, mit Bereichen, die mehr als eine Zelle haben? Und wie lautet der Befehl, wenn ich eine Formel kopiere und diese als Wert einfügen möchte?

Danke schon mal, Jojo

Antwort 3 von Beverly

Hi Jojo,

zum Kopieren aus einem mehrzelligen Bereich

Range("Bereich_Quelle").Copy Range("Ziel")


Dabei ist "Bereich_Quelle" als mehrzelliger Bereich definiert, "Ziel" als einzelliger, dennoch wird komplett kopiert, weil als Zeilezell nur die 1. Zelle angegeben werden muss.

Zum Einfügen von Formeln (kann man auch mit dem Makrorecorder aufzeichnen)

    Range("Bereich_Quelle").Copy
    Range("Ziel").PasteSpecial xlPasteFormulas


Bis später,
Karin

Antwort 4 von Beverly

Hi Jojo,

sorry, da habe ich deine letzte Frage falsch ausgelegt. Der Code muss richtig so lauten

 Range("Bereich_Quelle").Copy
Range("Ziel").PasteSpecial xlPasteValues


Bis später,
Karin

Antwort 5 von jojow

Hallo Karin,

vielen Dank - klappt prima. Allerdings noch folgendes: Wie kann ich nach dem Kopiervorgang die "Ziel"-Zelle markieren (diese steht in einem anderen Tabellenblatt als die Quelle)?
Weder mit
Range("Ziel").Select noch mit
Range(Ziel).Select
funktioniert das ...
Komisch - beim Kopieren findet er das andere Tabellenblatt ja auch, ohne dass ich es explizit angebe ...

Gruß
Jojo

Antwort 6 von Beverly

Hi Jojo,

dazu muss man zuerst die Tabelle aktivieren und anschließend die Zelle selektieren

    Worksheets("Tabelle2").Activate
    Range("Ziel").Select


Aber in VBA kann zu 99% auf Select und Activate verzichtet werden. Im gegebenen Fall kannst du das, indem du die Zielzelle als Objekt ansprichst

    Dim raZelle As Range
    Set raZelle = Range("Ziel")
    Application.Goto reference:=raZelle


Die beiden Befehle Select und Activate haben Einfluss auf die Performance. Gut, bei diesen simplen Beispielen merkt man es kaum, aber bei umfangreicheren Codes wirkt sich das schon negativ aus.

Bis später,
Karin

Antwort 7 von jojow

Hi Karin,

jetzt ist es perfekt - wieder einmal was dazu gelernt ...

Vielen Dank und noch einen schönen Tag
Jojo

Antwort 8 von jojow

Hallo Karin,

jetzt hab' ich doch noch einen "Nachschlag" ...
Ich kopiere in einem bestimmten Bereich unter gewissen Bedingungen Formeln und füge sie in einer anderen Spalte innerhalb dieses Bereichs als Werte ein - und zwar hiermit:
intLetzteZeile = Cells(Rows.Count, 28).End(xlUp).Row
For intZaehler = intLetzteZeile To 1 Step -1
If Range("AB" & intZaehler) = "1" Then
Range("T" & intZaehler).Copy
Range("T" & intZaehler).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
End If
Next intZaehler

Hier habe ich jetzt das gleiche Problem: Sowohl die Spaltenangabe "28", als auch die Spaltenangaben "AB" und "T" stimmen nicht mehr, falls jemand eine Spalte davor einfügt.
Kann ich hier ebenfalls mit vergebenen Namen arbeiten?
Es wäre schön, wenn Du mir nochmal helfen könntest.

Viele Grüße
Jojo

Antwort 9 von Beverly

Hi Jojo,

ein Range hat sowohl die Eigenschaft Zeile - Range(...).Row, als auch die Eigenschaft Spalte - Range(....).Column . Da man eine Zelle nicht nur mit Range("SpaltenbuchstabeZeile") sondern auch mit Cells(Zeile, Spalte) ansprechen kann, kann man die Zeilen/Spalten-Eigenschaft des Ranges dafür nutzen

intLetzteZeile = Cells(Rows.Count, Range("SpalteAB").Column).End(xlUp).Row
For intzaehler = intLetzteZeile To 1 Step -1
If Cells(intzaehler, Range("SpalteAB").Column) = "1" Then
Cells(intzaehler, Range("SpalteT").Column).Copy
Cells(intzaehler, Range("SpalteT").Column).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
End If
Next intzaehler


Bis später,
Karin

PS: Auch hier brauchst du kein Select (siehe Beitrag Antwort 4)

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: