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,
Bis später,
Karin
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
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
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)
Bis später,
Karin
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
Bis später,
Karin
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
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
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
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
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
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
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
Bis später,
Karin
PS: Auch hier brauchst du kein Select (siehe Beitrag Antwort 4)
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)

