Excel VBA Einträge als Liste untereinander kopieren?
Hay zusammen,
meine Frage ist wie kann ich die Werte Links in der Tabelle rechts untereinander einfügen? Es muss eine Abfrage erfolgen ob die Zeile leer ist und wenn nicht, dann darunter einfügen.
Habe da ein Makro gefunden aber vielleicht kann mir jemand sagen wie der funktioniert. Kenne mich damit nicht aus. Habe die Werte geändert (Zellenangaben) und trotzdem fügt er die Daten untereinander ein.
Sub Makro2()
'
' Makro2 Makro
'
' Tastenkombination: Strg+e
'
Dim Zelle As Range
Dim Bereich As Range
Set Bereich = Range("J3:N3")
For Each Zelle In Bereich
If IsEmpty(Zelle) Then Exit For
Next Zelle
With ActiveSheet
.Range("A3:E3").Copy
Zelle.PasteSpecial Paste:=xlPasteAll, Transpose:=True
.Range("A3:E3").ClearContents
End With
Application.CutCopyMode = False
End Sub
Verstehe das System nicht ganz.
Kurz: Durch Klick auf Buchen sollen die Werte rechts eingefügt werde. Untereinander bei jeder weiteren Buchung.
Nett wäre es, wenn ihr mir einen Code schickt die eizelnen Begrifflichkeiten zu kommentieren damit ich nicht nur copy paste mache sondern auch daraus lernen kann. :)
1 Antwort
Du hast bei deinem Code irgendwie einen Denkfehler drin. Du suchst von J3 aus nach rechts nach der ersten leeren Zelle. Du willst ja aber eigentlich nach unten suchen. Und beim Einfügen benutzt du "Transpose". Dadurch werden die Zeilen zu Spalten und die Spalten zu Zeilen. Du willst ja aber einfach nur die Zeile unten dran kopieren.
Ich würde es so machen:
- Mache aus deinem Ergebnisbereich eine Tabelle (nicht verwechseln mit dem Tabellenblatt, was standardmäßig auch mit "Tabelle1" oder so beschriftet wird). Dazu markierst du den Bereich J2 bis N3 und drückst Strg+T und dann OK. Das hat den Vorteil, dass es einerseits einfacher durch VBA verwaltbar ist und du andererseits übersichtlicherer Excel-Formeln hast, wo dann nicht J3:J10 oder so drinsteht, sondern z.B. Liste_Buchungen[Datum]
- Gib der Tabelle einen Namen. Dazu gehst du oben ins Menü "Tabellenentwurf" und kannst dann ganz links in die Box einen Namen schreiben. Ich hab die Liste z.B. "Liste_Buchungen" genannt.
- Mit folgendem Code kannst du eine neue Zeile daran anfügen:
Option Explicit ' Das schreib ich immer mit rein. Dadurch akzeptiert VBA nur Variablen, die vorher mit Dim erstellt wurden
Sub Neuer_Eintrag()
' Eine Variable für die Tabelle "Liste_Buchungen" erstellen
Dim listBuchungen As ListObject
Set listBuchungen = ActiveSheet.ListObjects("Liste_Buchungen")
' Eine neue (leere) Zeile anfügen und mit der Variable "neueZeile" verknüpfen
Dim neueZeile As ListRow
Set neueZeile = listBuchungen.ListRows.Add
' Die fünf Eingabezellen in die neue Zeile kopieren
neueZeile.Range.Value = Me.Range("A3:E3").Value
End Sub
Der Code muss in den Code für das Tabellenblatt rein, sonst funktioniert die letzte Zeile nicht oder du musst "Me.Range" ändern zu "ActiveSheet.Range".
Und auch wenn ich es bei ziemlich vielen Excel-Fragen sage und fast nie jemand auf mich hört: Excel ist keine Datenbanksoftware und sollte daher auch nicht als Datenbank benutzt werden. Wenn die Datenbestände größer werden oder Daten mit Daten aus anderen Tabellen verknüpft werden sollen oder Daten anhand bestimmter Kriterien verändert oder gelöscht werden sollen, ist das mit Excel ein wesentlich größerer Aufwand, als mit einer echten Datenbank.
Also die Buttons bleiben bei den Eingabefeldern, aber die Tabelle ist auf einem anderen Blatt?
Dann musst du bei der Variable "listBuchungen" noch mit angeben, auf welchem Tabellenblatt sie ist. Also z.B. so:
Set listBuchungen = Worksheets("Zieltabelle").ListObjects("Liste_Buchungen")
Und "Zieltabelle" ist dann halt der Name des Tabellenblatts, was unten auf dem Aktenreiter steht, wo du zwischen den Tabellenblättern wechseln kannst.
Vielen Dank das hat mir sehr geholfen. Wie ändere ich denn den Wert wenn ich die Tabelle auf einem anderen Blatt habe? Denke die Variable wird gleich erstellt. Muss da nichts ändern. Aber fürs kopieren.
neueZeile.Range.Value = Me.Range("A3:E3").Value was muss ich da ändern?