Ausführliches Userform Formular
#1
Hallo zusammen, 

ich habe folgendes Userform erstellt und probiert mit einem schon vorhandenen Code anzupassen. 


Der Code bezieht sich nun erst einmal auf die obere Hälfte also noch nicht auf die Register.
Hierbei habe ich leider den Fehler bei den Funktionen  Me.Controls("TextBox" & i) 
Leider habe ich hierzu nicht das wissen wie ich den Fehler lösen kann. Daher benötige ich eure Hilfe.
Weiterhin würde ich gerne quasi genau denselben Code verwenden für die Register. Dabei wird es für mich die Schwierigkeit sein, dass jeder Register ein neues Tabellenblatt bekommt (okay lösbar) aber weiter, dass nur die Einträge z.B. von dem ersten Projekt oben die dazugehörigen Einträge darunter anzeigt. Also nicht alle die in z.B. Tabellenblatt2 eingetragen werden. Wie kann man dieses Problem lösen?


Code:
Option Explicit
Option Compare Text

' ************************************************************************************************
' KONSTANTEN / PARAMETRISIERUNG
' ************************************************************************************************

'Wie viele TextBoxen sind auf der UserForm platziert?
Private Const iCONST_ANZAHL_EINGABEFELDER As Integer = 6

'In welcher Zeile starten die Eingaben?
Private Const lCONST_STARTZEILENNUMMER_DER_TABELLE As Long = 2


' ************************************************************************************************
' EREIGNISROUTINEN DER USERFORM
' ************************************************************************************************

'Neuer Eintrag Schaltfläche Ereignisroutine
Private Sub CommandNeuerEintrag_Click()
    Call EINTRAG_ANLEGEN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub

'Löschen Schaltfläche Ereignisroutine
Private Sub CommandLoeschen_Click()
    Call EINTRAG_LOESCHEN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub

'Speichern Schaltfläche Ereignisroutine
Private Sub CommandSpeichern_Click()
    Call EINTRAG_SPEICHERN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub

'Beenden Schaltfläche Ereignisroutine
Private Sub CommandBeenden_Click()
    Unload Me
End Sub

'Klick auf die ListBox Ereignisroutine
Private Sub ListProjekt_Click()
    Call EINTRAG_LADEN_UND_ANZEIGEN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub

'Diese Ereignisroutine wird beim Anzeigen der UserForm ausgeführt
Private Sub UserForm_Activate()
    If ListProjekt.ListCount > 0 Then ListProjekt.ListIndex = 0 '1. Eintrag selektieren
End Sub

'Startroutine, wird ausgeführt bevor die Eingabemaske angezeigt wird
Private Sub UserForm_Initialize()
    Call LISTE_LADEN_UND_INITIALISIEREN 'Aufruf der entsprechenden Verarbeitungsroutine
End Sub


' ************************************************************************************************
' VERARBEITUNGSROUTINEN
' ************************************************************************************************

'Diese Routine wird aufgerufen um die Liste (ListBox1) zu leeren, einzustellen und neu zu füllen
Private Sub LISTE_LADEN_UND_INITIALISIEREN()
  Dim lZeile As Long
  Dim lZeileMaximum As Long
  Dim i As Integer
 
    'Alle TextBoxen leer machen
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
        Me.Controls("TextBox" & i) = ""
    Next i

    ListProjekt.Clear 'Liste leeren
   
    '4 Spalten einrichten
    'Spalte 1: Zeilennummer des Datensatzes
    'Spalte 2: Name (Spalte A)
    'Spalte 3: Telefon (Spalte B)
    'Spalte 4: E-Mail (Spalte C)
    ListProjekt.ColumnCount = 4
   
    'Spaltenbreiten der Liste anpassen (0=ausblenden, nichts=automatisch)
    '"<Breite Spalte 1>;<Breite Spalte 2>;<Breite Spalte 3>;<Breite Spalte 4>"
    ListProjekt.ColumnWidths = "0;;;"
    'Feste Breiten: ListBox1.ColumnWidths = "0;100;100;100"
   
    'Um eine Schleife für alle Datensätze zu erhalten benötigen wir die letzte verwendete Zeile
    lZeileMaximum = Tabelle1.UsedRange.Rows.Count 'Benutzer Bereich auslesen
   
    For lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE To lZeileMaximum
       
        'Nur wenn die Zeile benutzt / nicht leer ist, zeigen wir etwas an:
        If IST_ZEILE_LEER(lZeile) = False Then
           
            'Spalte 1 der Liste mit der Zeilennummer füllen
            ListProjekt.AddItem lZeile
           
            'Spalten 2 bis 4 der Liste füllen
            ListProjekt.List(ListProjekt.ListCount - 1, 1) = CStr(Tabelle1.Cells(lZeile, 1).Text)
            ListProjekt.List(ListProjekt.ListCount - 1, 2) = CStr(Tabelle1.Cells(lZeile, 2).Text)
            ListProjekt.List(ListProjekt.ListCount - 1, 3) = CStr(Tabelle1.Cells(lZeile, 3).Text)
       
        End If
       
    Next lZeile
   
End Sub

Private Sub EINTRAG_LADEN_UND_ANZEIGEN()
  Dim lZeile As Long
  Dim i As Integer
   
    'Eingabefelder resetten
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
        Me.Controls("TextBox" & i) = ""
    Next i
   
    'Nur wenn ein Eintrag selektiert/markiert ist
    If ListProjekt.ListIndex >= 0 Then
          
        'Die Zeilennummer des Datensatzes steht in der ersten ausgeblendeten Spalte der Liste,
        'somit können wir direkt zugreifen.
        lZeile = ListProjekt.List(ListProjekt.ListIndex, 0)
       
        For i = 1 To iCONST_ANZAHL_EINGABEFELDER
            Me.Controls("TextBox" & i) = CStr(Tabelle1.Cells(lZeile, i).Text)
        Next i
           
    End If
   
End Sub

Private Sub EINTRAG_SPEICHERN()
Dim lZeile As Long
Dim i As Integer

    'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
    If ListProjekt.ListIndex = -1 Then Exit Sub
  
    'Zum Speichern benötigen wir die Zeilennummer des ausgewählten Datensatzes
    lZeile = ListProjekt.List(ListProjekt.ListIndex, 0)
   
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
        Tabelle1.Cells(lZeile, i) = Me.Controls("TextBox" & i)
    Next i
   
    'Der Benutzer könnte die angezeigten Werte in der Liste geändert haben,
    'daher aktualisieren wir den ausgewählten Eintrag entsprechend.
    ListProjekt.List(ListProjekt.ListIndex, 1) = TextProjekt
    ListProjekt.List(ListProjekt.ListIndex, 2) = TextAuftragswert
    ListProjekt.List(ListProjekt.ListIndex, 3) = TextNachtrag
   
End Sub

Private Sub EINTRAG_LOESCHEN()
Dim lZeile As Long
 
    'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
    If ListProjekt.ListIndex = -1 Then Exit Sub
 
    'Beim Löschen fragen wir zuerst den Benutzer noch einmal sicherheitshalber:
    If MsgBox("Sie möchten den markierten Datensatz wirklich löschen?", _
              vbQuestion + vbYesNo, "Sicherheitsabfrage!") = vbYes Then
 
        'Nur wenn er mit <JA> antwortet, löschen wir auch!
 
        'Zum Löschen benötigen wir die Zeilennummer des ausgewählten Datensatzes
        lZeile = ListProjekt.List(ListProjekt.ListIndex, 0)
       
        'Die ganze Zeile wird nun gelöscht
        Tabelle1.Rows(CStr(lZeile & ":" & lZeile)).Delete
       
        'Und den Eintrag in der Liste müssen wir auch noch entfernen
        ListProjekt.RemoveItem ListProjekt.ListIndex
   
    End If
   
End Sub

Private Sub EINTRAG_ANLEGEN()
Dim lZeile As Long
   
    lZeile = lCONST_STARTZEILENNUMMER_DER_TABELLE
    'Schleife bis eine leere ungebrauchte Zeile gefunden wird
    Do While IST_ZEILE_LEER(lZeile) = False
        lZeile = lZeile + 1 'Nächste Zeile bearbeiten
    Loop
   
    'Nach Durchlauf dieser Schleife steht lZeile in der ersten leeren Zeile von Tabelle1
    Tabelle1.Cells(lZeile, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
   
    'Und neuen Eintrag in die UserForm eintragen
    ListProjekt.AddItem lZeile
    ListProjekt.List(ListProjekt.ListCount - 1, 1) = CStr("Neuer Eintrag Zeile " & lZeile)
    ListProjekt.List(ListProjekt.ListCount - 1, 2) = ""
    ListProjekt.List(ListProjekt.ListCount - 1, 3) = ""
   
    'Den neuen Eintrag markieren mit Hilfe des ListIndex
    ListProjekt.ListIndex = ListProjekt.ListCount - 1
    'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen
   
    'Und dem Benutzer direkt noch den Cursor in das erste Eingabefeld stellen und alles vorselektieren,
    'so kann der Benutzer direkt loslegen mit der Dateneingabe.
    TextProjekt.SetFocus
    TextProjekt.SelStart = 0
    TextProjekt.SelLength = Len(TextProjekt)
   
End Sub


' ************************************************************************************************
' HILFSFUNKTIONEN
' ************************************************************************************************

'Ermittelt, ob eine Zeile in Benutzung ist...
Private Function IST_ZEILE_LEER(ByVal lZeile As Long) As Boolean
  Dim i As Long
  Dim sTemp As String
 
    'Hilfsvariable initialisieren
    sTemp = ""
   
    'Um zu erkennen, ob eine Zeile komplett leer/ungebraucht ist
    'verketten wir einfach alle Spalteninhalte der Zeile miteinander.
    'Ist die zusammengesetzte Zeichenkette aller Spalten leer,
    'ist die Zeile nicht genutzt...
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
        sTemp = sTemp & Trim(CStr(Tabelle1.Cells(lZeile, i).Text))
    Next i
   
    'Rückgabewert festlegen
    If Trim(sTemp) = "" Then
        'Die Zeile ist leer
        IST_ZEILE_LEER = True
    Else
        'Die Zeile ist mindestens in einer Spalte gefüllt
        IST_ZEILE_LEER = False
    End If
   
End Function
Top
#2
Hi


Zitat:Hierbei habe ich leider den Fehler bei den Funktionen  Me.Controls("TextBox" & i) 
Leider ist der Fehler für mich nur aus dem Code nicht ersichtlich. Fehlermöglichkeiten gibt es auch außerhalb des Codes.


Eine Fehlercode oder Fehlermeldung hilft entl. schon ein wenig.
Besser wäre eine Bsp.Datei.

Gruß Elex
Top
#3
Sorry die Datei wurde scheinbar nicht anbei hochgeladen.


Angehängte Dateien
.xlsm   VBA.xlsm (Größe: 28,97 KB / Downloads: 5)
Top
#4
Hi

Code:
    For i = 1 To iCONST_ANZAHL_EINGABEFELDER
        Me.Controls("TextBox" & i) = ""
    Next i

also entweder ich sehe sie nur nicht oder du hast keine Textboxen mit den Namen.
Textbox1
Textbox2
usw...

Gruß Elex
Top
#5
Hi

Danke das war ein unbeachteter doofer Fehler. 
Hast du vielleicht auch eine Lösung für mein zweites Problem?
Top
#6
Hi

Dazu ist die Bsp.Datei welche ja nur die UserForm enthält für mich zu wenig, um mich (zeitnah) in Dein Vorhaben zu denken.

Evtl. ein anderer oder du machst noch mal eine Datei mit Beispieldaten und Wunschergebnis.

Gruß Elex
Top
#7
Hi,

also ich habe nochmal deine Problemlösung zum ersten Teil geändert.
Nun probiere ich nochmal grob mein zweites Problem zu strukturieren. 
Es geht darum, dass ich nun die Register meiner Userform in die anderen Tabellenblätter speichern möchte. Das heißt ja grob genommen ich kopiere den vorherigen Code und passen ihn für die jeweiligen Register an, sodass die ListBox, TextBox, ComboBox alle passen und mir die Daten in das dazugehörige Tabellenblatt gespeichert wird. 
Soweit so gut. Nun mein Hauptproblem daran ist, dass ich nun unten Einträge mache, die zu dem obigen Projekt gehören, welches gerade ausgewählt ist. Und dass mir dann unten auch nur solche dazugehörigen Einträge angezeigt werden, wenn ich ein Projekt oben auswähle. 
Ich habe die Tabelle nochmal soweit angepasst, wie ich die Daten einfügen würde in die Tabellenblätter. Nun fehlt mir nur noch der passende Code dazu. 

Vielleicht reicht das ja um mir dabei auszuhelfen.


Angehängte Dateien
.xlsm   ProjektübersichtVBA.xlsm (Größe: 36,82 KB / Downloads: 12)
Top
#8
Hallo

Habe mir dein Projekt noch mal angesehen. Aus Erfahrung mit eins/zwei Antworten eher nicht erledigt.

Für mich momentan dann leider zu zeitaufwendig.

Gruß Elex
Top
#9
schau dir mal beiträge zu abhängigen Listboxen an. 
z.b.
https://www.herber.de/forum/archiv/1036t...boxen.html
Top
#10
Erstmal vielen Dank bis hierhin.

Ich verzweifel gerade noch die verschiedenen Tabs zu programmieren dass ich die Daten in die unterschiedlichen Tabellenblätter bekomme. 

Habe da schon einmal einen einen Code für das Personal kopiert. Vielleicht kann mir ja einer von euch helfen und mir die Fehler aufzeigen.


Angehängte Dateien
.xlsm   ProjektübersichtVBA2.xlsm (Größe: 46,5 KB / Downloads: 10)
Top


Gehe zu:


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