Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1060to1064
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Spalte bis Cursorzeile füllen

Spalte bis Cursorzeile füllen
22.03.2009 10:29:26
Werner
VBA-Level: befriedigend
Hallo Freunde,
in einer Tabelle sind drei Spalten A, B und C mit insgesamt ca. 500 Zeilen. Die Spalten A und C sind
von oben bis unten ganz gefüllt, in Spalte B klaffen an verschiedenen Stellen Lücken - optisch unsichtbare Zellen, die entweder niemals gefüllt oder nachträglich gelöscht wurden, also z.B. nicht initialisiert oder leer sind bzw. Leerzeichen oder dgl. enthalten.
Aufgabe ist es, die Lücken in Spalte B mit Hilfe eines Makro derart zu füllen, dass in Spalte B
alle Zeilen angefangen bei der auf die letzte mit einem optisch sichtbaren Wert gefüllte Zeile folgenden
Zeile bis zu derjenigen Zeile, in welcher der Cursor steht (dieser soll dabei aber in einer anderen Spalte stehen können), mit demjenigen Wert in Spalte B gefüllt werden,
dessen Zeile der der Cursorzeile - von der Cursorzeile an nach oben gerechnet - am nächsten steht. Der Makro soll sowohl irgendwo innerhalb der Tabelle als auch am Tabellenende funktionieren (Tabellenende bedeutet hier, dass der Cursor in der letzten Zeile der Tabelle steht und die Spalte B nicht bis zur
letzten Zeile reichen).
Wie mache ich das? Problem war hier insbesondere die Behandlung der optisch leeren Zellen in Spalte B.
Wer weiß Rat? Dank!! Werner R.

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Spalte bis Cursorzeile füllen
22.03.2009 11:28:32
Tino
Hallo,
so richtig verstanden habe ich Deine Frage nicht, drei mal gelesen
"hinten, vorne, Zeile, Spalte, bis 500 aber dennoch von oben bis unten" bin verwirrt ;-)
Fangen wir einfach mal an.
Hier mal was, soweit ich es jetzt verstanden habe.

Sub test()
Dim VorActive As Range
Set VorActive = Cells(ActiveCell.Row, 2)
Do While Application.WorksheetFunction.Clean(Trim$(VorActive)) = "" And VorActive.Row > 2
Set VorActive = VorActive.Offset(-1, 0)
Loop
Range(VorActive, Cells(ActiveCell.Row, 2)).Value = VorActive.Offset(-1, 0).Value
End Sub


Gruß Tino

Anzeige
Korrektur...
22.03.2009 11:31:45
Tino
Hallo,
war noch nicht richtig.
Sub test()
Dim VorActive As Range

Set VorActive = Cells(ActiveCell.Row, 2)

Do While Application.WorksheetFunction.Clean(Trim$(VorActive)) = "" And VorActive.Row > 1
 Set VorActive = VorActive.Offset(-1, 0)
Loop

Range(VorActive, Cells(ActiveCell.Row, 2)).Value = VorActive.Value


End Sub


Gruß Tino

Anzeige
kurze Erläuterung
22.03.2009 11:45:13
Werner
Hallo Tino,
vielen Dank für deine Antwort! Der Zweck des Ganzen ist: In Spalte C stehen Stringeinträge, die durch
die Einträge in Spalte B klassifiziert werden
Ich will mir die "Mühe" ersparen, die nicht ausgefüllten Zeilen in Spalte B dadurch auszufüllen, dass
ich das Füllkästchen rechts unten mit der Maus ansteuere und den letzten ausgefüllten Wert in Spalte B
nach unten kopiere. Um nichts anderes handelt es sich, aber das ganze mit VBA (den Makro lege ich auf eine Kurztaste). Dann kann der Cursor auch - wenn die Tabelle mehr Spalten als hier angegeben hat, in irgendeiner Spalte rechts stehen, und trotzdem wird durch den Makro die Spalte B nach unten ausgefüllt.
D.h. die auszufüllenden optisch leeren Zellen in Spalte B sollen den gleichen Wert wie der letzte Wert
darüber in Spalte B erhalten.
Grüße! Werner R.
Anzeige
versuche es mal hiermit.
22.03.2009 12:02:25
Tino
Hallo,
teste mal diesen Code, habe ihn nicht ausführlich getestet.
Sub Test()
Dim VorActive As Range, NachActive As Range

Set VorActive = Cells(ActiveCell.Row, 2).End(xlUp)
Set NachActive = Cells(ActiveCell.Row, 2).End(xlDown)

If NachActive.Row > Range("A:C").SpecialCells(xlCellTypeLastCell).Row Then
 Set NachActive = Cells(Range("A:C").SpecialCells(xlCellTypeLastCell).Row, 2)
End If

Do While Application.WorksheetFunction.Clean(Trim$(VorActive)) = "" And VorActive.Row > 1
 Set VorActive = VorActive.Offset(-1, 0)
Loop

Do While Application.WorksheetFunction.Clean(Trim$(NachActive)) = "" And NachActive.Row < Rows.Count
 Set NachActive = NachActive.Offset(1, 0)
Loop

Range(VorActive, NachActive.Offset(IIf(IsEmpty(NachActive), 0, -1), 0)).Value = VorActive.Value


End Sub


Gruß Tino

Anzeige
Klappt wunderbar!
22.03.2009 12:20:04
Werner
Hallo Tino,
es hat etwas gedauert, danke f. deine Geduld. Dein erster Code läuft wunderbar. Natürlich muss man
am Anfang schreiben "...Cells(ActiveCell.Row, 2)" statt ."..Cells(ActiveRow, 2)", dann geht es. Du
hast mein Problem schon richtig erfasst.
Da ich häufig ähnliche Programmierprobleme habe (der Code muss sich mit "Offset" wie ein Affe eine
Spalte von unten nach oben hochhangeln), ist deine Lösung von großen Wert für mich. Jetzt weiß ich, dass man in der auszufüllenden Spalte einen Range ueber die dort leeren Zellen bilden kann, dem man den auszufüllenden Wert zuweist.
Ich hatte in solchen Fällen bisher immer mit einer zweiten Schleife zum Ausfüllen gearbeitet. Deine
Lösung mit dem Range ist aber deutlich besser!
Auch Clean und Trim sind in deinem Makro interessant eingesetzt (wie schon kürzlich in einem etwas
anderem Zusammenhang). Noch einmal meinen besten Dank, durch diesen Code werden einige Denkansätze von mir künftig wohl besser und einfacher ausfallen!
Beste Grüße! Werner R.
Anzeige
zum Thema
22.03.2009 12:34:13
Werner
Hallo Tino,
deinen letzten Code probiere ich morgen auch noch aus, aber der erste hat ja mein Problem
schon gelöst, wie in meinem letzten Thread-Beitrag erwähnt. Grüße! Werner R.
zweiter Code problematisch
23.03.2009 04:23:05
Werner
Hallo Tino,
dein zweiter Code birgt im Gegensatz zum ersten Gefahren. Hatte das Worksheet zum Glück vorher
sicherheitshalber kopiert.
Wie ich beim Testen festgestellt habe, beginnt das Problem in der folgenden Programmzeile:
Set VorActive = Cells(ActiveCell.Row, 2).End(xlUp)
Da in dieser Programmzeile die optisch leeren Zellen über "ActiveCell.Row" z.T. ja manchmal nicht leer sind,
springt der Makro in Spalte B zu weit nach oben offenbar bis zur Zelle über der ersten wirklich, d.h. Excel-intern, leeren Zelle und überschreibt die darunterliegenden Zellen bis zu "ActiveCell.Row" alle mit diesem Wert.
Aber du hattest mein Problem ja bereits mit deinem ersten Code gelöst, der wunderbar läuft.
Grüße! Werner R.
Anzeige
Testumgebung
23.03.2009 08:00:50
Tino
Hallo,
ok., dann hat wohl meine Testumgebung andern ausgesehen wie Deine.
Egal die Hauptsache ist, Dein Problem ist gelöst.
Gruß Tino
Alles klar!
23.03.2009 13:13:04
Werner
Hallo Tino,
finde ich auch. Mehr als die Lösung des Problems kann man sich ja nicht wünschen. Besten Dank f.
deine vielen nützlichen Ratschläge in den vergangenen Tagen u. Wochen! Werner R.

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige