Makro unten Ausfüllen bis zum nächsten Wert

Hallo,

wie muss ein Makro aussehen, dass in einer Spalte die darunter liegenden Felder solange mit ‚unten Ausfüllen‘ füllt, bis ein Feld kommt, in dem ein Wert steht, wobei die Zahl der zu füllenden Felder variiert.

Bsp:

Wert1
blank
blank
blank
Wert2
blank
blank
Wert3
.
.
.

(blank-Felder sollen mit darüber liegendem Wert gefüllt werden)

Danke

Mirko

Hallo Mirko

Versuchs mal hiermit, z.b. in der Spalte 2 ab zeile 5

Private Sub()
dim x as integer

x = 0

while tabelle1.Cells((5 + x),2) „“

tabelle1.Cells((5 + x),2) = „unten Ausfüllen“
x = x + 1

Wend

End Sub

Und das Ganze dann mit nem ActiveX SteuerElement, z.b. nem Button ausführen und fertig.

Gruß Micha

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin,

das, was Michael geschrieben hat, war wohl nicht ganz das, was Du meintest, oder? Versuch´s mal damit:

Sub NachUntenAusfuellenSpezial()
' [email protected], 25.11.2003
 Dim x1 As Integer
 Dim y1 As Integer
 Dim x2 As Integer
 Dim y2 As Integer
 Dim yo As Integer
 Dim yu As Integer


 ''''''''''''''''''''''''''''''''''''''''''''''
 ' Koordinaten des ausgewählten Bereichs merken
 ' (Voraussetzung hier: einspaltiger Bereich):
 ''''''''''''''''''''''''''''''''''''''''''''''
 With Selection
 x = .Column
 y1 = .Row
 y2 = .Rows.Count + y1 - 1
 End With 'Selection


 '''''''''''''''''''''''''
 ' Prüfung auf Machbarkeit
 '''''''''''''''''''''''''
 If Cells(y1, x).Value = "" Then
 MsgBox "Die erste Zelle des Bereichs darf nicht leer sein!", vbCritical, "Fehler"
 Exit Sub
 End If 'Cells


 ''''''''''''''''''''''''''''''''''''
 'Schrittweises ausfüllen nach unten:
 ''''''''''''''''''''''''''''''''''''
 yo = y1 'y oben (erste Zelle)
 While yo ""
 yo = yo + 1
 Wend 'y
Du musst nur den betroffenen Bereich markieren und das Makro starten. Funktioniert allerdings nur mit einspaltigen Bereichen in diesem Beispiel. Liesse sich aber recht einfach auf mehrere Spalten erweitern.

Kristian

wie muss ein Makro aussehen, dass in einer Spalte die darunter
liegenden Felder solange mit ‚unten Ausfüllen‘ füllt, bis ein
Feld kommt, in dem ein Wert steht, wobei die Zahl der zu
füllenden Felder variiert.

Hallo Mirko,
probier den nachstehenden Code.
Gruß
Reinhard

sub test()
with Worksheets("Tabelle1")
 for x=2 to .Range("A1:A65536).End(xlup).row
 if .cells(x,1)="" then .cells(x,1)=.cells(x-1,1)
 next x
end with
end sub

Reinhard hat den Text auch so verstanden wie ich…

Gurß Micha

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Reinhard hat den Text auch so verstanden wie ich…
Gurß Micha

Nö. Du schreibst in Deiner Variante den Text „unten Ausfüllen“ in die leeren Zellen, und das war ganz sicher nicht der Plan :wink:

Reinhard will im Prinzip das gleiche machen wie ich, allerdings bezieht er sich nur auf das Kopieren der reinen Zellen-Werte, und das ist was anderes als „unten ausfüllen“, weil bei letzterem z.B. noch die Formatierung mitgenommen wird.
Allerdings funktioniert seine Variante sowieso nicht:

  • Ich weiss z.B. nicht recht, was er mit dem „Range(„A1:A65536“).End(xlUp).Row“ bewerkstelligen will. Es führt in jedem Falle zum Ergebnis „1“.
  • Dann läuft das Makro so lange, bis alle 65536 Zeilen ausgefüllt sind, wenn ich das richtig sehe, und dürfte am Ende mit einem Laufzeitfehler aussteigen. Nicht sehr komfortabel.
  • Nicht komfortabel ist auch, dass man sich auf die Spalte A festlegt und dort auch nicht festlegen kann, um welche Zeilen es geht.

Mein Makro ist zwar etwas länger, dafür aber robust und einfach zu bedienen.

Kristian

jain *g
Hallo Kristian,
ja, ich sah die Anfrage so wie du.

Reinhard will im Prinzip das gleiche machen wie ich,
allerdings bezieht er sich nur auf das Kopieren der reinen
Zellen-Werte, und das ist was anderes als „unten ausfüllen“,
weil bei letzterem z.B. noch die Formatierung mitgenommen
wird.

Kein Problem, habs von Kopierren auf „unten ausfüllen“ umgestellt, siehe die beiden Makros.

Allerdings funktioniert seine Variante sowieso nicht:

Sehe ich aber nicht so :smile: (okay A1:A65536 war ein Schreib/Denkfehler, aber mit A65536 klappts )

  • Ich weiss z.B. nicht recht, was er mit dem
    „Range(„A1:A65536“).End(xlUp).Row“ bewerkstelligen will. Es
    führt in jedem Falle zum Ergebnis „1“.
  • Dann läuft das Makro so lange, bis alle 65536 Zeilen
    ausgefüllt sind, wenn ich das richtig sehe, und dürfte am Ende
    mit einem Laufzeitfehler aussteigen. Nicht sehr komfortabel.

„Range(„A65536“).End(xlUp).Row“ ergibt die letzte (von oben gesehen) nichtleere Zelle in A. Es gibt glaub ich nur dann einen Fehler wenn A65536 nichtleer ist, aber das ist nicht zu erwarten im Normalfall.
Ggfs könnte man das ja vorher abprüfen.
Von der reinen Logik her, wäre „Range(„A1“).End(xldown).Row“ zielgerichteter und besser zu verstehen, aber es hüpft zur ersten Zelle die von einer leeren Zelle gefolgt wird und ist somit bei unzusammenhängenden Spalten unbrauchbar.

  • Nicht komfortabel ist auch, dass man sich auf die Spalte A
    festlegt und dort auch nicht festlegen kann, um welche Zeilen
    es geht.

Naja, man kann ja die Spalte im makro ändern.
Siehe unten die beiden Makros, das erste ist auf Spalte A gerichtet, das Zweite wertet die vorher markiereten Zellen aus.
„um welche Zeilen“ ? , verstehe ich jetzt nicht ganz, das Makro geht Spalte A (oder im anderen Makro die Selection) Zelle für Zelle durch und wenn die Zelle leer ist füllt sie die Zelle mit dem Wert von obendrüber. Ja, Makro2 funktioniert auch bei mehrspaltigen Markierungen.

Mein Makro ist zwar etwas länger, dafür aber robust und
einfach zu bedienen.

Ja.
Gruß
Reinhard

Sub test1()
With Worksheets("Tabelle1")
 For x = 2 To .Range("A65536").End(xlUp).Row
 If .Cells(x, 1) = "" Then Range(.Cells(x, 1), .Cells(x - 1, 1)).FillDown
 Next x
End With
End Sub


Sub test2()
For Each Zelle In Selection
If Zelle.Row \> Selection.Row And Zelle.Value = "" Then
 Range(Zelle.Offset(-1, 0), Zelle).FillDown
End If
Next Zelle
End Sub