27.06.2014, 09:42 (Dieser Beitrag wurde zuletzt bearbeitet: 27.06.2014, 12:50 von Rabe.)
Hi Leute,
ich möchte in einem Excel-Formular einen Bereich (Daten UND Formatierung) aus einem Blatt kopieren und an einer bestimmten Stelle eines anderen Blattes wieder einfügen, ausgelöst durch den Druck auf einen Button. Dafür habe ich den Code bereits und er funktioniert auch:
Jetzt aber mein Problem: So wie der Code jetzt ist, würde er bei erneutem Druck auf den Button nur den eben schon eingefügten Bereich überschreiben. Mein Ziel ist es aber, dass bei jedem Druck auf den Button der Bereich unter den schon eingefügten angehängt wird. Ich schildere mal kurz den gewünschten Ablauf:
1. Klick auf den Button 2. Der Bereich A1: D4 von Blatt 3 wird kopiert und an einer vorher definierten Stelle auf Blatt 2 eingefügt (in diesem Beispiel ab E5). 3. Erneuter Klick auf den Button 4. Der Bereich A1: D4 von Blatt 3 wird erneut kopiert, diesmal aber 5 oder 6 Zeilen weiter unten auf Blatt 2 eingefügt. 5. Das Ganze soll sich einige Male wiederholen lassen (mehr als 10 Wiederholungen werden es aber wahrscheinlich nie werden)
Ich habe zwar keine Ahnung von VBA, kenne mich mit Programmierung in anderen Sprachen aber ein Stück weit aus. Daher würde ich das Ganze mit einer Variable für die Zeile, ab der der Bereich eingefügt werden soll, angehen. Die sollte dann einen bestimmten Startwert haben und bei jedem Klick auf den Button um einen festen, gleich bleibenden Werte erhöht werden.
Ich weiß nichts über die allgemeine Struktur von VBA-Codes und Variablen, also wäre ich euch sehr dankbar, falls mir jemand dabei helfen könnte.
Dim lng_Last_R As Long With Worksheets("Tabelle2") lng_Last_R = .Cells(.Rows.Count, "E").End(xlUp).Row Worksheets("Tabelle3").Range("A1:D4").Copy _ Destination:=.Range("E" & WorksheetFunction.Max(3, lng_Last_R) + 2) End With
Dim lng_Last_R As Long With Worksheets("Tabelle2") lng_Last_R = .Cells(.Rows.Count, "E").End(xlUp).Row Worksheets("Tabelle3").Range("A1:D4").Copy _ Destination:=.Range("E" & WorksheetFunction.Max(3, lng_Last_R) + 2) End With
Hi Chris,
das hat leider nicht den gewünschten Effekt. Muss ich dabei noch irgendwas beachten?
@Heinz Ulm:
Ich habe deine Lösung leider nicht verstanden. Ich fürchte, ich bin nicht besonders gut darin, Code einer mir unbekannten Sprache zu analysieren :D
Wärst du so nett, mir zu erklären, wie das funktioniert? Kurzfassung reicht :)
Sheets("Daten").Select 'Festlegung der nächsten freien Zeile auf der Tabelle "Daten" Loletzte = IIf(IsEmpty(Cells(Rows.Count, 2)), Cells(Rows.Count, 2).End(xlUp).Row, Rows.Count) + 1
'Kopieren der Eingabedaten auf Zeile 2 und Ubertrag der Werte in die Tabelle Daten Sheets("Eingabe").Select Range("A2:L2").Copy Sheets("Daten").Select Range("B" & Loletzte).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False
'Kopieren der Formel in der Spalte A der Tabelle Daten vor die eingefügten Werte
'Löschen der Eingabewerte Range("C7:C10,C14:C16,C18:C21").ClearContents End Sub Sub Uebersicht()
Dim Anzahl As Integer Dim ZZeile As Integer Dim ZSpalte As String Dim kZeile As Integer
'Zuweisen der Werte für die Variablen aus den Zellen der Tabelle Eingabe Anzahl = Range("F3").Value ZZeile = Range("F4").Value ZSpalte = Range("H3").Value kZeile = Range("H4").Value
'Kopieren des Bereiches F5:L22 Range("F5:L22").Select Selection.Copy
'Festlegung des Einfügepunktes, welche Spalte (Zspalte = der Wert aus der H3 und ' der Zeile ZZeile =Wert aus der Zelle F4 Range(ZSpalte & kZeile).Select
'Einfügen der Wetre und Formate des kopierten Bereiches Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Range("N5").Select Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False
'Erhöhung der Anzahl und der Zeilen für die nächste Einfügeoperation Anzahl = Anzahl + 1 ZZeile = ZZeile + 19
'Zurückschreiben der erhöhten Werte in die Zellen Range("F3").Value = Anzahl Range("F4").Value = ZZeile
'Überprüfung der anzahl der Einfügungen, wenn Anzahl = 8 dann die Meldung("Es.... werden") If Anzahl = 8 Then MsgBox ("Es kann keine weitere Übersicht eingefügt werden")
'Zurücksetzen der Werte auf die Ausgangsposition Range("F3").Value = 0 Range("F4").Value = 5 End If End Sub
XHTML-Tabelle zur Darstellung in Foren, einschl. der neuen Funktionen ab Version 2007
Add-In-Version 14.24 einschl. 64 Bit
Die Zellen F3 und F4 werden von dem Code gefüllt, in der H3 wird der Spaltenbuchstabe festgelegt, dass nach 4 Einfügungen (Anzahl = 0 bis 3) in spalte N, danach in spalte V die Kopie eingefügt wird.
In der H4 berechne ich wieder in Abhängigkeit des Spaltenbuchstaben die Einfügezeile.
Wenn du noch was wissen willst frage einfach nochmals.
Es ist nicht genug, zu wissen. Man muss es auch anwenden. Es ist nicht genug, zu wollen. Man muss es auch tun.
Vielen lieben Dank. Das ist schon ziemlich 'overpowered' :D
Da ich inzwischen zu dem Schluss gekommen bin, dass ich gar keinen Eingabebereich mehr haben will, wie das in de anderen Frage am Anfang noch der Fall war, sondern einfach nur in der Übersichtssektion neue, leere Bereiche einfügen möchte, die man dann von Hand ausfüllt, ist das jetzt fast zu viel des Guten. Wie würde denn jetzt der Code aussehen, wenn wir uns wirklich nur darauf beschränken, einen Bereich zu kopieren und mit Versänderung der Position einzufügen?
Der Startwert muss nicht automatisch ermittelt werden oder so was, den kann ich auch einfach selbst festlegen. Die Größe des Bereichs beträgt ja 4x4, also sagen wir mal, jeder Bereich wird 5 Zeilen unter dem letzten eingefügt, damit da noch etwas Platz dazwischen ist...
Zitat:Ich habe deine Lösung leider nicht verstanden. Ich fürchte, ich bin nicht besonders gut darin, Code einer mir unbekannten Sprache zu analysieren Wärst du so nett, mir zu erklären, wie das funktioniert? Kurzfassung reicht
1. weiß ich jetzt nicht, ob ich mit dem Richtigen meckere, ich mache es trotzdem Ein Code beginnt mit Sub xxx() ... und endet mit End Sub und nicht irgendwo mittendrin. Nur so kann der Helfende alle Befehle im VBA-Code wirklich überprüfen.
2. zu Deiner angeforderten Kurzfassung (zum Verständnis und drum ohne irgendwelchen SchnickSchnack):
Der Befehl, mit dem Du die letzte beschriebene Zeile eine Spalte eines bestimmten Blattes anzeigen kannst, heißt
Zitat:Dim Zeile as Long ' Laufvariable
With Worksheets("Tabelle2") ' weil Du von Blatt 2 lesen willst
Zeile = .Cells(.Rows.Count, 5).End(xlUp).Row ' die "5" steht für die Spalte "E" ' ermittelt wird hier die letzte bereits beschriebene Zelle
MsgBox Zeile ' das kannst Du beispielsweise mit dieser Meldung problemlos prüfen ' (da diese Zeile nicht wirklich gebraucht wird, kannst Du sie löschen)
Zeile = .Cells(.Rows.Count, 5).End(xlUp).Row +1 ' Da Du die erste Leere Zeile brauchst, um in diese etwas zu kopieren, ' zählst Du auf die ermittelte Zeile noch "+1" hinzu und kannst nun ' Deine Daten da hin kopieren ' (die erste mit Zeile = beginnende Zeile ist dann übrigens auch überflüssig ' und kann gelöscht werden) End With
Im Übrigen würde ich persönlich es vorziehen, Dich mit Deinem Vornamen ansprechen zu können
Ups ... ich habe da mal was probiert, aber die Formatierung ist nicht so, wie ich das erwartet habe. Ich versuche das zu ändern
(27.06.2014, 11:30)Käptn Blaubär schrieb: Ein Code beginnt mit Sub xxx() ... und endet mit End Sub und nicht irgendwo mittendrin. Nur so kann der Helfende alle Befehle im VBA-Code wirklich überprüfen.
Da hast du recht, tut mir leid.
Wenn ich dich richtig verstehe, soll der Code dann also so aussehen?
Code:
Dim Zeile as Long With Worksheets("Tabelle2") Zeile = .Cells(.Rows.Count, 5).End(xlUp).Row Zeile = .Cells(.Rows.Count, 5).End(xlUp).Row +1 End With
Wie sähe dann der komplette Code mit Kopieren und Einfügen aus? An welcher Stelle muss dieses Segment denn rein?