Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Informationen in Userform laden und überschreiben
#11
Code:
Private Sub CommandButton1_Click()
Dim suche As Range
 If ComboBox6.Text = "" Or ComboBox7.Text = "" Then
   MsgBox "leere Eingabefelder vorhanden!"
   Exit Sub
 End If
 C_mstrDatenblatt = ComboBox6.Text
 mlngLast = Worksheets(C_mstrDatenblatt).Cells(Rows.Count, 1).End(xlUp).Row
'  Stop

If Not ComboBox9 = "" Then
 Set suche = Worksheets(C_mstrDatenblatt).Range("D3:D" & mlngLast).Find(ComboBox9.Text)
 If Not suche Is Nothing Then
   ComboBox1.Value = suche.Offset(0, 2).Value ' usw. bis 13 oder so
   ComboBox4.Value = suche.Offset(0, 3).Value
   TextBox6.Value = suche.Offset(0, 4).Value
   TextBox7.Value = suche.Offset(0, 5).Value
   TextBox8.Value = suche.Offset(0, 6).Value
   TextBox9.Value = suche.Offset(0, 7).Value
   TextBox10.Value = suche.Offset(0, 8).Value
   TextBox11.Value = suche.Offset(0, 9).Value
   TextBox12.Value = suche.Offset(0, 11).Value
   ComboBox3.Value = suche.Offset(0, 12).Value
   
   For loSpalte = 14 To 145
       Me.Controls("TextBox" & loSpalte + 9).Value = suche.Offset(0, loSpalte) ' zweite UF-Seite
   Next loSpalte
   
   
  Else
   MsgBox ComboBox9.Text & " nicht gefunden."
 End If
 
Else
   
 Set suche = Worksheets(C_mstrDatenblatt).Range("C3:C" & mlngLast).Find(ComboBox8.Text)
 If Not suche Is Nothing Then
   ComboBox1.Value = suche.Offset(0, 3).Value ' usw. bis 13 oder so
   ComboBox4.Value = suche.Offset(0, 4).Value
   TextBox6.Value = suche.Offset(0, 5).Value
   TextBox7.Value = suche.Offset(0, 6).Value
   TextBox8.Value = suche.Offset(0, 7).Value
   TextBox9.Value = suche.Offset(0, 8).Value
   TextBox10.Value = suche.Offset(0, 9).Value
   TextBox11.Value = suche.Offset(0, 10).Value
   TextBox12.Value = suche.Offset(0, 12).Value
   ComboBox3.Value = suche.Offset(0, 13).Value
   
   For loSpalte = 15 To 146
       Me.Controls("TextBox" & loSpalte + 8).Value = suche.Offset(0, loSpalte) ' zweite UF-Seite
   Next loSpalte
   
   
  Else
   MsgBox ComboBox8.Text & " nicht gefunden."
 End If
End If
   
   
   
End Sub
Danke für die Hilfe und das geht definitiv schon in die richtige Richtung. Das wäre mein Code. Jetzt ist es nur genau anders herum.
Wenn meine Teilenummer leer ist, dann sucht er nach RFQ. Das passt.
Wenn Teilenummer allerdings gefüllt ist, kann er nicht zwischen den beiden Teilenummern unterscheiden und läd wieder den unteren der beiden Einträge (also vom Prinzip genauso wie vorher nur nicht mit RFQ, sondern mit Teilenummer)
Bestimmt passt in meinem Code etwas nicht ganz ::D
Gruß
Jan
Antworten Top
#12
Hallo Jan,

erst mal was zur Vereinfachung.
Du könntest den Treffer der Suche gleich um eine Spalte verschieben und brauchst dann die Einträge nicht 2x zu programmieren.
Im Prinzip so:
Code:
If Not ComboBox9 = "" Then
Set suche = Worksheets(C_mstrDatenblatt).Range("D3:D" & mlngLast).Find(ComboBox9.Text)
Else
  Set suche = Worksheets(C_mstrDatenblatt).Range("C3:C" & mlngLast).Find(ComboBox8.Text).offset(0 ,1)
End IF
  If Not suche Is Nothing Then

Wenn die Teilenummer gefüllt ist und nur einmal vorkommt, sollte das nicht passieren. Kommt sie mehrmals vor, dann musst Du noch die anderen Spalten prüfen, ob z.B. Kunde und Bauteilbezeichnung passen. Wenn nicht, gibt es noch den FindNext-Befehl. Du könntest mit einer Schleife solange suchen, bis Du einen eindeutigen Treffer erzielst. Du musst nur aufpassen, FindNext sucht von oben nach unten und fängt dann wieder oben an. Du müsstest Dir also die Trefferzeile merken und prüfen, ob der nächste Treffer eine größere Zeilennummer hat. Wenn nicht, dann die Schleife verlassen.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#13
Hallo Schauan,

ja die vereinfachung sieht gut aus und macht das selbe, wie meins vorher. Also ist das schon mal Top!

Im Anhang habe ich ein Bild hinzugefügt. Sind die Zellen so ausgefüllt, kann er und ich weiß nicht wieso, nicht zwischen den Zeilen unterscheiden und nimmt in meinem Fall immer die untere von beiden...

Bin etwas verzweifelt Huh  denn ansich, wenn ich versuche den Code nachzuvollziehen, ist es eindeutig. Aber lasse ich die If-Abfrage mit ComboBox9="" weg, erkennt er den Unterschied zwischen der Kundenteilenummer aber nicht den Unterschied bei der RFQ-Nummer. Nehme ich die If-Abfrage mit rein, ist es genau umgekehrt. Die RFQ-Nummer erkennt er, die Kundenteilenummer nicht...
Vllt hat ja noch jemand einen Gedankenblitz für mich!
Danke und liebe Grüße
Jan


Angehängte Dateien Thumbnail(s)
   
Antworten Top
#14
Hallo Jan,

ich habe den Code hinter der Schaltfläche CommandButton1 mal etwas umfangreicher angepasst.


Code:
Private Sub CommandButton1_Click()
Dim suche As Range
Dim lngSpalte As Long
Dim lngR As Long
Dim strgSuchText As String
 If ComboBox2.ListIndex = -1 Or ComboBox6.ListIndex = -1 Or ComboBox7.ListIndex = -1 Then
   MsgBox "leere Eingabefelder vorhanden!"
   Exit Sub
 End If
 
 If ComboBox8.ListIndex = -1 And ComboBox9.ListIndex = -1 Then
   MsgBox "Bitte RFQ-Nummer oder  Kunden Teilenummer eingeben!"
   Exit Sub
 Else
   If ComboBox8.ListIndex > -1 Then
     lngSpalte = 3
     strgSuchText = ComboBox8.Text
   Else
     lngSpalte = 4
     strgSuchText = ComboBox9.Text
   End If
 End If
 C_mstrDatenblatt = ComboBox6.Text
 mlngLast = Worksheets(C_mstrDatenblatt).Cells(Rows.Count, 1).End(xlUp).Row
'  Stop
 With Worksheets(C_mstrDatenblatt)
   Set suche = .Range(.Cells(2, lngSpalte), .Cells(mlngLast, lngSpalte)).Find(strgSuchText)
   If Not suche Is Nothing Then
     lngR = suche.Row
     ComboBox1.Value = .Cells(lngR, 6).Value ' usw. bis 13 oder so
     ComboBox4.Value = .Cells(lngR, 7).Value
     TextBox6.Value = .Cells(lngR, 8).Value
     TextBox7.Value = .Cells(lngR, 9).Value
     TextBox8.Value = .Cells(lngR, 10).Value
     TextBox9.Value = .Cells(lngR, 11).Value
     TextBox10.Value = .Cells(lngR, 12).Value
     TextBox11.Value = .Cells(lngR, 13).Value
     TextBox12.Value = .Cells(lngR, 15).Value
     ComboBox3.Value = .Cells(lngR, 16).Value
   
     For loSpalte = 14 To 145
       Me.Controls("TextBox" & loSpalte + 9).Value = .Cells(lngR, loSpalte + 4) ' zweite UF-Seite
     Next loSpalte
   
    Else
     MsgBox strgSuchText & " nicht gefunden."
   End If
 End With
End Sub
Gruß Atilla
Antworten Top
#15
Hallo Atilla,

ein dickes dankeschön dafür. Ich habe mal versucht das ganze nachzuvollziehen und etwas rumgespielt.
Wenn jetzt z.B. sowohl RFQ-Nummer, als auch Kundenteilenummer nicht angewählt sind kommt jetzt eine MsgBox "Bitte RFQ-Numer oder Kundenteilenummer eingeben".
Gehe ich jetzt davon aus, dass in meiner Tabelle solch ein Fall vorkommt (also Keine RFQ-Nummer, keine Kundenteilenummer und trotzdem eine eineutige Zeilenzuweisung) habe ich mal versucht den Code so umzuändern:

Code:
Private Sub CommandButton1_Click()
Dim suche As Range
Dim lngSpalte As Long
Dim lngR As Long
Dim strgSuchText As String
 If ComboBox2.ListIndex = -1 Or ComboBox6.ListIndex = -1 Then
   MsgBox "leere Eingabefelder vorhanden!"
   Exit Sub
 End If
 
 If ComboBox7.ListIndex = -1 And ComboBox8.ListIndex = -1 And ComboBox9.ListIndex = -1 Then
   MsgBox "Bitte Bauteilbezeichnung oder RFQ-Nummer oder  Kunden Teilenummer eingeben!"
   Exit Sub
 Else
   If ComboBox7.ListIndex > -1 Then
     lngSpalte = 2
     strgSuchText = ComboBox7.Text
   Else
       If ComboBox8.ListIndex > -1 Then
           lngSpalte = 3
           strgSuchText = ComboBox8.Text
       Else
           lngSpalte = 4
           strgSuchText = ComboBox9.Text
       End If
   End If
 End If
 C_mstrDatenblatt = ComboBox6.Text
 mlngLast = Worksheets(C_mstrDatenblatt).Cells(Rows.Count, 1).End(xlUp).Row
'  Stop
 With Worksheets(C_mstrDatenblatt)
   Set suche = .Range(.Cells(2, lngSpalte), .Cells(mlngLast, lngSpalte)).Find(strgSuchText)
   If Not suche Is Nothing Then
     lngR = suche.Row
     ComboBox1.Value = .Cells(lngR, 6).Value ' usw. bis 13 oder so
     ComboBox4.Value = .Cells(lngR, 7).Value
     TextBox6.Value = .Cells(lngR, 8).Value
     TextBox7.Value = .Cells(lngR, 9).Value
     TextBox8.Value = .Cells(lngR, 10).Value
     TextBox9.Value = .Cells(lngR, 11).Value
     TextBox10.Value = .Cells(lngR, 12).Value
     TextBox11.Value = .Cells(lngR, 13).Value
     TextBox12.Value = .Cells(lngR, 15).Value
     ComboBox3.Value = .Cells(lngR, 16).Value
   
     For loSpalte = 14 To 145
       Me.Controls("TextBox" & loSpalte + 9).Value = .Cells(lngR, loSpalte + 4) ' zweite UF-Seite
     Next loSpalte
   
    Else
     MsgBox strgSuchText & " nicht gefunden."
   End If
 End With
End Sub


Das klappt aber noch nicht ganz. Wenn du in den Bildanhang schaust wird in den CB gewählt: NOV WS - Kunde (Valeo) - Bauteilbezeichnung (PL7 Mediendichtung)
Klicke ich dann auf Informationen laden funktioniert das einwandfrei.
Wähle ich jetzt aber NOV WS - Kunde (Valeo) - Bauteilbezeichnung (StiWa) öffnet sich der Debugger und makiert die Zeil im Code
Code:
ComboBox4.Value = .Cells(lngR, 7).Value

Hättest du da vllt noch einen Rat? Ich glaube, wenn das geklärt ist, steht kein offener Punkt mehr aus und ich kann dich/euch endlich in Ruhe lassen :100:

Danke und liebe Grüße
Jan


Angehängte Dateien Thumbnail(s)
   
Antworten Top
#16
Hallo Jan,

das wird so nicht gehen. Denn in der Spalte "Bauteilebezeichnungen" tauchen Werte mehrfach auf.
Darum kann nicht in dieser Spalte gesucht und eine eindeutige Zeile gefunden werden. Es würde immer der erste
gefundene Wert und dessen Zeile zugrunde gelegt werden.

Deshalb hatte ich es so aufgebaut, dass in den Spalten "RFQ-Nummer" oder "Kundenteilenummer" gesucht wird.
Du hattest geschrieben, dass die Werte da nur immer einmal vorkommen können.

Also, wie soll ein Datensatz eindeutig identifiziert werden können???
Wenn Du diese Frage beantwortest, dann kann man Dir auch gezielt helfen.
Gruß Atilla
Antworten Top
#17
Hallo Atilla,
zunächst einmal sorry fürs undeutliche ausdrücken. Und du hast recht, ich hatte folgendes Szenario nicht erwähnt bzw. es ist mir selbst nicht in den Kopf gekommen.


Es kann noch der Fall eintreffen, dass RFQ-Nummer UND Kundenteilenummer nicht vorhanden sind. Wenn das eintrifft, ist die Bauteilbezeichnung eindeutig.
Wie in dem Bild im Anhang.
Kunde (Valeo) ist identisch. Bauteilbezeichnung einmal "PL7 Mediendichtung" und einmal "StiWa". Diese sind unterschiedlich und daher kann eindeutig zugewiesen werden.

Wenn die Bauteilbezeichnung zweier identischer Kunden ebenfalls gleich ist, ist IMMER entweder eine RFQ-Nummer, eine Kundenteilenummer oder beides vohanden (das deckt ja dein code bisher super ab)!

Ich hoffe ich habe mich diesmal verständlicher ausgedrückt.

Danke und liebe Grüße
Jan


Angehängte Dateien Thumbnail(s)
   
Antworten Top
#18
Hallo Jan,

dann versuch es mal so:


Code:
Private Sub CommandButton1_Click()
Dim suche As Range
Dim lngSpalte As Long
Dim lngR As Long
Dim strgSuchText As String
 If ComboBox2.ListIndex = -1 Or ComboBox6.ListIndex = -1 Or ComboBox7.ListIndex = -1 Then
   MsgBox "leere Eingabefelder vorhanden!"
   Exit Sub
 End If
 
 If ComboBox8.ListIndex = -1 And ComboBox9.ListIndex = -1 Then
   If ComboBox7.ListIndex = -1 Then
     MsgBox "Bitte Bauteilbezeichnung, RFQ-Nummer oder  Kunden Teilenummer eingeben!"
     Exit Sub
   Else
     lngSpalte = 2
     strgSuchText = ComboBox7.Text
   End If
 Else
   If ComboBox8.ListIndex > -1 Then
     lngSpalte = 3
     strgSuchText = ComboBox8.Text
   Else
     lngSpalte = 4
     strgSuchText = ComboBox9.Text
   End If
 End If
 C_mstrDatenblatt = ComboBox6.Text
 mlngLast = Worksheets(C_mstrDatenblatt).Cells(Rows.Count, 1).End(xlUp).Row
'  Stop
 With Worksheets(C_mstrDatenblatt)
   Set suche = .Range(.Cells(2, lngSpalte), .Cells(mlngLast, lngSpalte)).Find(strgSuchText)
   If Not suche Is Nothing Then
     lngR = suche.Row
     ComboBox1.Value = .Cells(lngR, 6).Value ' usw. bis 13 oder so
     ComboBox4.Value = .Cells(lngR, 7).Value
     TextBox6.Value = .Cells(lngR, 8).Value
     TextBox7.Value = .Cells(lngR, 9).Value
     TextBox8.Value = .Cells(lngR, 10).Value
     TextBox9.Value = .Cells(lngR, 11).Value
     TextBox10.Value = .Cells(lngR, 12).Value
     TextBox11.Value = .Cells(lngR, 13).Value
     TextBox12.Value = .Cells(lngR, 15).Value
     ComboBox3.Value = .Cells(lngR, 16).Value
   
     For loSpalte = 14 To 145
       Me.Controls("TextBox" & loSpalte + 9).Value = .Cells(lngR, loSpalte + 4) ' zweite UF-Seite
     Next loSpalte
   
    Else
     MsgBox strgSuchText & " nicht gefunden."
   End If
 End With
End Sub
Gruß Atilla
Antworten Top
#19
Hallo Jan,

Du solltest aber das überschreiben oder zurückschreiben der Daten gründlich überdenken.
Wie Du es bisher codiert und aufgebaut hast wirst Du große Probleme bekommen. Deine Daten können
wild durcheinander gewürfelt werden.

Mach Dir Gedanken darüber, was veränderbar sein soll und was nicht.
Überleg Dir genau, wie eine Änderung in einer Combobox sich auf andere auswirken kann oder muss.
Diese Situationen musst Du per Code dringend abfangen.

Bevor das nicht schlüssig programmiert ist würde ich den Schalter "Informationen überschreiben" unbedingt meiden!
Gruß Atilla
Antworten Top
#20
Hallo Atilla,

leider passt das immernoch nicht :22:
Und je mehr ich ausprobiere, desto mehr Fehler finde ich (Szenarien, die ich schon von anfang an beschrieben habe).

Zunächst einmal: Mit deinem neuen Code geht es leider auch nicht. Der Debugger öffnet sich und die Codezeile wird makiert:
Code:
ComboBox4.Value = .Cells(lngR, 7).Value

Und das Programm kann zur Zeit nicht unterscheiden, wenn Zellen identisch sind:
Bsp.:
1:    Kunde (2x Daimler) -- Bauteilbezeichnung (2x Absorber) -- RFQ-Nummer (2x 8SMER1301) -- Kundenteilenummer (und NUR die Kundenteilenummer) unterscheidet sich
2:    Kunde (2x Ford) -- Bauteilbezeichnung (2x StiWa) --RFQ-Nummer (und NUR die RFQ-Nummer) unterscheidet sich
.
.
.
Es gibt (leider) wirklich sehr viele Szenarien!


Eine Alternative wäre die folgende:
Jede leere Zelle wird mit dem Text "nicht vorhanden" gefüllt. Dann gibt es nurnoch die Szenarien, die im Anhang im Bild Dargestellt sind.


Angehängte Dateien Thumbnail(s)
   
Antworten Top


Gehe zu:


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