Userform optimieren
#1
Hallo,

ich habe eine Datei um Produktionszahlen zu erfassen und auszuwerten.
Die vorhandene Userform funktioniert auch wunderbar.

Aber ich möchte diese gerne noch optimieren, auch um evtl Eingabefehler zu vermeiden.

Ich möchte die Textfelder für Name, Artikel und Vorgang jetzt zb durch Komboboxen ersetzen, die durch die Angaben im Blatt "Daten" gefüllt werden können, wobei es optimal wäre, wenn die Auswahl in Vorgang schon durch die Auswahl in Artikel gefiltert wird.



Ich habe mich schon alleine daran Versucht. Auch indem ich versucht habe, Codes aus einer ähnlichen UF einzubinden.
Aber da kam es immer zu Fehlern, oder es passierte Garnix.


Es wäre schön, wenn mich jemand dabei unterstützen könnte.


Angehängte Dateien
.xlsm   Stückzahlenerfassung Entwurf.xlsm (Größe: 183,7 KB / Downloads: 15)
Top
#2
Hey Mario,
ich nutze dafür folgenden Code

Code:
' Einlesen der Daten bis zur Letzten Zeile
    letztezeile = ThisWorkbook.Worksheets(Ergtab).Range("G" & Rows.Count).End(xlUp).Row
   ' Übergabe an die Comboboxen in Userform Neue_Position
    With UF_Start.CB_Name
        .RowSource = Ergtab & "!G2:G" & letztezeile
        .ListIndex = 0
        .SetFocus: .SelStart = 0: .SelLength = Len(.Text)
    End With
Ergtab ist bei mir die Ergebnisstabelle, also bei dir Daten. Hier als Beispiel für Spalte G.
War bissel faul um den Code jetzt noch anzupassen.
Top
#3
Hallo,

danke für die Antwort.
Aber ich habe es jetzt ersteinmal so gelöst, das ich mir zusätzlich die CB eingefügt habe, und bei klick das in die entsprechende Textbox eingetragen wird.

Ich würde aber eigentlich gerne den Inhalt der CB auf die wirklichen Einträge begrenzen.(momentan habe ich festgelegte Bereiche)


Code zum befüllen der CB im UF Initialize Code, indem ich aber auch nicht zu viel rumdoktorn möchte
Code:
CbName.RowSource = "L3:L20"
  CbArtikel.RowSource = "n3:n20"
  CbVorgang.RowSource = "p3:p20"
 N3:N   zb akzeptiert der nicht
Top
#4
Bau doch wie ich die Letzte Zeile mit ein. Lass dir also raussuchen, wo die sich die letzte Beschriebene Zeile befinden. Auf dein Beispiel bezogen wäre das dann folgender Code
Code:
Dim letztezeile_ Nas double
Dim letztezeile_P as double
letztezeile_N = ThisWorkbook.Worksheets("Deine Tabelle").Range("N" & Rows.Count).End(xlUp).Row
letztezeile_P = ThisWorkbook.Worksheets("Deine Tabelle").Range("P" & Rows.Count).End(xlUp).Row

CbName.RowSource = "L3:L20"
  CbArtikel.RowSource = "n3:n" & letztezeile_N
  CbVorgang.RowSource = "p3:p" & letztezeile_P
Top
#5
Hallo,

dann kommt hier laufzeitfehler 9
Code:
letztezeile_N = ThisWorkbook.Worksheets("Deine Tabelle").Range("N" & Rows.Count).End(xlUp).Row
Top
#6
Hallo,

den Tabellennamen musst Du schon anpassen.
Gruß Stefan
Win 10 / Office 2016
Top
#7
Du hast aber auch deine Tabelle eingefügt oder? Also da wo die Informationen stehen?
Eine weitere mögliche Fehlerquelle ist die erste Leerzeile in deinem Tabellenblatt Daten. Lösch die mal raus
Top
#8
Hallo noch mal,

ich habe jetzt auch versucht die Codes der Buttons speichern und neuer Eintrag zu kombinieren, was die Eingabe ja auch vereinfachen würde.
Aber leider funzt das einfache aneinandersetzen der Codes nicht.

Code Speichern:

Code:
'Speichern Schaltfläche Ereignisroutine
Private Sub CommandButton3_Click()
  Dim lZeile As Long
  Dim loLetzte As Long
 
  'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
  If ListBox1.ListIndex = -1 Then Exit Sub
 
  loLetzte = Tabelle33.Cells(Rows.Count, 1).End(xlUp).Row           ' letzte belegte in Spalte A (1)
 
  'Wir müssen prüfen, ob die ID Spalte auch gefüllt ist!!
  If TextBox1.Text = "" Then
     'Meldung ausgeben
     MsgBox "Sie müssen mindestens eine ID eingeben!", vbCritical + vbOKOnly, "FEHLER!"
     'Abbrechen der Speicherroutine
     Exit Sub
  End If
  'Ausbauoption: Prüfen, ob die ID in Tabelle1 Spalte 1 schon vorhanden ist!
 
  'Zum Speichern benötigen wir die Zeilennummer des ausgewählten Datensatzes
  lZeile = 2 'Start in Zeile 2, Zeile 1 sind ja die Überschriften
  'Schleife solange etwas in der ersten Spalte in Tabelle 1 drin steht
  For lZeile = 2 To loLetzte
     
     'Datensatz ID Spalte mit selektiertem Eintrag der ListBox vergleichen
     If ListBox1.Text = Tabelle33.Cells(lZeile, 1).Value Then
       
        'Eintrag gefunden, TextBoxen in die Zellen schreiben
        Tabelle33.Cells(lZeile, 2).Value = TextBox1.Text
        Tabelle33.Cells(lZeile, 3).Value = TextBox2.Text
        Tabelle33.Cells(lZeile, 4).Value = TextBox3.Text
        Tabelle33.Cells(lZeile, 5).Value = TextBox4.Text
        Tabelle33.Cells(lZeile, 6).Value = TextBox5.Text
        Tabelle33.Cells(lZeile, 1).Value = TextBox6.Text
        Tabelle33.Cells(lZeile, 7).Value = TextBox7.Text
        'Die ListBox muss nun neu geladen werden
        'allerdings nur, wenn sich der Name (ID) geändert hat
        If ListBox1.Text <> TextBox1.Text Then
           Call UserForm_Initialize
           If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
        End If
        'Call sortieren
        Exit Sub 'Vorzeitiges Ende, da der Datensatz schon gefunden ist
       
     End If
     
  Next lZeile
  'Call sortieren
End Sub
Code neuer Eintrag:
Code:
'Neuer Eintrag Schaltfläche Ereignisroutine
Private Sub CommandButton1_Click()
  Dim lZeile As Long
  Dim loLetzte As Long
 
  'Wenn der Benutzer einen neuen Eintrag erzeugen möchte,
  'erstellen wir einen neuen Eintrag in der ListBox und markieren
  'diesen, damit der Benutzer die Daten eintragen kann
 
  loLetzte = Tabelle33.Cells(Rows.Count, 1).End(xlUp).Row           ' letzte belegte in Spalte A (1)
  lZeile = loLetzte + 1
  'Nun steht lZeile in der ersten leeren Zeile von Tabelle1
  'Neuen Eintrag in die Tabelle1 schreiben, Spalte ID muss gefüllt sein, damit
  'unsere Routinen die Zeile wiederfinden!
  Tabelle33.Cells(lZeile, 1) = " " & lZeile
 
  'Und neuen Eintrag in die UserForm eintragen
  ListBox1.AddItem Tabelle33.Cells(lZeile, 1)
 
  'Den neuen Eintrag markieren mit Hilfe des ListIndexes
  ListBox1.ListIndex = ListBox1.ListCount - 1
  'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen
 
End Sub
Top
#9
Hallo, 

ohh ja, sorry ganz Übersehen das mit dem Tabellenblatt, Laufzeitfehler weg.
Top


Gehe zu:


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