Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema CheckBox
BildScreenshot zu CheckBox CheckBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen

Code in Userform

Betrifft: Code in Userform von: Richi
Geschrieben am: 07.10.2020 20:21:18

Hallo Zusammen
Ich komme mit meinem Code nicht mehr weiter. Der erste Teil (nicht sehr effizient geschrieben..langsam) funktioniert bis zu For i to..
Habe in Userform Namen 1:30 und pro Name Daten Gruppierungen 1:3. Jede Daten Grupierung soll auf Inhalt geprüft und danach in Tabelle auf eine neue Zeile geschrieben werden.
Stehe an:
- Mit der oder Abfrage
- Bin mir nicht sicher ob meine Formel zur Eruierung der Textboxbezeichnungen stimmt um deren Inhalt in Tabelle zu schreiben.

Kann mir da jemand von euch Helfen?

Liebe Gruess
Richi

Private Sub cmd_Erfassen_Click()
  Dim wb As Workbook
  Dim wsH As Worksheet                                               'Hilfsdaten
  Dim wsD As Worksheet                                               'Daten
  Dim i As Integer
  Dim s As Integer
  Dim last As Integer
  
  Set wb = ThisWorkbook
  Set wsH = wb.Worksheets("Hilfsdaten")
  Set wsD = wb.Worksheets("Daten")
  
  last = wsD.Cells(Rows.Count, 1).End(xlUp).Row + 1

    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Zottel"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_1.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_V_5_1.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_V_5_1.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_V_5_1.Value
    wsD.Cells(last, 7).Value = "Vormittag"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.ZottelV.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Zottel"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_1.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_M_5_1.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_M_5_1.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_M_5_1.Value
    wsD.Cells(last, 7).Value = "Mittagessen"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.ZottelM.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Zottel"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_1.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_N_5_1.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_N_5_1.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_N_5_1.Value
    wsD.Cells(last, 7).Value = "Nachmittag"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.ZottelN.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Teddy"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_2.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_V_5_2.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_V_5_2.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_V_5_2.Value
    wsD.Cells(last, 7).Value = "Vormittag"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.TeddyV.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Teddy"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_2.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_M_5_2.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_M_5_2.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_M_5_2.Value
    wsD.Cells(last, 7).Value = "Mittagessen"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.TeddyM.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Teddy"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_2.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_N_5_2.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_N_5_2.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_N_5_2.Value
    wsD.Cells(last, 7).Value = "Nachmittag"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.TeddyN.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Brumm"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_3.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_V_5_3.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_V_5_3.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_V_5_3.Value
    wsD.Cells(last, 7).Value = "Vormittag"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.BrummV.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Brumm"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_3.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_M_5_3.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_M_5_3.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_M_5_3.Value
    wsD.Cells(last, 7).Value = "Mittagessen"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.BrummM.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Brumm"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_3.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_N_5_3.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_N_5_3.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_N_5_3.Value
    wsD.Cells(last, 7).Value = "Nachmittag"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.BrummN.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Wald"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_4.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_V_5_4.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_V_5_4.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_V_5_4.Value
    wsD.Cells(last, 7).Value = "Vormittag"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.WaldV.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Wald"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_4.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_M_5_4.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_M_5_4.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_M_5_4.Value
    wsD.Cells(last, 7).Value = "Mittagessen"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.WaldM.Value
    last = last + 1
    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
    wsD.Cells(last, 2).Value = "Kinder Wald"
    wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_5_4.Value
    wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_N_5_4.Value
    wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_N_5_4.Value
    wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_N_5_4.Value
    wsD.Cells(last, 7).Value = "Nachmittag"
    wsD.Cells(last, 9).Value = Uf_Neuerfassung.WaldN.Value
    If Uf_Neuerfassung.Block_4_1.Value <> "" Then
        last = last + 1
        wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
        wsD.Cells(last, 2).Value = "Schulferien"
        wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_4_1.Value
        wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_4_1.Value
        wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_4_1.Value
        wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_4_1.Value
        wsD.Cells(last, 7).Value = Uf_Neuerfassung.Info_Schule.Value
    End If
    If Uf_Neuerfassung.Block_4_2.Value <> "" Then
        last = last + 1
        wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
        wsD.Cells(last, 2).Value = "Feiertage"
        wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_4_2.Value
        wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_4_2.Value
        wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_4_2.Value
        wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_4_2.Value
        wsD.Cells(last, 7).Value = Uf_Neuerfassung.Info_Feier.Value
    End If
    If Uf_Neuerfassung.Block_4_3.Value <> "" Then
        last = last + 1
        wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
        wsD.Cells(last, 2).Value = "Betriebsferien"
        wsD.Cells(last, 3).Value = Uf_Neuerfassung.Gruppe_4_3.Value
        wsD.Cells(last, 4).Value = Uf_Neuerfassung.Block_4_3.Value
        wsD.Cells(last, 5).Value = Uf_Neuerfassung.Zeit_von_4_3.Value
        wsD.Cells(last, 6).Value = Uf_Neuerfassung.Zeit_bis_4_3.Value
        wsD.Cells(last, 7).Value = Uf_Neuerfassung.Info_4_3.Value
    End If
    
    For i = 1 To 30
        If Me.Controls("Name_" & i).Value <> "" Then
            last = last + 1
            For s = 1 To 3
                If Uf_Neuerfassung.me.Controls("Block_" & i & "_" & s).Value <> "" Or  _
Uf_Neuerfassung.me.Controls("Zeit_von_" & i & "_" & s).Value <> "" Then
                    wsD.Cells(last, 1).Value = Uf_Neuerfassung.Planungstag.Value
                    wsD.Cells(last, 2).Value = Uf_Neuerfassung.me.Controls("Name_" & i).Value
                    wsD.Cells(last, 3).Value = Uf_Neuerfassung.me.Controls("Gruppe_" & i & "_" & _
 s).Value
                    wsD.Cells(last, 4).Value = Uf_Neuerfassung.me.Controls("Block_" & i & "_" &  _
s).Value
                    wsD.Cells(last, 5).Value = Uf_Neuerfassung.me.Controls("Zeit_von_" & i & "_" _
 & s).Value
                    wsD.Cells(last, 6).Value = Uf_Neuerfassung.me.Controls("Zeit_bis_" & i & "_" _
 & s).Value
                    wsD.Cells(last, 7).Value = Uf_Neuerfassung.me.Controls("Info_" & i & "_" &  _
s).Value
                    last = last + 1
                End If
            Next s
        End If
        last = last - 1
    Next i




'Call Sortierung

End Sub

Betrifft: AW: Code in Userform
von: Frank Svoboda
Geschrieben am: 07.10.2020 22:14:16

Hallo Richi,
so ganz verstehe ich das nicht. Ich nehme mal an, dass Uf_Neuerfassung der Name der Userform ist. Warum schreibst Du im ersten, langen Teil des Codes stattdessen nicht einfach Me? Das ist doch das Form-Object. In der for-i-Schleife steht Uf-Neuerassung.me.Controls. Das ist glaube ich nicht richtig (das me ist klein geblieben) und müsste doch eigentlich nur Me.Controls heißen.
Viele Grüße
Frank

Betrifft: AW: Code in Userform
von: Richi
Geschrieben am: 07.10.2020 22:56:35

Hallo Frank

Danke für deinen Input. Habs geändert und nichts ging mehr beim ersten Teil.

For i ...Part habe ich di Uf_Neuerfassung rausgenommen ausser bei Planungstag. Zumindest habe ich jetzt ein paar Daten in Tabelle, jedoch völlig in der falschen Sequenz. Da stimmen die Namensreferenzen nicht.

Betrifft: AW: Code in Userform
von: Hajo_Zi
Geschrieben am: 08.10.2020 05:20:36

frage jemand der neben Dir sitzt der sieht die Datei.
Die meisten hier sehen Sie nicht.
Da Sie nicht auf Deinen Rechner schauen.
Vielleicht sollte die Datei verlinkt werden?

Benutze hier im Forum die Funktion zum hochladen. Falls Du die nicht benutzen möchtest beachte, von unsicheren Servern wie z.B. www.file-upload.net lade ich keine Datei runter. (lt. Einschätzung meines Virenprogramms)

Wenn du an Stelle einer Demomappe deine Originalmappe hochladen willst, diese aber sensible Daten enthält, kannst du diese Daten ändern. Schaue Datei
http://hajo-excel.de/gepackt/fremd/Datei_verschluesseln.zip

Das ist nur meine Meinung zu dem Thema.

GrußformelHomepage

Betrifft: AW: Code in Userform
von: Frank Svoboda
Geschrieben am: 08.10.2020 10:33:09

Hallo Richi,

wie ist denn Dein Formular aufgebaut? Benutzt Du dort »Multiseiten«? Hast Du es schon mit Me.Uf_Neuerfassung probiert?

Viele Grüße
Frank

Betrifft: AW: Code in Userform
von: Frank Svoboda
Geschrieben am: 08.10.2020 11:17:22

Wenn Uf_Neuerfassung der Name Deiner Userform ist, kann eigentlich weder Uf_Neuerfassung.Me noch Me.Uf_Neuerfassung funktionieren, denn das wäre doppelt gemoppelt. Me und Uf_Neuerfassung sind hier ja dasselbe Object. Eigentlich solltest Du dann eine Error-Meldung kriegen.

Mehr fällt mir dazu im Augenblick nicht ein.

Betrifft: AW: Code in Userform
von: Richi
Geschrieben am: 08.10.2020 12:20:05

Hallo Frank & Hajo
Vorweg, Danke für eure Antworten im Vorfeld.
Ich hab ein File zusammengestellt sieht fast gleich aus einfach mit weniger Daten jedoch das Thema ist das Selbe. Der relevante Code ist der Selbe.

Was will ich:
Ist der Name leer soll nichts geschrieben werden (über die ganze Linie, alle 3 Gruppierungen). Das versuche ich mit For i = 1 to 4 zu lösen.
Ist der Name nicht leer muss in Grp und Blk oder Zeit_von ein Eintrag hinterlegt sein. Diese Prüfung versuche ich mit (über jede Gruppierung) For s = 1 to 3 zu bewerkstelligen.
Die Integer von i & s sollen die Referenzen sein um meine Textboxen anzusteuern.

Da steh ich an. Mein Code macht nicht das was ich möchte und ich komm nicht drauf woran es liegt.

Hoffe ich konnte mein Vorhaben klar beschreiben.

Liebe Gruess Richi

https://www.herber.de/bbs/user/140726.xlsm

Betrifft: AW: Code in Userform
von: Frank Svoboda
Geschrieben am: 08.10.2020 16:09:17

Hallo Richi,

Du hast bei den Contros-Namen i und s verwechselt.
So funktioniert's:
For i = 1 To 4
    If Me.Controls("Name_" & i).Value <> "" Then
        last = last + 1
        For s = 1 To 3
            If Me.Controls("Block_" & s & "_" & i).Value <> "" Or _
            Me.Controls("Zeit_von_" & s & "_" & i).Value <> "" Then
                wsD.Cells(last, 1).Value = Me.Controls("Name_" & i).Value
                wsD.Cells(last, 2).Value = Me.Controls("Gruppe_" & s & "_" & i).Value
                wsD.Cells(last, 3).Value = Me.Controls("Block_" & s & "_" & i).Value
                wsD.Cells(last, 4).Value = Me.Controls("Zeit_von_" & s & "_" & i).Value
                wsD.Cells(last, 5).Value = Me.Controls("Zeit_bis_" & s & "_" & i).Value
                last = last + 1
            End If
        Next s
    End If
    last = last - 1
    Next i
End Sub

Viele Grüße
Frank

Betrifft: AW: Code in Userform
von: Frank Svoboda
Geschrieben am: 08.10.2020 17:17:29

So ist es vielleicht noch ein bisschen »eleganter«
Private Sub cmb_erfassen_Click()
    Dim wsD As Worksheet: Set wsD = ThisWorkbook.Worksheets("Tabelle1")
    Dim last As Integer: last = wsD.Cells(Rows.Count, 1).End(xlUp).Row + 1
    Dim i As Integer, s As Integer
    Dim b As Variant: b = Array("Name_", "Gruppe_", "Block_", "Zeit_von_", "Zeit_bis_")
    Dim c As Long, n As String
    With Me.Controls
        For i = 1 To 4
            If .Item("Name_" & i).Value <> "" Then
                last = last + 1
                For s = 1 To 3
                    If .Item("Block_" & s & "_" & i).Value <> "" _
                    Or .Item("Zeit_von_" & s & "_" & i).Value <> "" Then
                        For c = 0 To 4
                            If c = 0 Then n = b(0) & i Else n = b(c) & s & "_" & i
                            wsD.Cells(last, c + 1).Value = .Item(n)
                        Next c
                        last = last + 1
                    End If
                Next s
            End If
            last = last - 1
        Next i
    End With
End Sub


Betrifft: AW: Code in Userform
von: Richi
Geschrieben am: 08.10.2020 19:16:28

Hallo Frank
Hab deinen Code übernommen noch zum bestehenden File Zeilen und Spalten Intervalle angepass und das Programm läuft. Herzlichen Dank dafür.
Etwas hab ich dennoch festgestellt. Zeit von / bis gebe ich in den andern Felder numerisch heraus und mit neuem Code erfolgt die Ausgabe als Text. Hat sicher was mit der m Array Definition zu tun. Kann ich da was Anpassen?

Liebe Gruess Richi

Code sieht jetzt bei mir so aus:



With Me.Controls
For i = 1 To 30 'Zähler Anzahl Eingabezeilen
If .Item("Name_" & i).Value <> "" Then 'Wenn im Feld Name etwas steht
last = last + 1
For s = 1 To 3 'Zähler Anzahl Gruppierungsblöcke
If .Item("Block_" & s & "_" & i).Value <> "" _
Or .Item("Zeit_von_" & s & "_" & i).Value <> "" Then 'Wenn im Feld Bock oder Zeit_von steht
For c = 0 To 5 'Zähler Positionierung Spalteneinträge
If c = 0 Then n = b(0) & i Else n = b(c) & s & "_" & i
wsD.Cells(last, 1).Value = .Item("Planungstag").Value
wsD.Cells(last, c + 2).Value = .Item(n)
Next c
last = last + 1 'Spaltenerhöhung um 1
End If
Next s
End If
last = last - 1 'Letzte Spaltenerhöhung rückgängig zu machen
Next i
End With

Betrifft: AW: Code in Userform
von: Frank Svoboda
Geschrieben am: 08.10.2020 20:18:00

Also...

1.
In der mir vorliegenden Beispiel-Datei gibt's in der UserForm kein Feld Planungstag und ich erhalte dementsprechend eine Fehlermeldung.

2.
For c = 0 to 5 ist nicht nur der Zähler zur Positionierung der Spalteneinträge in der Tabelle (Spalte 1 bis 5), sondern gleichzeitig auch der Index für das Array b (0 bis 4). Weil bei den Spalten bei 1 begonnen wird und bei den Indizes bei 0 und die Schleife ebenfalls mit 0 beginnt, muss bei der Zuweisung
wsD.Cells(last, c + 1).Value = .Item(n) immer 1 dazugezählt werden. Was ist Planungstag denn eigentlich, wo kommt es her und wo soll es in Deiner Tabelle auftauchen? Und wie sieht jetzt das b = Array(…) aus?

3.
Das löst jetzt allerdings noch nicht Dein Proplem bei der Zahl/Text-Formatierung. Vielleicht liegt es daran, dass es eigentlich wsD.Cells(last, c + 1).Value = .Item(n).Value heißen muss. Ich hatte das übersehen.

Betrifft: AW: Code in Userform
von: Richi
Geschrieben am: 08.10.2020 20:35:39

Jetzt kann ich endlich die Original-Datei hochladen.
Das Planungsdatum ist die Basis für alle Einträge in der Tabelle. Die ziehe ich für jeden Eintrag vom gleichen Ort.

Final wenn die ganze Dateneingabe einwandfrei läuft werde ich die Daten über einen Planungsspiegel wie MS Projekt darstellen. Dieses Programm besteht bereits.

Ich Danke dir sehr für deine Hilfe. Dieses Userform ist das erste das ich mache. Habe in vielen Youtub Filmen und mit Nachfrage die ganzen Codes zusammengestellt. Ich hoffe du kriegst nicht gleich einen Schlaganfall :-). Besser kann ich es leider noch nicht......

https://www.herber.de/bbs/user/140742.xlsm

Betrifft: AW: Code in Userform
von: Frank Svoboda
Geschrieben am: 09.10.2020 02:12:26

Hallo Richi,

habe mir noch Deine Original-Datei angeschaut. Ist ja recht umfangreich. Ich konzentriere mich jetzt nur auf den besagten Teil für die Übertragung der Daten von der Form in die Tabelle Daten. Da die Tabellenspalten unterschiedliche Formate haben, bringt die for c Schleife von meinem Vorschlag hier nichts. Deshalb habe ich sie sowie das Array b wieder rausgeschmissen und wieder wie in Deiner alten Version die Spalten einzeln behandelt. Den Planungstag verwandle ich ins Date-Format. Die Tabellenspalten Zeit_Von und Zeit_Bis sind bisher Standard formatiert. Das würde ich ins Datum/Zeit-Format h:mm ändern. Damit aus Deinen »Zeitzahlen« aus der Form Excel-Zeit-Werte in der Tabelle werden, habe ich eine Hilfs-Function ZzzD eingesetzt.
 
    
    Dim si As String
    With Me.Controls
        For i = 1 To 30
            If .Item("Name_" & i).Value <> "" Then
                last = last + 1
                For s = 1 To 3
                    si = s & "_" & i ' damit sieht's folgend übersichtlicher aus
                    If .Item("Block_" & si).Value <> "" _
                    Or .Item("Zeit_von_" & si).Value <> "" Then
                        
                        wsD.Cells(last, 1).Value = CDate(.Item("Planungstag").Value)
                        wsD.Cells(last, 2).Value = .Item("Name_" & i).Value
                        wsD.Cells(last, 3).Value = .Item("Gruppe_" & si).Value
                        wsD.Cells(last, 4).Value = .Item("Block_" & si).Value
                        wsD.Cells(last, 5).Value = ZzzD(.Item("Zeit_von_" & si).Value)
                        wsD.Cells(last, 6).Value = ZzzD(.Item("Zeit_bis_" & si).Value)
                        wsD.Cells(last, 7).Value = .Item("Info_" & si).Value
                        
                        last = last + 1
                    End If
                Next s
            End If
            last = last - 1
        Next i
    End With

    Sortierung

End Sub

' Hilfs-Funktion Zeitzahl-zu-Date
' Wandelt eine »Zeitzahl« wie 700 in das Date-Format um.
' Wenn die Zielzelle das Zahlenformat h:mm hat, wird dort
' dann z.B. 7:00 angezeigt. Wenn die Zahl ungültig ist,
' wird Empty zurückgegeben, d.h. die Zelle wird leer.
Public Function ZzzD(ByVal z As Variant) As Variant
    If IsNumeric(z) Then
        z = CLng(z)
        If z >= 0 And z < 2400 And (z \ 10) Mod 10 <= 5 Then
            ZzzD = CDate((z \ 100) / 24 + (z Mod 100) / 1440)
        End If
    End If
End Function

Ausprobiert habe ich das ganze nicht – außer ZzzD. Die .Value bei .Cells(…) und .Item(…) kann man glaub ich noch weglassen, weil das die Default-Properties von Cells und Control.Item sind.

Obwohl ich das ganze recht interessant finde, kann ich mich auch nicht viel mehr reinknien, weil mir dazu einfach die Zeit fehlt.

Du hast Dir da eine ganze Menge vorgenommen. Ich habe mal Wartungspläne für eine Firma entworfen – eine recht ähnliche Aufgabe, auch vom Umfang her. Zuerst wollte ich auch Userforms dafür einsetzen, bin aber wieder davon abgekommen, weil es programmtechnisch viel komfortabler ist, stattdessen ein Tabellenblatt zu benutzen. Und es geht auch schneller, es zu entwerfen (und der Kunde freut sich). Dort kannst Du Zell-Funktionen einsetzen, ohne großen Aufwand Sachen verschieben und Neues einfügen. Ist einfach viel pflegeleichter. Man muss zwar sein Spalten-Raster gut planen, aber mit Zellen verbinden, Zellen schützen und geschicktem grafischen Layout kann man aus einem Arbeitsblatt eine Eingabeseite machen, die einer Userform nur wenig, wenn überhaupt, nachsteht. Über die »Datenüberprüfung« (Dropdown-Icon im Excel Menü [Daten] > [Datentools]) kann man sogar DropDown-Vorschlags-Felder einfügen. Mit Worksheet_Change und Worksheet_SelectionChange Events hat man außerdem eine sofortige Kontrolle über das, was der User macht.

Ich wünsche Dir jedenfalls viel Erfolg. Ich bin leider nur ab und zu hier, werde Dein Projekt aber gern im Auge behalten.

Viele Grüße
Frank

Betrifft: AW: Code in Userform
von: Frank Svoboda
Geschrieben am: 08.10.2020 10:41:49

Sind .Cells(last, c) vielleicht Mitglieder verbundener Zellen? Dann müsste es .Cells(last, c).MergeArea.Cells(1) heißen.
Wie äußert sich der Fehler denn genau, was passiert?

Betrifft: AW: Code in Userform
von: Frank Svoboda
Geschrieben am: 08.10.2020 10:55:00

In der äußeren Schleife läuft i von 1 bis 30. In der inneren Schleife referenzierst Du dann Controls beispielsweise mit Block_22_2. Gibts diese Controls überhaupt? Im ersten Teil sehe ich die nicht.