Hallo Experten!
Für euch kein Problem für mich nahezu unlösbar:
Ich möchte ein kleines Makro erstellen, wo ich in einer Tabelle von verschiedenen Adressen(ist jeweils die ActiveCell) ausgehend, immer zu einer bestimmten Adresse springen möchte, dort Einfügen und dann - das ist mein Problem - wieder zurück. Das heisst, ich möchte meiner Startzelle einen Namen geben um wieder zurückzufinden, da diese bei jedem Aufruf eine andere ist.
Sicher kein grosses VBA-Problem, wenn man weiss wie es geht.
Vorweg herzlichen Dank für eure HIlfe.
Freundliche Grüsse
wiedhalm
Hallo wiedhalm,
den Zeilen- und Spaltenindex bekommst Du mit Activecell.Row und ActiveCell.column.
Den kannst Du Dir zunächst zwischenspeichern und anschließend wieder dort hin zurück springen.
Ich hoffe, ich konnte Dir damit weiterhelfen.
Liebe Grüße
Jonas
Hallo Wiedhalm,
genau das selbe hast du am 2.5. schon mal gefragt und ich hatte es dir beantwortet. Schau mal hier im Brett weiter unten.
Gruß, Andreas
Hallo Andreas!
Du hast recht, das letzte Mal war es ähnlich. Damals ging es allerdings ohne „Selectierei“ nur deshalb, weil ich die Zielzelle nur einmal zu füllen hatte.
Ok du sollst alles wissen, was sich der kleine Amateur da zusammengebraut hat: 1.Makrolauf: Ausschneiden irgendeiner Zelle(zB d5), Auswahl e1, dann wenn e1 Inhalt besitzt nächste leere Zelle der gleichen Spalte suchen, einfügen, zurück zu Zelle(zB d5), Zelle löschen (Zellen nach oben verschieben), Ende des Makrolaufes.
2.Makrolauf, wie vor nur die Startzelle ist eine andere- Geht das noch ohne „Selectiererei“? Freundliche Grüsse
Wiedhalm
Hallo Wiedhalm,
hier mal ein bisschen Code (kommt auch ohne Select aus):
Option Explicit
Sub verschieben()
Dim zeile As Long
zeile = 1
While Not IsEmpty(Range("E" & zeile))
zeile = zeile + 1
Wend
Range("E" & zeile).Value = ActiveCell.Value
ActiveCell.Delete xlUp
End Sub
Momentan ist es halt eine einfache Sub, die du explizit starten musst.
Du könntest den Code natürlich auch in irgend eine Ereignisprozedur verpacken. Dann wird er immer automatisch ausgeführt, z.B. immer wenn du den Wert einer Zelle in Spalte D änderst.
Gruß, Andreas
Hallo Andreas!
Besten Dank für den Sub, er macht genau das was ich möchte!
Für mich persönlich traurig ist nur, dass ich das was da zwischen Zeile
zeile = 1
While Not IsEmpty(Range(„E“ & zeile))
zeile = zeile + 1
Wend
vorgeht, nicht einmal ansatzweise verstehe. Also kein „Aha“-Erlebnis mit dem Nachsatz, da hätt’ ich vielleicht auch selber draufkommen können. Oder anders formuliert: für mich ist da leider kein sinnerfassendes Lesen mehr möglich. Daher: Problem gelöst, dazugelernt nichts, nur abgeschrieben!
Nochmals besten Dank und
freundliche Grüsse
Hallo Jonas!
Besten Dank auch für Deine Bemühungen. Leider bin ich nur ein nebenberuflicher Hobby-Makroschreiber, der mit Spalten- und Zeilenindexverwendung nichts am Hut hat. Wenn Du mir dafür eine Literaturstelle nennen könntest, wo ich das Nachlesen kann und wo vor allem auch ein Anwendungsbeispiel dargestellt wird, das ich nachvollziehen kann,wäre ich dir sehr verbunden.
Freundliche Grüsse
wiedhalm
Kleiner VBA-Kurs
Hallo Wíedhalm,
ich werde mal versuchen etwas Licht ins Dunkel zu bringen:
Option Explicit
'Damit wird festgelegt, dass jede Variable, die benutzt wird auch definiert/dimensioniert werden muss. Macht man das nicht, gibt’s schon beim Starten des Makros einen Fehler.
Das macht Sinn: Wenn man sich beim Tippen der Variablennamen mal vertippt, kommt es leicht zu Fehlern, die man übersieht. Mit „Option Explicit“ vermeidet man das.
Sub verschieben()
Dim zeile As Long
Hier wird die Variable zeile vom Type Long definiert. Da sie Zeilennummern beinhalten soll, muss sie (spätestens ab Excel 2007) vom Typ Long sein, um alle möglichen Zeilennummern (max. 1048576) aufzunehmen.
zeile = 1
Die Variable zeile wird mit dem Wert 1 belegt
While Not IsEmpty(Range(„E“ & zeile))
Hier beginnt eine Schleife. Sie wird durchlaufen, solange die Zelle E1 (im ersten Durchlauf ist zeile = 1) nicht leer ist.
zeile = zeile + 1
Hier wird der Wert von zeile um 1 erhöht, also auf 2 (bei weiteren Schleifendurchläufen auf 3, 4, 5 usw.) erhöht.
Wend
Das ist das Ende der Schleife. Die Abfrage vom Anfang der Schleife ist jetzt unwahr, d.h. die Zelle E(zeile) ist leer. Das ist also die erste leere Zelle in Spalte E.
Range(„E“ & zeile).Value = ActiveCell.Value
Diese Zelle wird jetzt mit dem Wert aus der aktiven Zelle belegt, d.h. der Wert der aktiven Zelle wird nach E(zeile) kopiert. ACHTUNG! Trotz der vorherigen Schleife: Die AKTIVE Zelle ist immer noch die, die du angeklickt hast.
ActiveCell.Delete xlUp
Hier wird die aktive Zelle gelöscht (Delete) und die nachfolgenden Zellen werden nach oben geschoben (xlUp)
End Sub
Fertig.
Gruß, Andreas
Hallo Andreas!
Zu deiner Kiste mit Dankeschöns möchte ich noch eines für die ausführliche Beschreibung hinzufügen.
Freundliche Grüsse
wiedhalm