VBA: Fortlfd Zellen kopieren + Zahlenblöcke

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: VBA: Fortlfd Zellen kopieren + Zahlenblöcke
von: Chris
Geschrieben am: 15.09.2015 18:10:42

Hallo,
ich mache für die Arbeit gerade eine etwas umfangreichere Excel-Tabelle und habe zur einfacheren Handhabung ein Userform mittel VBA erstellt.
Die Tabelle hat mehrere Spalten in die diverse Informationen über das userform eingetragen werden. Die erste Spalte ist eine laufende Nummer, die zweite Spalte das aktuelle Datum etc. .
Um die Nutzung noch mehr zu vereinfachen habe ich es so programmiert das die lfd. Nummer automatisch erstellt wird, gegebenfalls aber noch manuell abgeändert werden kann. Genauso wird das Datum automatisch generiert.
Schaltflächen sind "Neuer Eintrag", "Speichern", "Löschen" und "Beenden".
Mein Problem:
1) Ich benötige die gleiche lfd. Nummer manchmal zwei oder dreimal (z.B. 3 Zeilen die 23) und dann wieder fortlaufend. Die fortlfd. Nummer wird in das Textfeld und die Zelle geschrieben wenn auf "Neuer Eintrag" geklickt wird. Gibt es hier eine Möglichkeit die letzte generierte Nummer über einen neuen CommandButton bei jeden Click in das nächste Feld zu schreiben, praktisch ein "Blockeintrag"? Es sollte die Nummer gleich in das Textfeld gezogen werden + direkte Ausgabe in der Excel Tabelle.
2) Ich habe eine Spalte in welcher eine Nummer generiert werden soll. Diese Nummer muss nicht in jeder Zeile generiert werden, allerdings immer fortlaufend. Deswegen wollte ich dort auch einen CommandButton nehmen und die Nummer in das Textfeld einfügen lassen. Allerdings hänge ich an dem Problem das die Nummer nicht in jeder Zeile steht, sondern unregelmässig. Gibt es da eine Merkfunktion, oder einen Code welcher die letzte Nummer in der Spalte sucht und diese dann +1 addiert?
3) Eine Spalte hat drei Vorgaben in Textform. Ich würde gerne für jede Vorgabe einen CommandButton machen die alle drei in das selbe Textfeld schreiben.
Ich kann keinen Stand der Liste hochladen, da es wie schon erwähnt eine beruflich bezogene Arbeit ist.

Bild

Betrifft: AW: VBA: Fortlfd Zellen kopieren + Zahlenblöcke
von: fcs
Geschrieben am: 16.09.2015 14:19:33
Hallo Chris,
zu 1) gleiche oder fortlaufende Nr
hier könntest du eine Checkbox (oder 2 Optionsschaltflächen) einbauen mit der du wählst, ob die gleiche Nummer oder die fortlaufende Nummer eingetragen werden soll. Das muss dann im Code der "Neuer Eintrag" schaltfläche in einer If ... Then ... Else ... End If Anweisung verarbeitet werden.
zu 2) letzte Nummer hochzählen.
Auch steuerst du über eine Checkbox, ob die nächste Nummer eingetragen werden soll oder nicht
zu 3) benutze hier eine Listbox mit den 3 Auswahlwerten.
zu 1) und 2) könnte der Code beispielhaft etwa wie folgt aussehen.
Gruß
Franz

Private Const CheckBox1 As Boolean = True 'Testwert für Simulation Checkbox
Private Const CheckBox2 As Boolean = True 'Testwert für Simulation Checkbox
Sub CommandbuttonNeu_Click()
  Dim wks As Worksheet
  Dim Zeile As Long, Zeile2 As Long, Spalte As Long
  Set wks = ActiveSheet
  With wks
  
    Spalte = 1 ' Spalte A = Spalte mit Nr. in jeder Zeile
    Zeile = .Cells(.Rows.Count, Spalte).End(xlUp).Row + 1
    If Zeile = 2 Then
        .Cells(Zeile, Spalte) = 1 'Startnummer
    Else
      If CheckBox1 = True Then
        'Nummer erhöhen
        .Cells(Zeile, Spalte) = Application.WorksheetFunction.Max( _
              .Range(.Cells(2, Spalte), .Cells(Zeile - 1, Spalte))) + 1
      Else
        'Nummer wiederholen
        .Cells(Zeile, Spalte) = .Cells(Zeile - 1, Spalte).Value
      End If
    End If
    
    Spalte = 3 'Spalte C = Spalte in der nächste fortlaufende Nr. eingetragen werden soll
    Zeile2 = .Cells(.Rows.Count, Spalte).End(xlUp).Row + 1 '1 = Spalte mit lfd.Nr. in jeder  _
Zeile
    
    If CheckBox2 = True Then
      'Nummer erhöhen
      If Zeile2 = 4 Then '2 = 1. Zeile unter den Spaltentiteln
        .Cells(Zeile, Spalte) = 1
      Else
        .Cells(Zeile, Spalte).Value = .Cells(.Rows.Count, Spalte).End(xlUp).Value + 1
      End If
    Else
      'keine Nummer eintragen
      .Cells(Zeile, Spalte).ClearContents
    End If
    
  End With
  
End Sub


Bild

Betrifft: AW: VBA: Fortlfd Zellen kopieren + Zahlenblöcke
von: Chris
Geschrieben am: 16.09.2015 15:03:05
Hallo Franz,
Danke für Deinen Beitrag und Deine Code-Empfehlung.
Das mit der lfd. Nummer werde ich nochmal ausprobieren.
Da ich etwas in Zeitdruck war und ich diese komplexe Liste anwendbar auch für nicht Excel-Cracks morgen präsentieren muss, habe ich gestern Abend selber nochmal versucht die Probleme zu lösen. Für 3) habe ich einfach drei CommandButtons genommen und lasse das Text.Caption der Buttons in das Textfeld schreiben und speichern wie gehabt über "Speichern".
Für 2) hatte ich folgenden Code geschrieben:

Private Sub CommandButton8_Click()
Dim Ende As Long
With ActiveSheet
    Ende = Cells(Rows.Count, 5).End(xlUp).Row
    
    UserForm1.TextBox5.Text = Tabelle1.Cells(Ende, 5).Value + 1
Funktionsweise:
Es muss mindestens ein Wert in Spalte 5 geschrieben werden. Ist dies der Fall lasse ich über den Code die Spalte absuchen bis er den letzten Eintrag gefunden hat. Dadurch das dann die Zeile bekannt ist und für diesen Moment "Ende = Zeile letzter Eintrag" ist, lasse ich mit dieser Zuweisung per Tabelle1.Cells(Ende, 5).Value den Wert in dieser Zeile + 1 in die Textbox schreiben und speichern wie gehabt wenn "Speichern" gedrückt wird.
Ich habe jetzt nur ein Problem:
Ich habe diesen Code auf eine nicht als Tabelle formartierte Liste einer ganz frühen Version der heutigen Tabelle angewendet und es funktionierte. Heute wollte ich im Büro diesen Teil in die finale Version übernehmen und er schreibt mir in das Textfeld jedesmal nur eine 1, auch wenn schon z.B. 55 dort eingetragen ist und es dann normal 56 sein müsste. Das Sheet ist jetzt im Vergleich zu vorher als Tabelle formatiert, ich bin mir nicht sicher ob dann im Code nochmal was angepasst werden muss. Die Zellenangaben und Textfeldangaben wurden alle an die richtige Liste angepasst. Bei der Fehlersuche kam heraus:
Wenn ich +1 im Code raus nehme, wird nichts in das Textfeld geschrieben, obwohl zumindest der aktuell letzte Wert der Spalte geschrieben werden müsste, d.h. der Code läuft entweder nicht (obwohl keine Fehlermeldung kommt), oder er findet aus irgendeinen Grund nichts und addiert dann jedesmal nur die 1. Vielleicht eine Idee voran das liegen kann? Wie gesagt in einer nicht als Tabelle formatierten Liste läuft der Code, nach der Formatierung nicht mehr.
Ich bin leider kein VBA-Experte, kenne mich aber mit C++ aus, was das begreifen des Codes beschleunigt, weil viele Sachen verwandt, ähnlich oder gleich sind. Hier komme ich aber nicht drauf was der Fehler sein könnte.
Grüße
Chris

Bild

Betrifft: AW: VBA: Fortlfd Zellen kopieren + Zahlenblöcke
von: fcs
Geschrieben am: 16.09.2015 21:01:28
Hallo Chris,
die als Tabelle formatierten Bereiche verhalten sich wie kleine Inseln im Tabellenblatt.
unter anderem funktioniert
Zeile_L = Cells(Rows.Count, Spalte).End(xlUp).Row
nicht wie gewohnt. Es wird immer die letzte Zeile des Tabellenbereichs als Zeile zurückgegeben, egal ob die Zelle leer ist oder ausgefüllt.
Man muss wenn die Zelle in der letzten Zeile leer ist, die Anweisung nochmals ausführen, um zum Ziel zu kommen.
Gruß
Franz

Private Sub CommandButton8_Click()
    Dim Ende As Long
    With Tabelle1
        Ende = .Cells(.Rows.Count, 5).End(xlUp).Row
        If IsEmpty(.Cells(Ende, 5)) Then
            Ende = .Cells(Ende, 5).End(xlUp).Row
        End If
        If Ende >= .ListObjects(1).DataBodyRange.Row Then
            UserForm1.TextBox5.Value = .Cells(Ende, 5).Value + 1
        Else
            UserForm1.TextBox5.Text = 1
        End If
    End With
    'usw.


 Bild

Beiträge aus den Excel-Beispielen zum Thema "VBA: Fortlfd Zellen kopieren + Zahlenblöcke"