PDA

Vollständige Version anzeigen : VBA Schleifen


bab_43
19.09.2016, 23:12
hallo, bräuchte Hilfe und verzweifle an meiner Unkenntnis - heul


Im Bereich A2 bis A50 befinden sich Namen (jedoch nicht in jeder Zeile). Das Makro soll zum ersten Namen springen diesen kopieren und so lange untereinander schreiben, bis der nächste Name kommt, diesen dann wieder kopieren und wieder untereinander schreiben und so weiter.
Meine VBA Kenntnisse reichen leider nur für Makroaufzeichnungen und diese dann leicht zu verändern, bei den Schleifen steig ich völlig aus.

kann mir da jemand aushelfen,

danke lg. Barbara

Oge
20.09.2016, 00:45
Hallo Barbara,

VBA ist hierfür nicht notwendig.

folgender Ablauf reicht aus

a)Markiere A2 bis A50
b)Drücke STRG+g
c)Wähle Inhalte Leerzellen (ok)
d)Trage =A2 ein und schliesse mit STRG+Enter ab.

Falls dir die Funktionen in der Spalte A nicht gefallen, kannst du sie mit koopieren und Werte einfügen überschreiben.

DeBabba
20.09.2016, 07:14
Hi barbara,
OHNE Makro

Klicke auf ein Feld mit Namen
Markiere alle leeren Zellen
Drücke Taste "F2"
dann "Strg + Enter"
und dann den Rest auf gleiche Weise


Hier dein Marko(chen)
Sub Kutan()
Dim A
For A = 2 To 50
If Cells(A, 1) = "" Then
Cells(A, 1) = Cells(A - 1, 1)
End If
Next
End Sub

Kurze Erklärung
1. Schleife ab 2 bis 50 (For A = 2 to 50)
2. Wenn Zelle in Spalte 1 leer ist, DANN nimm den Wert aus der Zelle darüber
3. Nächste Zelle

viel Spass;)

DeBabba

Beverly
20.09.2016, 08:41
Hi Barbara,

Sub Ausfuellen()
Dim lngZeile As Long
Dim lngEnde As Long
For lngZeile = 2 To 49
' letzte freie Zeile feststellen
lngEnde = Cells(lngZeile, 1).End(xlDown).Row - 1
' Autoausfüllen bis nächste belegte zeile
Cells(lngZeile, 1).AutoFill Destination:=Range(Cells(lngZeile, 1), Cells(lngEnde, 1)), Type:=xlFillDefault
' neue Startzeile festlegen
lngZeile = lngEnde
Next lngZeile
End Sub



<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

bab_43
20.09.2016, 09:08
ma super ihr seid die Besten !!

vielen Dank,
Ich wollte unbedingt ein Makro, weil meine Anfrage natürlich eine vereinfachte Version darstellte, (es sind nicht 50 Zeilen sondern 500 und ich brauche das 2x im Monat upgedated)
das Marko(Chen) gefällt mir am Besten, weil das versteh sogar ich noch :-)))


merci, merci,

DeBabba
20.09.2016, 09:28
Hi Barbara,
dann in der Zeile
For A = 2 to 50
die 50 mit Deiner zahl (500) ersetzen
ODER (deluxe)
Erst mal die Zeile des letzten Eintrages ermitteln und in Variable "letzteZeile" schreiben, dann 6 dazu (wie in der deiner Beispieldatei)
so hast Du die immer alle , egal wie lang die Tabelle wirklich ist#
Also so..
Sub Kutan()
Dim A, LetzteZeile
LetzteZeile = Cells(10000, 1).End(xlUp).Row
For A = 2 To LetzteZeile + 6
If Cells(A, 1) = "" Then
Cells(A, 1) = Cells(A - 1, 1)
End If
Next
End Sub
Gruß
DeBabba

Beverly
20.09.2016, 10:03
Hi Barbara,

da der letzte Eintrag der Spalte "Total" ist, kann man nach diesem Eintrag suchen und die gefundene Zeile benutzen:

Sub Ausfuellen()
Dim lngZeile As Long
Dim lngEnde As Long
Dim rngTotal As Range
Set rngTotal = Columns(1).Find("Total", lookat:=xlWhole)
For lngZeile = 2 To rngTotal.Row - 1
' letzte freie Zeile feststellen
lngEnde = Cells(lngZeile, 1).End(xlDown).Row - 1
' Autoausfüllen bis nächste belegte zeile
Cells(lngZeile, 1).AutoFill Destination:=Range(Cells(lngZeile, 1), Cells(lngEnde, 1)), Type:=xlFillDefault
' neue Startzeile festlegen
lngZeile = lngEnde
Next lngZeile
Set rngTotal = Nothing
End Sub


<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

DeBabba
20.09.2016, 11:38
hi Karin,
hast ja recht... den letzten Eintrag braucht man ja nicht mehrfach
Gruß
DeBabba

bab_43
21.09.2016, 23:19
Danke, danke, danke,

ihr seid wirklich unglaublich

RPP63neu
22.09.2016, 06:54
Moin!
Ich habe mal den Vorschlag von Oge #2 als Makro umgesetzt.
Dies dürfte auch der (homöopathisch) schnellste sein:

<pre style='border:thin solid #000000; padding:12px 24px; margin-left:12px; color:#000000'><span style='color:#0000EE'>Sub</span> RPP() Application.ScreenUpdating = <span style='color:#0000EE'>False</span> <span style='color:#0000EE'>With</span> Tabelle7.UsedRange.Columns(<span style='color:#FF0080'>1</span>) .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = <span style='color:#FF0000'>&quot;=r[-1]c1&quot;</span> .Copy: .PasteSpecial xlPasteValues Application.Goto .Cells(<span style='color:#FF0080'>1</span>) Application.CutCopyMode = <span style='color:#0000EE'>False</span> <span style='color:#0000EE'>End</span> <span style='color:#0000EE'>With</span> <span style='color:#0000EE'>End</span> <span style='color:#0000EE'>Sub</span></pre>

Gruß Ralf

Beverly
22.09.2016, 08:54
Hi Ralf,

gute Idee. Ich würde aber nicht UsedRange verwenden, denn im konkreten Fall wird sonst auch "Total" mehrfach eingetragen, weil offensichtlich unterhalb noch benutzte Zellen sind.

Dim rngTotal As Range
Set rngTotal = Columns(1).Find("Total", lookat:=xlWhole)
With Range(Cells(2, 1), Cells(rngTotal.Row, 1))
.SpecialCells(xlCellTypeBlanks).Formula = "=A2"
.Copy
.Range("A1").PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
End With
Set rngTotal = Nothing



<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

RPP63neu
22.09.2016, 17:28
Moin Karin!
Danke fürs Lob. :p
Du hast Recht, der UsedRange geht tatsächlich bis E54 :eek:
Ich bin ohne Prüfung davon ausgegangen, dass Total die (letzte) Ergebniszeile ist.
Aber egal, der TE hat ja jetzt eine Menge Blumensträuße erhalten, er kann sich jetzt den schönsten aussuchen …

Gruß Ralf