Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Makro in Excel: Dynamische Liste kopieren





Frage

Hallo, ich bin zum ersten mal hier und wage erste Schritte im Bereich VBA. Mein Problem sieht wie folgt aus: Ich habe 3 Excel Arbeitsblätter (das erste enthält Daten, die ich mittels KdNr. in das 2. Arbeitsblatt (Rechnung) einfüge als Liste. Nun möchte ich gern das per Button diese Liste, die natürlich von den Positionen (=Zeilenanzahl) ständig variiert auf das dritte Arbeitsblatt (Gesamtumsatz) kopiert wird und zwar untereinander also Fortsetzung immer in der nächsten neuen und leeren Zeile. Wenn ich dann noch auf das 2. Arbeitsblatt einen Button setzen könnte, der erreicht, dass die Inhalte nach (!) dem Kopieren gelöscht werden, wäre das obergenial. Für einen Einstieg sicherlich viel und heftig aber vielleicht bekomme ich hier einen Ansatz zur Lösung. Vielen Dank Enibas74

Antwort 1 von coros

Hallo Enibas74,

mit nachfolgendem Makro wird Dir der Bereich A1: letzte beschriebene Spalte und letzte beschriebene Zeile im gesamten Tabellenblatt "Tabelle1" kopiert und in die erste freie Zeile im Tabellenblatt "Tabelle2" in Spalte A eingefügt. Danach wird der kopierte Bereich in Tabellenblatt "Tabelle1" geleert.
Kopiere das Makro in ein StandardModul und starte es z.B. über eine Befehlsschaltfläche.

Option Explicit

Sub Zellen_kopieren()
Rem: Variablen deklarieren
Dim lastCell As Long, lastColumn As Integer

Rem: Bildschirmaktualisierung ausschalten
Application.ScreenUpdating = False

Rem: letzte beschriebene Zeile in Tabellenblatt "Tabelle1" in Spalte A ermitteln
Rem: und in Variable "lastCell" schreiben
Rem: Stehen die Kundennummern in einer anderen Spalte, die Spaltenbezeichnung A
Rem: in der Range("A65536")- Anweisung ändern
lastCell = Sheets("Tabelle1").Range("A65536").End(xlUp).Row

Rem: letzte beschriebene Spalte in Tabellenblatt "Tabelle1" ermitteln
Rem: und in Variable "lastColumn" schreiben
lastColumn = Sheets("Tabelle1").UsedRange.Columns.Count

Rem: Den Bereich A1 bis letzte beschriebene Zelle und letzte beschriebene Zeile
Rem: (Bereichsende setzt sich aus den Variablen "lastColumn" und "lastCell" zusammen) kopieren und...
Sheets("Tabelle1").Range(Cells(1, 1), Cells(lastCell, lastColumn)).Copy

Rem:...nur Werte ohne Formate in Tabellenblatt "Tabelle2" in die erste freie Zeile in Spalte A einfügen
Rem: Sollen die Daten in einer anderen Spalte als Spalte A eingefügt werden, die Spaltenbezeichnung A
Rem: die Zahl 1 vor der Schließenklammer gegen eine andere Spaltenindexnummer ersetzen.
Rem: Die Zahl 1 steht für Spalte A, eine 2 würde für Spalte B stehen für C eine 3 usw.
Rem: bis zur 256 für Spalte IV
Sheets("Tabelle2").Cells(Sheets("Tabelle2").Range("A65536").End(xlUp).Offset(1, 0).Row, 1) _
.PasteSpecial Paste:=xlPasteValues

Rem: Den Inhalt des kopiereten Bereichs im Tabellenblatt "Tabelle1" löschen
Sheets("Tabelle1").Range(Cells(1, 1), _
Cells(lastCell, lastColumn)).ClearContents
End Sub


Ich hoffe, Du hast das so gemeint. Bei Fragen melde Dich bitte.

Solltest Du nicht wissen, wie Du den Code in Deine Datei bekommst, dann schau mal auf meiner HP in der Rubrik Anleitungen und dort dann in der Anleitungsnummer 3 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 2 von coros

Hallo enibas,

nachfolgender Code, sollte das machen, was Du mir im Pager geschrieben hast. Bitte stelle keine Fragen zu meinen Antworten über den Pager, sondern bleibe in dem Beitrag, damit auch nachfolgende User das Problem nachvollziehen können.

Hier noch die Nachricht von enibas, die er mir über den Pager geschrieben hat, damit man weiß, warum das Makro umgestellt wurde.
Zitat:
Hallo Oliver,
vielen Dank für Deine Hilfe. Ich bin super beeindruckt und unendlich dankbar, hätte aber nochmal eine Bitte. Ich habe den Code kopiert und gemäß der super Anleitung auf Deiner Homepage eingefügt. Alles hat eigentlich gut geklappt. Nur habe ich festgestellt, dass ich wohl in meiner Beschreibung ungenau war. Die zu kopierenenden Spalten sind immer gleich (sprich Spalte B (dass konnte ich problemlos ändern) bis Spalte D), die Zeilenanzahl in der Liste sind jedoch variabel allerdings habe ich in der letzten Zeile immer eine Ergebnisspalte eingefügt (Summe der Spalte D) die nicht mit kopiert und dann auch später gelöscht werden soll. Kann man das noch in den Code einfügen (theoretisch müsste die Anzahl der gefüllten Zeilen immer vor Beginn des Kopierens um 1 reduziert werden, oder?)
hier noch der Link zu meiner Frage und Deiner Antwort.

http://www.supportnet.de/threads/1490369

Gruß
enibas74

Und hier nun das geänderte Makro:

Option Explicit

Sub Zellen_kopieren()
Rem: Variablen deklarieren
Dim lastCell As Long, lastColumn As Integer

Rem: Bildschirmaktualisierung ausschalten
Application.ScreenUpdating = False

Rem: letzte beschriebene Zeile in Tabellenblatt "Tabelle1" in Spalte A ermitteln
Rem: und in Variable "lastCell" schreiben
Rem: Stehen die Kundennummern in einer anderen Spalte, die Spaltenbezeichnung A
Rem: in der Range("A65536")- Anweisung ändern
lastCell = Sheets("Tabelle1").Range("A65536").End(xlUp).Row - 1

Rem: Den Bereich A1 bis letzte beschriebene Zelle und letzte beschriebene Zeile
Rem: (Bereichsende setzt sich aus den Variablen "lastColumn" und "lastCell" zusammen) kopieren und...
Sheets("Tabelle1").Range(Cells(1, 2), Cells(lastCell, 4)).Copy

Rem:...nur Werte ohne Formate in Tabellenblatt "Tabelle2" in die erste freie Zeile in Spalte A einfügen
Rem: Sollen die Daten in einer anderen Spalte als Spalte A eingefügt werden, die Spaltenbezeichnung A
Rem: die Zahl 1 vor der Schließenklammer gegen eine andere Spaltenindexnummer ersetzen.
Rem: Die Zahl 1 steht für Spalte A, eine 2 würde für Spalte B stehen für C eine 3 usw.
Rem: bis zur 256 für Spalte IV
Sheets("Tabelle2").Cells(Sheets("Tabelle2").Range("A65536").End(xlUp).Offset(1, 0).Row, 1) _
.PasteSpecial Paste:=xlPasteValues

Rem: Den Inhalt des kopiereten Bereichs im Tabellenblatt "Tabelle1" löschen
Sheets("Tabelle1").Range(Cells(1, 2), _
Cells(lastCell, 4)).ClearContents
End Sub


Ich hoffe, Du meintest das so. Bei Fragen melde Dich wieder hier im Beitrag.

MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein
Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.

Antwort 3 von xheine

Hallo,
bin neu und habe keine Ahnung!!
Nach "Recoverey" des Laptops kann ich einige Listen
in Exel(2000) nicht mehr öffnen. Da kommen Warnungen: Liste enthält Makros! Wenn ich deaktiviere, dann will der PC gleich alles Bill Gates melden. Unter nicht melden, schließt sich Exel . Kann man das Unterdrücken. Er macht das aber nicht bei allen Tabellen. Nur solche, die ich mal importiert habe. Die haben aber vorher (unter WIN98) Problemlos funktioniert.
ICH BIN HILFLOS UND WEISS NICHT WEITER:

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: