Registriert seit: 23.10.2015
Version(en): 2010
Hallo zusammen,
ich versuche grade ein wenig mit VBA zu basteln (ich benutze Excel 2010) und bin da noch sehr neu. Ich habe bisher eine Userform mit einigen Textboxen (TB) und Comboboxen (CB) erstellt. Wenn ich etwas in die TB schreibe bzw in der CB auswähle und über einem Button "Speichern" bestätige, wird das automatisch ein meine Tabelle eingetragen. Gebe ich etwas erneut ein und speichere es, wird es in die nächste Zeile eingetragen. So weit so gut.
Nun zu meinem Problem:
Jedes mal, wenn ich auf Speichern drücke, soll eine neue Zeile mit der selben Formatierung (sprich Tabellen-Linien etc sollen übernommen werden) eingefügt werden. Das bedeutet meine Tabelle besteht sozusagen aus 2 Zeilen: In der 1. Zeile die "Überschriften" und in der zweiten Zeile die dazugehörigen Werte. Drücke in dann auf speichern besteht meine Tabelle aus 3 Zeilen (1. Zeile: Überschrift; 2+3 Zeile: Werte). Ist das möglich und wenn wie?
Ich bedanke mich schon mal recht herzlich für eure Hilfen!!
Grüße Jan
Registriert seit: 10.04.2014
Version(en): 2016 + 365
Hi Jan,
(02.11.2015, 11:20)Jan-Lan95 schrieb: Das bedeutet meine Tabelle besteht sozusagen aus 2 Zeilen: In der 1. Zeile die "Überschriften" und in der zweiten Zeile die dazugehörigen Werte. Drücke in dann auf speichern besteht meine Tabelle aus 3 Zeilen (1. Zeile: Überschrift; 2+3 Zeile: Werte). Ist das möglich und wenn wie?
Du kannst das Format der Zeile 2 dann auf die Zeile 3 kopieren/übertragen mit dem Formatpinsel.
Wenn Du das Vorgehen dazu aufzeichnest, hast Du ein kleines Makro und kannst den relevanten Schnipsel in Dein vorhandenes Makro ans Ende einfügen.
Also
- Makro-Aufzeichnung starten
- Zeile 2 markieren
- Formatpinsel anklicken
- Zeile 3 markieren und damit das Format übertragen
- Makro-Aufzeichnung beenden
Mit ALT-F11 den VBA-Editor aufrufen, dann den relevanten Teil aus dem aufgezeichneten Makro in Dein bestehendes einfügen und verallgemeinern, daß es immer auf die neue Zeile angewendet wird.
Du kannst das aufgezeichnete Makro auch hier vorstellen, dann können wir helfen, es zu entschlacken und zu verallgemeinern.
Registriert seit: 23.10.2015
Version(en): 2010
02.11.2015, 11:49
Danke erstmal für die schnelle Antwort. Das war meine erste Frage und bin positiv überrascht, dass das so schnell geht
Hier meine Makro:
Sub Zeile_automatisch_Einfügen()
'
' Zeile_automatisch_Einfügen Makro
'
'
Range("A3:N3").Select
Selection.Copy
Range("A4").Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
Gruß
Jan
Registriert seit: 10.04.2014
Version(en): 2016 + 365
02.11.2015, 12:01
(Dieser Beitrag wurde zuletzt bearbeitet: 02.11.2015, 12:10 von Rabe.)
Hi,
(02.11.2015, 11:49)Jan-Lan95 schrieb: Danke erstmal für die schnelle Antwort. Das war meine erste Frage und bin positiv überrascht, dass das so schnell geht
Hier meine Makro:
naja, wenn jemand grad Zeit hat und online ist, dann geht das schon schnell.
Versuche es mal so:
Code: Sub Zeile_automatisch_Einfügen()
'
' Zeile_automatisch_Einfügen Makro
'
Dim loLetzteA As Long
'
loLetzteA = IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count) 'letzte belegte Zeile in Spalte A (1)
Range("A3:N3").Copy
Range("A" & loLetzteA).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
Wie Du siehst, habe ich die Selects entfernt und das Formatieren auf die letzte Zeile verallgemeinert. Das Makro fügt aber noch nichts in diese Zeile ein oder?
Registriert seit: 10.04.2014
Version(en): 2016 + 365
02.11.2015, 12:06
(Dieser Beitrag wurde zuletzt bearbeitet: 02.11.2015, 12:07 von Rabe.)
Hi,
(02.11.2015, 12:01)Rabe schrieb: Wie Du siehst, habe ich die Selects entfernt und das Formatieren auf die letzte Zeile verallgemeinert. Das Makro fügt aber noch nichts in diese Zeile ein oder?
Darum sollte das Makro besser so heißen:
Code: Sub Zeile_automatisch_formatieren()
'
' Zeile_automatisch_formatieren Makro
'
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
Hi!
Nur ergänzend:
Wenn Du Deine Tabelle als "intelligente" Tabelle formatierst (Einfügen, Tabelle), dann kannst Du Dir die "Pinselei" sparen.
Dies erkennt Excel dann selbständig.
Selbst Formeln werden automatisch weitergeführt und angepasst.
Just my two cents,
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: 23.10.2015
Version(en): 2010
Hallo Ralf
wenn ich das richtig verstanden habe ist das eine möglichkeit mein Problem zu lösen ohne das ich codes schreiben muss?
Und Rabe:
Vielen Dank schonmal für den code. Habe ihn eingefügt und er macht im Prinzip das was ich wollte. Einen kleinen Fehler gibt es allerdings noch:
Wenn ich auf meinen Button "Speichern" klicke, kopiert er die Formatierung aus Zeile 3 in die Zeile 4 und fügt den Text in Zeile 4 ein. Er soll den Text aber erst in Zeile 3 einfügen und dann NUR die Formatierung (sprich ohne Text) kopieren und in Zeile 4 einsetzen. Ist das dann ein fehler der Reihenfolge was er wann zuerst macht?
Hier mal den Code was ich dies bzgl. gemacht habe:
Code: Private Sub CommandButton1_Click()
Dim ZeileMax As Long
Dim Zeile As Long
With Tabelle1
ZeileMax = .UsedRange.Rows.Count
Zeile = ZeileMax + 1
.Range("A" & Zeile).Value = Me.TextBox1.Value
.Range("B" & Zeile).Value = Me.TextBox2.Value
.Range("C" & Zeile).Value = Me.TextBox3.Value
.Range("D" & Zeile).Value = Me.ComboBox3.Valu
.Range("E" & Zeile).Value = Me.TextBox4.Value
.Range("F" & Zeile).Value = Me.TextBox5.Value
.Range("H" & Zeile).Value = Me.ComboBox2.Value
.Range("I" & Zeile).Value = Me.ComboBox1.Value
End With
Dim loLetzteA As Long
'
loLetzteA = IIf(IsEmpty(Cells(Rows.Count, 1)), Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count) 'letzte belegte Zeile in Spalte A (1)
Range("A2:N2").Copy
Range("A" & loLetzteA).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
End Sub
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
Hi Jan!
Zitat: ohne das ich codes schreiben muss?
Nö, das nun nicht. :21:
Schließlich müssen ja die Werte des UserForm an die Tabelle übergeben werden.
Du sparst Dir "lediglich Formatierungen und Formelweiterführungen.
Außerdem erleichterst Du das evtl. Löschen von Zeilen.
By the way:
Nutze niemals dies: .UsedRange.Rows.Count
Der UsedRange arbeitet sehr unzuverlässig!
Nutze zum Feststellen der ersten freien Zeile die Variante, die Dir mein Namensvetter genannt hat.
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: 10.04.2014
Version(en): 2016 + 365
02.11.2015, 13:27
(Dieser Beitrag wurde zuletzt bearbeitet: 02.11.2015, 14:04 von Rabe.)
Hi Jan,
(02.11.2015, 13:06)Jan-Lan95 schrieb: wenn ich das richtig verstanden habe ist das eine möglichkeit mein Problem zu lösen ohne das ich codes schreiben muss?
[...]
Vielen Dank schonmal für den code.
Einen kleinen Fehler gibt es allerdings noch:
Naja, programmieren mußt Du schon noch, aber Du kannst Dir mit dieser Methode das grundsätzliche Gerüst für ein Makro erstellen, das angepasst und erweitert werden kann/muß. Das mache ich immer für Aufgaben, für die mir der Code nicht mehr einfällt.
Von Deinem Code her müßte er zuerst einfügen und dann formatieren. Code wird immer von oben nach unten abgearbeitet, es sei denn Du hast Sprungmarken drin, aber das ist schlechter Programmier-Stil.
loLetzteA benötigst Du eigentlich gar nicht, Du hast ja schon die letzte Zeile in der Variablen "Zeile":
Code: Option Explicit
Private Sub CommandButton1_Click()
Dim ZeileMax As Long
Dim Zeile As Long
With Tabelle1
ZeileMax = IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count) 'letzte belegte Zeile in Spalte A (1)
Zeile = ZeileMax + 1
.Range("A" & Zeile).Value = Me.TextBox1.Value
.Range("B" & Zeile).Value = Me.TextBox2.Value
.Range("C" & Zeile).Value = Me.TextBox3.Value
.Range("D" & Zeile).Value = Me.ComboBox3.Value
.Range("E" & Zeile).Value = Me.TextBox4.Value
.Range("F" & Zeile).Value = Me.TextBox5.Value
.Range("H" & Zeile).Value = Me.ComboBox2.Value
.Range("I" & Zeile).Value = Me.ComboBox1.Value
.Range("A2:N2").Copy
.Range("A" & Zeile).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
End With
End Sub
Registriert seit: 23.10.2015
Version(en): 2010
Vielen Dank an beide Ralfs ;)
Ihr habt mir sehr geholfen!
Wenn ich jetzt z.B. noch zusätzlich meine Formeln kopieren möchte, muss ich dann nur den Befehl:
Code: .Range("A" & Zeile).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
xlPasteFormats ändern oder muss man dann noch zusätlich was schreiben?
(Sorry wenn meine gewählten Begriffe nicht der Excelsprache entsprechen)
Gruß
Jan
|