Das Clever-Excel-Forum.de - Treffen
... 14.-16. September 2018 im Allgäu ...

Nächste leere Zeile ermitteln
#1
Hallo Community,

ich möchte mein EXCEL Formular um einen Button erweitern. Der Button soll die Zeilen 1 bis 36 per Format übertragen in die nächsten 36 Zeilen einfügen. Das heißt, sobald die Zellen 37 - 72 bereits befüllt sind, sollen die Zellen 73 - 108 beschrieben werden. Gibt es hierzu eine Programmierung, die ähnlich wie eine "for" Schleife agiert?

Es sollen die Zellen A4 (1-36), A40 (37-72), ... usw. geprüft werden und sobald eine der Zellen leer ist, soll dieser Bereich ausgefüllt werden. Zumindest wäre das meine Vorstellung. Mir wäre auch jede andere Realisierung recht, solange immer die nächsten 36 Zeilen beschrieben werden ^^.

Mein bisheriger Amateur Code:
Code:
Private Sub CommandButton1_Click()
   '
' SeiteVerlängern Makro
'

'
   Rows("1:36").Select
       Selection.Copy
   
   Rows("37:72").Select
       Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
       SkipBlanks:=False, Transpose:=False
       Application.CutCopyMode = False
   
   Range("A1:BO36").Select
       Selection.Copy
   
   Range("A37").Select
       ActiveSheet.Paste
   
   Range("D45:F66,H45:K66,N45:O66,P45:Q66").Select
   Range( _
       "D45:F66,H45:K66,N45:O66,P45:Q66,AL45:AN66,AP45:AR66,AT45:AW66,AY45:BA66,BC45:BF66,BH45:BO66" _
       ).Select
       Application.CutCopyMode = False
       Selection.ClearContents
End Sub
Vielen Dank und beste Grüße
Green
to top
#2
Hallo!
Du hast doch eine aktuelle Excel-Version.
Wandel sie über Einfügen, Tabelle in ein Listobjekt um, dann werden Formeln und Formate automatisch weitergeführt, wenn Du in eine neue Zeile schreibst.

Gruß Ralf
to top
#3
(07.03.2016, 09:50)RPP63 schrieb: Hallo!
Du hast doch eine aktuelle Excel-Version.
Wandel sie über Einfügen, Tabelle in ein Listobjekt um, dann werden Formeln und Formate automatisch weitergeführt, wenn Du in eine neue Zeile schreibst.

Gruß Ralf

Ich steige nicht ganz dahinter, wie das gemacht werden soll. Wenn ich über Einfügen -> Tabelle wähle und die Tabelle markiere, dann zerstört Excel mein bisheriges Format und jegliche Arbeit ^^... Vielleicht ist mein Blatt auch etwas komplexer aufgebaut.

Dennoch habe ich einen guten Ansatz gefunden.

Code:
Dim lngLastRow As Cell
   Rows("1:36").Select
       Selection.Copy
   
   Range("A65536").End(xlUp).Offset(1, 0).Select
   Selection = lngLastRow
   lngLastRow.Select
       Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
       SkipBlanks:=False, Transpose:=False
       Application.CutCopyMode = False
   
   Range("A1:BO36").Select
       Selection.Copy
   
   lngLastRow.Select
       ActiveSheet.Paste

End Sub
Mit der Range("A65536")... kriege ich immer die letzte Zelle raus. Das funktioniert super!
Nur weiß ich leider nicht, wie ich dieser letzten Zelle eine Variable zuweisen kann.

Wie müsste ich die variable (hier lngLastRow) einbringen, damit die letzte Zeile aus dem Teil mit Range("A65536") klar definiert wird, damit ich auch später damit arbeiten kann?
to top
#4
Hi!
Das mit der "intelligenten" Tabelle klappt bei mir problemlos, aber egal.

Du brauchst keine Variable:

Sub RPP()
Range("1:36").Copy
Range("A1048576").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormats
Application.CutCopyMode = False
End Sub

Beachte die geänderte letzte Zeile (Du hast mehr Zeilen als 65536 zur Verfügung)

Gruß Ralf
to top
#5
Hi!

Super und vielen Dank! Jetzt bin ich schon fast am Ende meiner Problemlösung angekommen. Bleibt nur noch eine Kleinigkeit.

Um die Zellen übertragen zu können muss ich das Blatt aus dem Blattschutz rausnehmen. Daraufhin sollen dann die neu eingefügten Bereiche geleert werden (Das, was nach Range(1xxx) reinkopiert wurde)
Die neu eingefügten Bereiche sind aber nicht mehr selektiert, da zwischendurch der Schutz wieder eingeführt wird.

Der Schutz wird eingeführt, damit nur die zu bearbeitenden Zellen geleert werden und nicht diejenigen, welche ungeändert bleiben sollen (Formeln, Überschriften etc.).

Wie kann ich wieder den Bereich auswählen, denn ich gerade hineinkopiert habe?
Code:
Private Sub CommandButton1_Click()
   '
' SeiteVerlängern Makro
'

'
   Rows("1:36").Select
       Selection.Copy
       
   ActiveSheet.Unprotect
   
   Range("A65536").End(xlUp).Offset(1, 0).Select
       Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
       SkipBlanks:=False, Transpose:=False
       Application.CutCopyMode = False
   
   Range("A1:BO36").Select
       Selection.Copy
   
   Range("A65536").End(xlUp).Offset(1, 0).Select
       ActiveSheet.Paste
       ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
       , AllowFormattingCells:=True
       Selection.ClearContents
   
End Sub

Nicht wundern, ich habe den Code noch nicht abgeändert, so wie du es vorgeschlagen hattest. Kommt noch ^^

Gruß Green
to top
#6
Hi,

(07.03.2016, 10:45)Green schrieb: Die neu eingefügten Bereiche sind aber nicht mehr selektiert, da zwischendurch der Schutz wieder eingeführt wird.

Der Schutz wird eingeführt, damit nur die zu bearbeitenden Zellen geleert werden und nicht diejenigen, welche ungeändert bleiben sollen (Formeln, Überschriften etc.).

Wie kann ich wieder den Bereich auswählen, denn ich gerade hineinkopiert habe?

Dann markiere die Zellen, die gelöscht werden dürfen und lösche sie vor dem Schreibschutz setzen, da werden auch nur diese gelöscht und nicht alles.
Range("B2,D6,F10,H13").ClearContents
Gruß Ralf

?mage

Die deutsche Rechtschreibung ist Freeware, d.h. du kannst sie kostenlos nutzen.
Allerdings ist sie nicht Open Source, deswegen darfst du sie nicht verändern oder in veränderter Form veröffentlichen.
to top
#7
Hi!
Zunächst mal:
.Select ist Rekorder-Code und hat in vernünftigem Code nichts zu suchen.
Lesefutter:
http://www.online-excel.de/excel/singsel_vba.php?f=78

Dies reicht völlig:
(Du solltest aber niemals das ActiveSheet nehmen, sondern auf die korrekte Tabelle referenzieren)

Sub RPP()
With ActiveSheet
   .Unprotect
   .Range("A1:BO36").Copy
   .Range("A1048576").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormats
   .Protect
End With
Application.CutCopyMode = False
End Sub

Gruß Ralf
[-] Folgende(r) 1 Benutzer sagt Danke an RPP63 für diesen Beitrag:
  • Green
to top
#8
(07.03.2016, 11:22)RPP63 schrieb: Hi!
Zunächst mal:
.Select ist Rekorder-Code und hat in vernünftigem Code nichts zu suchen.
Lesefutter:
http://www.online-excel.de/excel/singsel_vba.php?f=78

Dies reicht völlig:
(Du solltest aber niemals das ActiveSheet nehmen, sondern auf die korrekte Tabelle referenzieren)

Sub RPP()
With ActiveSheet
  .Unprotect
  .Range("A1:BO36").Copy
  .Range("A1048576").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormats
  .Protect
End With
Application.CutCopyMode = False
End Sub

Gruß Ralf

Hi!

Vielen Dank für die Tipps! Vielleicht könnt ihr mir noch bei einer Sache etwas weiter helfen. Meine VBA Kenntnisse sind leider grottig, weshalb ich das meiste nur durch ausprobieren lerne ^^...

Ich habe mir gedacht, von der letzten Zeile aus einfach den Bereich -1 und -36 Zeilen darüber auszuwählen. Diesen Bereich möchte ich dann einfach von seinen Contents befreien. Nur hapert es etwas an der Ausführung.

Ich weiß, dass ich die Zeilen mit Rows = ("x:y") anwähle, dabei sind x und y beides variable Werte. Also x = letzteZeile-36 und y = letzteZeile-1. Meine letzte Zeile kriege ich ja wie oben bereits gemacht heraus. Nur wie definiere ich das jetzt als eine Variable, von der ich dann noch etwas subtrahieren kann?

Meine Versuche im Sinne von:

Rows = (Range("A.....").End(xlUp).... - 36:Range("A...").End(xlUP)....-1)

sind leider gescheitert.

Auch folgender Versuch ging daneben, bei dem ich die Variable "Zeile" eingeführt habe.

Zeile = Range("A...").End(xlUP).....
Rows(Zeile-36:Zeile-1).ClearContents

Wo mache ich was falsch? Wie mache ich es richtig?
Ich wünschte ich hätte zumindest einen kleinen Teil VBA Kenntnisse aber mehr als ein bisschen C++ kommt nicht raus.

Gruß Green
to top
#9
Hi!
Ich weiß nicht, warum Du noch Contents entfernen willst.
Mein .PasteSpecial xlPasteFormats fügt doch gar keine Inhalte ein.
Du musst Dir halt einen String mit dem Zeilenbereich basteln:

Sub RPP()
Dim lErsteFreie As Long
With ActiveSheet
   lErsteFreie = .Range("A1048576").End(xlUp).Offset(1, 0).Row
   .Unprotect
   .Range("A1:BO36").Copy
   .Range("A" & lErsteFreie).PasteSpecial xlPasteFormats
   .Range(lErsteFreie & ":" & lErsteFreie + 35).ClearContents
   .Protect
End With
Application.CutCopyMode = False
End Sub


Wie Du siehst, errechne ich den Zeilenbereich etwas anders.

Gruß Ralf
to top
#10
Hi!

Vielen Dank schonmal!

Tut mir leid für die Missverständnisse, ich habe da einige Details vergessen zu erwähnen^^.

Mir war es wichtig das Format der Zellen zu übertragen und dann den Inhalt der Zellen, da dort alle Überschriften natürlich vorhanden sind. Übertrage ich den Inhalt nicht, so erhalte ich nur einen Tabellenaufbau mit leeren Zellen. Dann weiß auch keiner wo was hin soll. Da vielleicht einer erst die Werte eingibt und dann seine Tabelle erweitert, weil die Person es erst zum Schluss merkt, dass noch einige Zeilen fehlen, bräuchte ich eine Lösung, die mir den Inhalt der ersten Tabelle übernimmt, allerdings ohne die Werte.

Und da habe ich schon meine Lösung für das Problem 20 ... Ich übernehme nur die Überschriften :'D...
EDIT: Klappt doch nicht >.< Nicht aneinander angrenzende Zellen will Excel nicht kopieren.

Im Wald des Excels verliert man sich schnell in wirren Programmierungen, zumindest ist es bei mir der Fall haha...

Nochmals vielen Dank und beste Grüße
Green
to top


Gehe zu:


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