Registriert seit: 03.03.2016
Version(en): 2013
07.03.2016, 10:17
(Dieser Beitrag wurde zuletzt bearbeitet: 07.03.2016, 10:17 von Green.)
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
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
07.03.2016, 10:50
(Dieser Beitrag wurde zuletzt bearbeitet: 07.03.2016, 10:50 von RPP63.)
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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 03.03.2016
Version(en): 2013
(07.03.2016, 10: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?
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
07.03.2016, 11:18
(Dieser Beitrag wurde zuletzt bearbeitet: 07.03.2016, 11:18 von RPP63.)
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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 03.03.2016
Version(en): 2013
07.03.2016, 11:45
(Dieser Beitrag wurde zuletzt bearbeitet: 07.03.2016, 11:45 von Green.)
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
Registriert seit: 10.04.2014
Version(en): 2016 + 365
07.03.2016, 12:21
(Dieser Beitrag wurde zuletzt bearbeitet: 07.03.2016, 12:23 von Rabe.)
Hi, (07.03.2016, 11: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
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
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=78Dies 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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:1 Nutzer sagt Danke an RPP63 für diesen Beitrag 28
• Green
Registriert seit: 03.03.2016
Version(en): 2013
07.03.2016, 16:40
(Dieser Beitrag wurde zuletzt bearbeitet: 07.03.2016, 16:49 von Green.)
(07.03.2016, 12: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
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 03.03.2016
Version(en): 2013
08.03.2016, 09:01
(Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2016, 09:01 von Green.)
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
|