VBA: Bereich mit Variable adressieren und erweitern
#1
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:

Code:
Worksheets("Tabelle3").Range("A1:D4").Copy _
    destination:=Worksheets("Tabelle2").Range("E5")

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.

Vielen Dank im Voraus und herzliche Grüße,

VodeAn
Top
#2
Hallo VondeAn,

in meinem Beispiel in der anderen Frage ist das gelöst.
Es ist nicht genug, zu wissen. Man muss es auch anwenden.
Es ist nicht genug, zu wollen. Man muss es auch tun.
Top
#3
Hi,

...diesmal aber 5 oder 6 Zeilen, tja

Code:
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
lg Chris
Feedback nicht vergessen.
[Bild: v.gif]
3a2920576572206973742064656e20646120736f206e65756769657269672e
Top
#4
(27.06.2014, 09:48)Heinz Ulm schrieb: Hallo VondeAn,

in meinem Beispiel in der anderen Frage ist das gelöst.

Wirklich? Dann hatte ich das entweder übersehen oder so nicht realisiert. Vielen Dank!
Top
#5
(27.06.2014, 09:52)chris-ka schrieb: Hi,

...diesmal aber 5 oder 6 Zeilen, tja

Code:
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 :)

Vielen Dank, ihr beiden!

Grüße VodeAn
Top
#6
Hallo VodeAn,

hier mal der Code mit Anmerkungen:

Code:
Sub ChefdatenSpeichern()
    
    Dim Loletzte As Long
    
    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
    
    Range("A" & Loletzte - 1).Copy
    Range("A" & Loletzte).Select
    ActiveSheet.Paste
    
    'Wechsel auf die Tabelle Eingabe
    
    Sheets("Eingabe").Select
    
    'Aufruf des Makros Uebersicht
    Uebersicht
    
    '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

und zu den Formeln in der Tabelle:



Eingabe
EFGH
3Anzahl0SpalteN
4Zeile55

verwendete Formeln
Zelle Formel Bereich N/A
H3=WENN(F3<4;"N";"V")
H4=WENN(H3="V";F4-76;F4)
Excel-Inn.de
Hajo-Excel.de
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.
Top
#7
Hi,

der Code macht eigentlich das was du beschrieben hast...
Zitat:das hat leider nicht den gewünschten Effekt. Muss ich dabei noch irgendwas beachten?
Code:
damit kann ich leider nichts anfangen, welcher Effekt passt nicht?


Angehängte Dateien
.xlsm   daten.xlsm (Größe: 22,27 KB / Downloads: 4)
lg Chris
Feedback nicht vergessen.
[Bild: v.gif]
3a2920576572206973742064656e20646120736f206e65756769657269672e
Top
#8
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...

Vielen Dank für deine Geduld! :)
Top
#9
Hallo,

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

So, Sorry nochmal. weie gesagt, was probiert und nicht für gut befunden.
So sollte das wirklich aussehen. https://www.dropbox.com/s/muc8032m12z8fy...0Zeile.jpg
Top
#10
(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?

Danke und Grüße,

Max
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste