Excel automatisch Ausfüllen nach rechts

cesar

Stammgast
Hallo zusammen

Mich würde mal interessieren, wie das automatische Ausfüllen einer Zeile mit zB. Formeln nach rechts möglich ist.

Zum Verständnis:

Wenn ich zB eine Formel in C1 habe die heisst, A1+B1, kann ich die bei entsprechenden Daten senkrecht mit einem Doppelklick bis zum Datenende ausführen lassen.

Wie mache ich das, wenn die Daten aber waagrecht sind, also die Formel würde heissen, A3 = Summe von A1 und A2? Klar, ich kann dies mit dem Cursor machen, aber was ist sonst noch möglich?

Ich habe keine Möglichkeit im den versch. Foren gefunden, auch keine brauchbare VBA Lösung

Danke fürs Nachdenken
cesar


PS: kann leider keine Beispiele mehr hochladen, habe angeblich bereits das max. Datenvolumen erreicht.
 

nochEinAndreas

Stammgast
Mit VBA geht es so:

Hallo Cesar,

mit VBA kann man sich das eigentlich ganz logisch herleiten.
Zuerst zeichnen wir mal den Makro für das Ausfüllen nach unten auf.
- In die Zellen A1-A10 schreiben wir Zahlen.
- In die Zellen B1-B10 auch.
- In C1 die Formel =A1+B1.
- Jetzt starten wir die Makro-Aufzeichnung.
- Dann einen Doppelklick auf das kleine grüne Quadrat in der rechten unteren Ecke von C1. Die Formel wird bis C10 ausgefüllt.
-Jetzt die Makro-Aufzeichnung stoppen und den Makro anschauen. Die essenzielle Zeile ist
Code:
Selection.AutoFill Destination:=Range("C1:C10")
Das kann man auch in
Code:
Range("C1").AutoFill Destination:=Range("C1:C10")
umschreiben.

Jetzt der Versuch für das Ausfüllen einer Zeile:
- Wir löschen die ganzen Zellen A1-C10.
- Jetzt schreiben wir in die Zellen A1-J1 Zahlen.
- Auch Zahlen in A2-J2.
- In A3 kommt jetzt die Formel =A1+A2
- Und jetzt schreiben wir den Makro um: Unsere Ausgangszelle müssen wir jetzt von C1 in A3 ändern. Und die Zellen die gefüllt werden sollen sind jetzt nicht mehr C1:C10 sondern A3:J3. Also heißt die Codezeile jetzt
Code:
Range("A3").AutoFill Destination:=Range("A3:J3")

Fertig. ausprobieren, funktioniert.

Wie das ganze allerdings ohne VBA geht hab ich auch noch nicht rausgefunden.
Ich melde mich wieder, wenn mir noch was einfällt.

Grüße, Andreas
 

cesar

Stammgast
Hallo Andreas
Danke für deine Antwort.

Dein Vorgehen habe ich kapiert. Aber beim senkrechten Vorgehen habe ich die Möglichkeit, nicht eine beschränkte Zeilenzahl sondern eine variable Anzahl Zellen zu füllen. Mit dem waagrechten Vorgehen geht das nicht. Das ist für mich das eigentliche Problem. Also wenn es mal bis zB. A1 bis E1 geht und ein andermal bis zu A1 bis H1.
Da suche ich eigentlich die Lösung.

Gruss
cesar
 

nochEinAndreas

Stammgast
Dann vielleicht so

Hi cesar,

dann probier' es mal mit diesem Makro.
Code:
Sub horizontalFüllen()
    Dim ze As Long, zeDrüber As Long, zeDrunter As Long
    Dim sp As Long, maxSp As Long
    
    With ActiveCell
        ze = .Row
        sp = .Column
        zeDrüber = WorksheetFunction.Max(ze - 1, 1)
        zeDrunter = WorksheetFunction.Min(ze + 1, Rows.Count)
        maxSp = Cells(zeDrüber, sp).End(xlToRight).Column
        maxSp = WorksheetFunction.Max(maxSp, Cells(zeDrunter, sp).End(xlToRight).Column)
        .AutoFill Destination:=Range(Cells(ze, sp), Cells(ze, maxSp))
    End With
End Sub
Wähle die Zelle aus, deren Formel du kopieren willst und starte den Makro.
Er schaut nach, wie weit die Einträge in den Zeilen darüber und darunter nach rechts reichen. Deine Formel wird bis zur höheren Spaltenzahl nach rechts kopiert.

Grüße, Andreas
 

cesar

Stammgast
Guten Morgen Andreas

Danke für deine Bemühungen. Funktioniert einwandfrei.

Aber ich wundere mich schon, dass die Programmierer von Excel nicht eine Tastenkombination eingefügt haben, mit dem das einfach möglich wäre. Ich bin ja sicher nicht der einzige auf dieser Welt, der mal dieses Bedürfnis hat.

Danke nochmals
cesar
 

nochEinAndreas

Stammgast
Auch für das senkrechte Ausfüllen habe ich keine Tastenkombination gefunden.
Aber du kannst ja dem Makro zum Starten eine Tastenkombi zuweisen.

Gruß, Andreas
 

Gaby Salvisberg

Super-Moderator
Hallo Ihr beiden

Ich habs mal ausprobiert; aber bei mir füllt das Makro nicht nur bis z.B. Spalte K aus, sondern bis ganz, ganz weit rüber, etwa bis ans Ende des Universums. :D

Im Netz habe ich nun etwas anderes gefunden, das bei mir funktioniert:

Code:
Sub HorizontalAusfuellen()

Dim LetzteSpalte As Long

LetzteSpalte = Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
Range(ActiveCell, Cells(ActiveCell.Row, LetzteSpalte)).FillRight

End Sub

Vielleicht ist das noch jemandem dienlich.

Liebe Grüsse
Gaby
 

nochEinAndreas

Stammgast
Du hast Recht

Hallo Gaby,

danke für deinen Einwurf. Es stimmt: Wenn bei meinem Makro die Zeile über oder unter der auszufüllenden leer ist, füllt er wirklich bis ins Nirvana.

Bei der Lösung, die du gefunden hast, ist ein kleiner Haken dabei: Er füllt immer bis zur letzten Spalte aus, die irgendwo auf dem Blatt einen Eintrag hat. Das entspricht nicht ganz dem vertikalen Ausfüllen, das Excel normalerweise macht. Da wird nur bis zum letzten Eintrag einer angrenzenden Spalte gefüllt.
Ich habe meinen Makro etwas umgeschrieben. jetzt sollte das Ende des Universums bei leeren angrenzenden Zeilen nicht mehr erreicht werden. Er füllt jetzt nur noch bis zum letzten Eintrag der Zeile darüber oder darunter aus.

Gruß, Andreas

Code:
Sub horizontalFüllen()
    Dim ze As Long, zeDrüber As Long, zeDrunter As Long
    Dim sp As Long, maxSp As Long
    
    With ActiveCell
        ze = .Row
        sp = .Column
        zeDrüber = WorksheetFunction.Max(ze - 1, 1)
        zeDrunter = WorksheetFunction.Min(ze + 1, Rows.Count)
        maxSp = Cells(zeDrüber, Columns.Count).End(xlToLeft).Column
        maxSp = WorksheetFunction.Max(maxSp, Cells(zeDrunter, Columns.Count).End(xlToLeft).Column)
        .AutoFill Destination:=Range(Cells(ze, sp), Cells(ze, maxSp))
    End With
End Sub
 

weer

Stammgast
Grüezi Andreas

Reichlich spät komme auch ich mit einem Einwurf! Ich habe Werte in A1:G3. A4 enthält die Formel =SUMME(A1:A3). Diese Formel fülle ich nach rechts aus mit Deinem Makro. - Das ist ok.

ABER: Wenn z. B. E4 einen beliebigen Wert enthält, wird diese Zelle mit dem Makro überschrieben. Ich möchte aber, dass nur der Bereich B4: D4 mit der Formel von A4 gefüllt wird. So geschieht es analog beim senkrechten, Excel-internen Ausfüllen, das Cesar ganz zu Beginn geschildert hat.

Ich habe deshalb Dein Makro ergänzt mit einer Schleife - was meinst Du dazu? Und vor allem: Wie machst Du es eleganter?

Code:
Sub HorizontalAusfuellen()
Dim ze As Long, zeDrüber As Long, zeDrunter As Long
Dim sp As Long, maxSp As Long
Dim zelle As Range

With ActiveCell
    ze = .Row
    sp = .Column
    zeDrüber = WorksheetFunction.Max(ze - 1, 1)
    zeDrunter = WorksheetFunction.Min(ze + 1, Rows.Count)
    maxSp = Cells(zeDrüber, Columns.Count).End(xlToLeft).Column
    maxSp = WorksheetFunction.Max(maxSp, Cells(zeDrunter, Columns.Count).End(xlToLeft).Column)

[B]For Each zelle In Range(Cells(ze, sp + 1), Cells(ze, maxSp))
    If Not IsEmpty(zelle) Then
        maxSp = zelle.Column - 1
        Exit For
    End If
Next
[/B]
    .AutoFill Destination:=Range(Cells(ze, sp), Cells(ze, maxSp))
End With
End Sub
Viele Grüsse und ein schönes Wochenende
Niclaus
 

nochEinAndreas

Stammgast
Du bist der wahre Monats-Gewinner

Hallo Niclaus,

als mich Gabi für meinen Makro zum Monatsgewinner gekürt hat, habe ich ihr geschrieben, dass es hier viel würdigere Leute als mich gibt, z.B. dich. Dafür hast du hier den Beweis geliefert.
Du hast völlig Recht: In deinem Fall überschreibt mein Makro eventuell wichtige Daten. Danke, dass du den Fehler entdeckt hast!
Und deine Lösung funktioniert perfekt.
Da du aber nach einer eleganteren Lösung gefragt hast, hier mein Vorschlag:

Code:
Option Explicit

Sub horizontalFüllen()
    Dim ze As Long, zeDrüber As Long, zeDrunter As Long
    Dim sp As Long, maxSp As Long
    
    With ActiveCell
        ze = .Row
        sp = .Column
        zeDrüber = WorksheetFunction.Max(ze - 1, 1)
        zeDrunter = WorksheetFunction.Min(ze + 1, Rows.Count)
        maxSp = Cells(zeDrüber, Columns.Count).End(xlToLeft).Column
        maxSp = WorksheetFunction.Max(maxSp, Cells(zeDrunter, Columns.Count).End(xlToLeft).Column)
        maxSp = WorksheetFunction.Min(maxSp, Cells(ze, sp).End(xlToRight).Column - 1)
        .AutoFill Destination:=Range(Cells(ze, sp), Cells(ze, maxSp))
    End With
End Sub

Ich habe deine Schleife ersetzt durch ein End(xlToRight). Es sucht von der aktuellen Zelle aus nach rechts die erste gefüllte Zelle und geht dann wieder eine Zelle davor. Wenn diese Spalte kleiner (weiter links) ist als die bisher gefundenen darüber und darunter, dann wird nur bis dahin ausgefüllt.
Ob das nun "eleganter" ist, weiß ich nicht. Im Extremfall von sehr sehr vielen Zellen mag es etwas schneller sein. VBA-Schleifen sind nun mal leider recht lahm.

Schöne Grüße und auch dir noch ein schönes Rest-Wochenende,

Andreas
 
Oben