Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Tabelle erweitern

Tabelle erweitern
04.01.2017 13:04:04
Barbara
Hallo
In meinem Sheet soll eine bestimmte Tabelle um eine Zeile mit einem bestimmten Inhalt erweitert werden, mit VBA.
Mein Sheet hat
- eine Tabelle mit dem Namen "Tabelle2", darüber Überschrift und darunter Ergebniszeile.
- ein Bereich mit dem Namen "Neukunde", eine Zeile hoch und genau so viele Spalten wie "Tabelle2" breit
Nun soll "Neukunde" in "Tabelle2" hinein, also zwischen letzte Zeile und Ergebniszeile, kopiert werden.
Ich habe hier meine Schwierigkeiten, wie das mittels VBA zu machen ist (an Tabelle anhängen, mit Bereichen arbeiten, etc.), und bitte um Hilfe. Der makrorecorder hilft da auch nicht weiter.
Leider kann ich hier jetzt keine Beispieldatei hochladen, aber ich habe versucht, den Sachverhalt genau zu beschreiben.
Zur Klarstellung hier im Text:
Sheet: Excel-Tabellenblatt
Tabelle: Eine Tabelle in einem Sheet, eingefügt mit Einfügen/Tabelle oder Strg+T
LG, Barbara
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabelle erweitern
04.01.2017 13:56:46
Michael
Hi Barbara,
ich habe mal "Tabelle2" und "Neukunde" zum Testen angelegt; das Makro spuckt Dir einige Angaben aus und fügt direkt über der Ergebnis ("total-")-Zeile den neuen Kunden ein:
Sub test()
Dim hrr$, trr$
'  MsgBox ActiveSheet.ListObjects("Tabelle2").InsertRowRange.Address ' zickt
' siehe auch:
' http://dailydoseofexcel.com/archives/2015/01/09/finding-the-next-row-in-a-listobject-in-vba/
MsgBox ActiveSheet.ListObjects("Tabelle2").HeaderRowRange.Address
MsgBox ActiveSheet.ListObjects("Tabelle2").ListRows.Count
MsgBox ActiveSheet.ListObjects("Tabelle2").TotalsRowRange.Address
' Variante 1:
ActiveSheet.ListObjects("Tabelle2").TotalsRowRange.Insert Shift:=xlDown
ActiveSheet.ListObjects("Tabelle2").TotalsRowRange.Offset(-1).Value = Range("Neukunde").Value
' Variante 2:
hrr = Split(ActiveSheet.ListObjects("Tabelle2").HeaderRowRange.Address, ":")(0)
trr = Split(ActiveSheet.ListObjects("Tabelle2").TotalsRowRange.Offset(1).Address, ":")(1)
MsgBox "von " & hrr & " bis " & trr
ActiveSheet.ListObjects("Tabelle2").Resize Range(hrr & ":" & trr)
ActiveSheet.ListObjects("Tabelle2").TotalsRowRange.Offset(-1).Value = Range("Neukunde").Value
End Sub

Datei: https://www.herber.de/bbs/user/110325.xlsm
Ich benutze die Dinger nicht laufend, d.h. es kann gut sein, daß noch jemandem was Schöneres einfällt.
Schöne Grüße,
Michael
Anzeige
AW: Tabelle erweitern
04.01.2017 22:13:53
Barbara
Hallo Michael,
immer wieder überwältigend, die Hilfsbereitschaft in diesem Forum.
Auch Dir, vielen Dank, Michael.
Leider konnte ich selbst in der Hilfe keinen Hinweis auf die ListObjects-Eigenschaften finden, die Du hier angewendet hast. Nicht einmal die Intellisense springt an, zumindest nicht im Modul1. Da ist es schwer, zu experimentieren.
Aber gut, dass es Euch gibt. Zumindest mein konkretes Problem ist gelöst. Danke.
LG, Barbara
Anzeige
AW: Tabelle erweitern
04.01.2017 19:49:29
Barbara
Hallo Michael (migre),
danke, funktioniert.
Ich kann zwar ungefähr alles nachvollziehen, doch verstehen tu ich Folgendes nicht:
Zu:
Lo.DataBodyRange.Offset(.Rows.Count - 1, 0).Resize(1, .Columns.Count)
Lo ist ein ListObject
Lo.DataBodyRange ist ein Range
Was ist Lo.DataBodyRange.Offset(.Rows.Count - 1, 0)?
Und wie geht es dann mit dem Resize weiter?
Vielen Dank, LG,
Barbara
Anzeige
AW: Tabelle erweitern
04.01.2017 23:13:58
Michael
Hallo!
doch verstehen tu ich Folgendes nicht:
Lo.DataBodyRange.Offset(.Rows.Count - 1, 0).Resize(1, .Columns.Count)

Ist eigentlich nicht zu kompliziert, Du bist ja fast schon am Ziel:
Lo ist ein ListObject - Richtig
Lo.DataBodyRange ist ein Range - Richtig; und zwar der Datenbereich der jeweiligen formatierten Tabelle.
Was ist Lo.DataBodyRange.Offset(.Rows.Count - 1, 0)?
Der Datenbereich der formatierten Tabelle reicht von der ersten Zeile unter der Überschrift bis zu Zeile über der Ergebniszeile. Da wir im Code zunächst diesem Datenbereich eine (zunächst leere) Zeile hinzufügen, wollen wir ja im nächsten Schritt nur die Zellen dieser neuen Zeile befüllen; mit DataBodyRange sprechen wir aber den gesamten (!) Datenbereich an.
Weil das aber ein Range ist, können wir diesen zunächst mit Offset versetzen; stell Dir vor Du würdest DataBodyRange markieren (sagen wir das sind 5 Zeilen) - Offset(.Rows.Count - 1,0) würde nun bedeuten, dass wir diese Markierung nun um die Anzahl der Zeilen in der Markierung (=5) minus 1 (=4) nach unten verschieben, aber um keine Spalte. Damit wäre jetzt ein Bereich markiert, dessen erste Zeile die von uns zuvor neu hinzugefügte (leere) Zeile im Datenbereich ist (und noch fünf Zeilen darunter).
Die Zeilen unter dieser ersten Zeile interessieren uns aber nicht - wir wollen ja nur die eine leere Zeile mit Daten aus dem benannten Bereich befüllen - d.h. wir verändern jetzt (um im Bsp zu bleiben) die aktuelle Markierung mit Resize(1, .Columns.Count) und sagen damit, dass der gewählte Bereich nur mehr 1 Zeile, aber soviele Spalten umfassen soll, wie der Datenbereich eben aufweist; voilá, damit wäre nur mehr die gewünschte Zeile markiert.
Im Code wird natürlich nicht markiert, sondern einfach der Bereich, wie aufgezeigt, bestimmt - und durch die Bestimmung des Zielbereichs (die neue, leere Zeile im Datenbereich) können wir die Inhalte aus dem benannten Bereich einfach übertragen.
Klar? ;-)
LG und schönen Abend
Michael
Anzeige
AW: Tabelle erweitern
05.01.2017 00:04:00
Gerd
Hallo Barbara,
hallo Michael(migre)!
Alles richtig u. der Code ist prima deklariert. Wenn man aber die eingefügte Zeile als "direkt über der Ergebniszeile liegende" mit dem einzeligen gleichgroßen Bereich(NEUKUNDE) füllt, fällt die Erklärung des Offset einfacher aus.
Sub AppendDataTable()
Const FORMTABELLE As String = "Tabelle2"
Const EINGABE As String = "Neukunde"
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim Ws As Worksheet: Set Ws = Wb.Worksheets("Tabelle1")
Dim Bereich As Range, Lo As ListObject
With Ws
Set Bereich = .Range(EINGABE)
Set Lo = .ListObjects(FORMTABELLE)
Lo.ListRows.Add
Lo.TotalsRowRange.Offset(-1).Value = Bereich.Value
End With
End Sub
Gruß Gerd
Anzeige
Viele Wege führen wiedermal nach Rom...
05.01.2017 08:01:28
Michael
... wie ja auch schon die diversen Varianten von Michael zeigen.
Spricht wohl auch für die Flexibilität von formatierten Tabellen.
Lg an Chris
Michael
Sorry, meine natürlich Grüße an Gerd! owT
05.01.2017 08:57:46
Michael
AW: Tabelle erweitern
05.01.2017 14:30:21
Barbara
Hallo beide,
danke, Michael, für die anschauliche Erklärung. Jetzt ist es einfach zu verstehen. Weil Du auch gut beschrieben hast, worauf es ankommt.
Gerds Kommentar "der Code ist prima deklariert" könnte ein Hinweis sein, warum bei Michael(migre)s Code die Auto-Vervollständigung und die Hinweise auf Methoden und Eigenschaften funktionieren. Offensichtlich kommt es da auf Dinge an, die anfangs nicht so wichtig scheinen. So macht VBA noch mehr Spass.
Nun habe ich ein weiteres Problem, wo ich Hilfe brauche.
Die Tabelle soll nun nicht in dieser Datei, sondern in einer anderen sein. Ihr Name, inklusive Pfad, steht in einer Zelle mit dem Namen "Liste". Name deshalb, weil bei nachträglicher Änderung der Tabelle (z.B. Einfügen einer Zeile oberhalb) die Adresse der Zelle ja nicht mehr stimmt, der Name aber sehr wohl. Ich denke, dass das Problem der veränderten Zelladressen anders nicht behebbar ist. Aber das nur nebenbei.
Also: Der Bereich "Neukunde" soll in eine andere Datei , deren Pfad und Name in der Zelle namens "Liste" steht, dort in den Bereich "Tabelle2" kopiert werden. Dabei soll egal sein, ob diese Datei gerade geöffnet ist oder nicht. Wenn sie zu ist, soll sie zu bleiben (danach zumindest).
Der zu kopierende Bereich "Neukunde" enthält Zellen mit Verweisen auf andere Zellen, z.B. "=Gesamtkosten". Dieser Name soll aber nicht mit übertragen werden (was beim händischen Copy-Paste lästigerweise der Fall ist, auch wenn ich nur Werte übertrage). Es soll der reine Inhalt kopiert werden, also das, was der Anwender sieht, keine Namen, keine Formeln.
LG,
N.
Anzeige
Nachgefragt...
05.01.2017 15:06:04
Michael
Hallo Barbara (Hallo N.?)!
Deine neue Aufgabenstellung ist mir noch nicht ganz klar. Ich versuche zusammenzufassen:
Du hast 2 unterschiedliche Dateien (Arbeitsmappen), zB MappeA.xlsm und MappeB.xlsm.
In MappeA gibt es eine formatierte Tabelle namens "Tabelle2".
In Mappe B gibt es einen benannten Bereich "Neukunde" und einen benannten Bereich namens "Liste" (eine Zelle). In der Zelle "Liste" steht der Dateipfad auf MappeA.
Jetzt sollen, wie bisher, die Werte aus dem Bereich "Neukunde" in die formatierte Tabelle übertragen werden, MappeA soll aber nach dem Vorgang wieder geschlossen werden.
Das Makro soll also folglich in MappeB liegen. Wie steht der Pfad auf MappeA in "Liste" - als Hyperlink, als String, als Formel-Hyperlink?
Richtig?
LG
Michael
Anzeige
AW: Nachgefragt...
05.01.2017 19:42:13
Barbara
Hi Michael,
ja genau so ist es.
In der Zelle mit dem Namen "Liste" in Mappe B steht als String: "C:\Keller\Sammlung\Mappe A.xlsm"
Das Makro steht in Mappe B und soll eine Zeile in Mappe A einfügen.
Falls dabei Mappe A offen ist, soll sie es auch bleiben.
Falls Mappe A aber zu ist, soll sie es auch nachher sein. Beide Fälle sollen also möglich sein. Dabei interessiert mich natürlich, wie das gelöst werden kann, auch für andere Anwendungen.
LG, B (gleich neben N auf der Tastatur)
Anzeige
Ok, schau ich mir an, vermutlich bis Montag! owT
05.01.2017 23:00:59
Michael
Erweiterte Variante...
06.01.2017 13:26:31
Michael
Hallo Barbara,
...bin doch schon dazugekommen, mir das anzusehen.
Hier eine neue Bsp-Datei für Dich: https://www.herber.de/bbs/user/110369.xlsm
Das wäre nun Deine MappeB... eine Testmappe A müsstest Du Dir dann einfach noch am gewünschten Speicherort erstellen.
Beachte in der Zielmappe (MappeA) muss natürlich ein entsprechendes Tabellenblatt und eine formatierte Tabelle vorhanden sein - die Namen an sich kannst Du im Makro anpassen, aber Fehlerüberprüfungen hab ich jetzt dafür noch nicht eingebaut.
Ansonsten siehe Code und Bsp-Mappe.
Bin am Mo wieder im Forum, gib Bescheid,
LG
Michael
Anzeige
AW: Erweiterte Variante...
06.01.2017 22:06:36
Barbara
Hallo Michael
funktioniert, danke.
(habe 6 Stunden herumprobiert und -experimentiert und bin um einiges klüger, auch was die Objekte betrifft)
Gut auch, wie Du den Code angelegt hast, zuerst die anzupassenden Werte. Damit kann ich das Makro vielseitig einsetzen.
Vielen Dank nochmals.
LG, Barbara
Anzeige
Na spitze, freut mich! lg owT
07.01.2017 10:11:05
Michael
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Tabelle erweitern in Excel mit VBA


Schritt-für-Schritt-Anleitung

Um eine Excel-Tabelle zu erweitern, insbesondere durch das Hinzufügen einer Zeile mit VBA, kannst du folgende Schritte befolgen:

  1. Öffne den VBA-Editor: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Erstelle ein neues Modul: Klicke im Menü auf Einfügen > Modul.

  3. Füge den folgenden VBA-Code ein:

    Sub AppendDataTable()
       Const FORMTABELLE As String = "Tabelle2"
       Const EINGABE As String = "Neukunde"
       Dim Wb As Workbook: Set Wb = ThisWorkbook
       Dim Ws As Worksheet: Set Ws = Wb.Worksheets("Tabelle1")
       Dim Bereich As Range, Lo As ListObject
    
       With Ws
           Set Bereich = .Range(EINGABE)
           Set Lo = .ListObjects(FORMTABELLE)
           Lo.ListRows.Add
           Lo.TotalsRowRange.Offset(-1).Value = Bereich.Value
       End With
    End Sub
  4. Führe das Makro aus: Gehe zurück zu Excel, drücke ALT + F8, wähle AppendDataTable und klicke auf Ausführen.

Dieser Code fügt eine neue Zeile zu der Excel-Tabelle hinzu und kopiert den Inhalt aus dem benannten Bereich "Neukunde" in die neue Zeile.


Häufige Fehler und Lösungen

  • Fehler: "Objekt nicht gefunden": Stelle sicher, dass die Tabelle tatsächlich "Tabelle2" heißt und sich im richtigen Arbeitsblatt befindet.
  • Fehler: Bereich nicht definiert: Überprüfe, ob der benannte Bereich "Neukunde" korrekt definiert ist.
  • Lösung für Auto-Vervollständigung: Achte darauf, dass deine Variablen und Objekte korrekt deklariert sind, um die IntelliSense-Funktion in VBA zu aktivieren.

Alternative Methoden

Neben der Verwendung von VBA gibt es auch andere Möglichkeiten, um eine Excel-Tabelle zu erweitern:

  • Manuelles Hinzufügen: Klicke mit der rechten Maustaste auf die letzte Zeile der Tabelle und wähle Zeile einfügen.
  • Tabelle erweitern: Du kannst die Excel-Tabelle auch manuell erweitern, indem du den Tabellenspeicherbereich im Tabellenblatt anpasst. Klicke einfach auf die untere rechte Ecke der Tabelle und ziehe sie nach unten.

Praktische Beispiele

  1. Erweiterung einer bestehenden Tabelle: Wenn du eine Zeile hinzufügen möchtest, die die Daten eines neuen Kunden enthält, kannst du den oben beschriebenen VBA-Code verwenden, um den Inhalt von "Neukunde" in "Tabelle2" zu übertragen.

  2. Erweitern einer Tabelle um mehrere Zeilen: Du kannst den VBA-Code anpassen, um mehrere Zeilen gleichzeitig hinzuzufügen, indem du die Schleife verwendest:

    For i = 1 To 5 ' Beispiel für 5 neue Zeilen
       Lo.ListRows.Add
       Lo.TotalsRowRange.Offset(-1).Value = Bereich.Value ' Hier anpassen für unterschiedliche Werte
    Next i

Tipps für Profis

  • Verwende ListObject.Resize: Mit ActiveSheet.ListObjects("Tabelle2").Resize Range("A1:B10") kannst du den Bereich der Tabelle dynamisch anpassen.
  • Nutze die InsertRowRange-Eigenschaft: Diese kann verwendet werden, um spezifische Zeilen innerhalb der Tabelle einzufügen, anstatt den Standardansatz zu nutzen.
  • Teste mit einem Makro-Recorder: Wenn du dir nicht sicher bist, wie du eine bestimmte Aktion in VBA umsetzen kannst, nutze den Makro-Recorder, um den entsprechenden VBA-Code zu generieren.

FAQ: Häufige Fragen

1. Wie kann ich eine Tabelle in Excel nach links oder unten erweitern? Du kannst die Größe der Tabelle anpassen, indem du die Registerkarte "Tabellen-Design" verwendest oder den Bereich in VBA mit .Resize änderst.

2. Was ist der Unterschied zwischen ListObject und Range in VBA? Ein ListObject ist eine strukturierte Tabelle in Excel, während ein Range eine beliebige Zellgruppe darstellt. ListObjects bieten zusätzliche Funktionen für formatierte Tabellen, wie z.B. das Einfügen von Zeilen.

3. Kann ich die Tabelle auch in einer anderen Datei erweitern? Ja, du kannst den Code so anpassen, dass er mit einer anderen Arbeitsmappe arbeitet, indem du die Datei öffnest oder referenzierst, bevor du die Tabelle erweiterst.

4. Wie kann ich sicherstellen, dass keine Formeln beim Kopieren übertragen werden? Verwende die .Value-Eigenschaft, um nur die sichtbaren Inhalte zu übertragen, anstatt die Formeln.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige