Excel Userform - Eintrag aus Listbox in neuer Userform anzeigen und verarbeiten


jerry0110

Erfahrenes Mitglied
#1
Hallo zusammen,

ich habe 2 Userformen erstellt.

In der ersten Userform1 zeigt er mir in einer Listbox alle Einträge in einer Tabelle an.
In der zweiten Userform2 kann ich neue Einträge machen und in die Tabelle speichern.

Jetzt möchte ich, dass der Eintrag den ich ausgewählt habe in der Listbox (Userform1) in der Userform2 anzeigen lassen.
Wenn dieser dann angezeigt wird, dann möchte ich z. B. Sachen ergänzen (z. B. die Bemerkung) und dann wieder abspeichern.
Und zwar auf der gleichen Stelle, wo der Eintrag in der Tabelle ist.

Kann mir hier jemand helfen? Ich versuche mich gerade neu mit Userforms und komme bei diesem Punkt nicht weiter.

Vielleicht ist zu sagen, dass es immer einen eindeutigen Indikator gibt und das ist in der ersten Zelle des Datensatzes die Ticketnummer.

Danke im Voraus.
 

jerry0110

Erfahrenes Mitglied
#2
So ich habe gestern bis heute mir einige Dinge angeschaut und mal ausprobiert.
Jetzt habe ich folgendes im meinem Code.

Die Listbox geht auf mit allen Daten die ich relevant sind.
Jetzt suche ich eine Zeile aus und die soll er dann in einer neuen Userform anzeigen.

Jedoch weiß ich nicht wie ich das "x" deklarieren soll.

Visual Basic:
Private Sub CommandButton2_Click()
Dim x As Integer
    Z = Sheets(1).UsedRange.Rows.Count
  [B][U]  x = ListBox1.ControlSource[/U][/B]
    
    temp = 0
    For i = 2 To Z
        If Cells(i, 1) = x Then
            temp = 1
            Exit For
        End If
    Next
    If temp = 1 Then
        Unload Me
        zeile = i
        UserForm3.Show
    End If
    
End Sub
 

Zvoni

Erfahrenes Mitglied
#3
Errr....
Wenn du eine Zeile in einer Listbox anclickst, ist der ListIndex grösser -1.
Wieso nicht einfach

Visual Basic:
If ListBox1.ListIndex>-1 Then     'Eine Zeile ist angeclickt
    Load UserForm3
    UserForm3.TextBox1.Text=ListBox1.List(ListBox1.ListIndex)
    UserForm3.Show    'vbModal bzw. vbModeLess
End If
 

jerry0110

Erfahrenes Mitglied
#4
Errr....
Wenn du eine Zeile in einer Listbox anclickst, ist der ListIndex grösser -1.
Wieso nicht einfach

Visual Basic:
If ListBox1.ListIndex>-1 Then     'Eine Zeile ist angeclickt
    Load UserForm3
    UserForm3.TextBox1.Text=ListBox1.List(ListBox1.ListIndex)
    UserForm3.Show    'vbModal bzw. vbModeLess
End If
Also nur für mein Verständnis.

Nach dem Then werden direkt die Daten aus meiner Tabelle in die Userform3 geladen? Also brauche ich dann nicht in der Userform3 ein Initialize zu machen?

Weil ich in der Listbox eine Menge an Daten habe die alle in verschiedene Textfeld müssen in der Userform3
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
#5
Jepp, genau.
Wenn es korrekt ist, dass du in der Listbox auf Userform2 alle Daten enthält (inkl. unique identifier), sollte es dann keine Probleme mit dem zurückschreiben der Änderungen geben.
Ggf. Kannst du ja mal deine Mappe mit Fantasiedaten mal hier reinstellen, und ich schau mal, ob ich dir weiter helfen kann
 

jerry0110

Erfahrenes Mitglied
#6
Also ich habe den Code jetzt mal angepasst.
Er zeigt dann aber nur immer den gleichen Datensatz an und nicht den ich ausgesucht habe.
Ich geh davon aus, dass es an ListBox1.List(ListIndex, 1) liegt.

Ich kann keine Mappe hochladen.

Visual Basic:
If ListBox1.ListIndex > -1 Then   'Eine Zeile ist angeklickt
   
    Load UserForm3

    UserForm3.TextBox_Ticketnummer.Text = ListBox1.List(ListIndex, 1)
    UserForm3.TextBox_St_Anfang.Text = ListBox1.List(ListIndex, 2)
    UserForm3.TextBox_St_Ende = ListBox1.List(ListIndex, 3)
    UserForm3.TextBox_Betr_Gebiet.Text = ListBox1.List(ListIndex, 4)
    UserForm3.TextBox_Betr_POP.Text = ListBox1.List(ListIndex, 5)
    UserForm3.TextBox_Betr_KR.Text = ListBox1.List(ListIndex, 6)
    UserForm3.TextBox_Betr_DSW.Text = ListBox1.List(ListIndex, 7)
    UserForm3.TextBox_Firmenname.Text = ListBox1.List(ListIndex, 8)
    UserForm3.TextBox_Adresse.Text = ListBox1.List(ListIndex, 9)
    UserForm3.TextBox_ASP.Text = ListBox1.List(ListIndex, 10)
    UserForm3.TextBox_Schadenstelle = ListBox1.List(ListIndex, 11)
    UserForm3.ComboBox_Kabeltyp.Text = ListBox1.List(ListIndex, 12)
    UserForm3.ComboBox_Darkfiber.Text = ListBox1.List(ListIndex, 13)
    UserForm3.ComboBoxWDM_Strecke = ListBox1.List(ListIndex, 14)
    UserForm3.ComboBox_DP_TYP = ListBox1.List(ListIndex, 15)
    UserForm3.TextBox_Betr_PK.Text = ListBox1.List(ListIndex, 16)
    UserForm3.TextBox_Betr_Grosskunden = ListBox1.List(ListIndex, 17)
    UserForm3.Textbox_Bemerkung.Text = ListBox1.List(ListIndex, 18)

   
    UserForm3.Show    'vbModal bzw. vbModeLess
End If

End Sub
 

jerry0110

Erfahrenes Mitglied
#7
Hier mal die Datei.

was natürlich noch fehlt ist, dass der gleiche Datensatz dann überschrieben wird. und nicht, dass er dann neu speichert und ich habe den Datensatz 2 mal.
 

Anhänge

Zvoni

Erfahrenes Mitglied
#8
Also ich habe den Code jetzt mal angepasst.
Er zeigt dann aber nur immer den gleichen Datensatz an und nicht den ich ausgesucht habe.
Ich geh davon aus, dass es an ListBox1.List(ListIndex, 1) liegt.

Ich kann keine Mappe hochladen.

Visual Basic:
If ListBox1.ListIndex > -1 Then   'Eine Zeile ist angeklickt
 
    Load UserForm3

    UserForm3.TextBox_Ticketnummer.Text = ListBox1.List(ListIndex, 1)
    UserForm3.TextBox_St_Anfang.Text = ListBox1.List(ListIndex, 2)
    UserForm3.TextBox_St_Ende = ListBox1.List(ListIndex, 3)
    UserForm3.TextBox_Betr_Gebiet.Text = ListBox1.List(ListIndex, 4)
    UserForm3.TextBox_Betr_POP.Text = ListBox1.List(ListIndex, 5)
    UserForm3.TextBox_Betr_KR.Text = ListBox1.List(ListIndex, 6)
    UserForm3.TextBox_Betr_DSW.Text = ListBox1.List(ListIndex, 7)
    UserForm3.TextBox_Firmenname.Text = ListBox1.List(ListIndex, 8)
    UserForm3.TextBox_Adresse.Text = ListBox1.List(ListIndex, 9)
    UserForm3.TextBox_ASP.Text = ListBox1.List(ListIndex, 10)
    UserForm3.TextBox_Schadenstelle = ListBox1.List(ListIndex, 11)
    UserForm3.ComboBox_Kabeltyp.Text = ListBox1.List(ListIndex, 12)
    UserForm3.ComboBox_Darkfiber.Text = ListBox1.List(ListIndex, 13)
    UserForm3.ComboBoxWDM_Strecke = ListBox1.List(ListIndex, 14)
    UserForm3.ComboBox_DP_TYP = ListBox1.List(ListIndex, 15)
    UserForm3.TextBox_Betr_PK.Text = ListBox1.List(ListIndex, 16)
    UserForm3.TextBox_Betr_Grosskunden = ListBox1.List(ListIndex, 17)
    UserForm3.Textbox_Bemerkung.Text = ListBox1.List(ListIndex, 18)

 
    UserForm3.Show    'vbModal bzw. vbModeLess
End If

End Sub
Ich habe deinen Fehler gefunden.
UserForm3.TextBox_Ticketnummer.Text = ListBox1.List(ListIndex, 1)
Du benutzt ListIndex ohne Qualifikation.
UserForm3.TextBox_Ticketnummer.Text = ListBox1.List(ListBox1.ListIndex, 1)
etc.

Was das speichern betrifft:
In CommandButton2 von UserForm3 musst du zuerst die Ticketnummer suchen.
Im jetzigen Code fügst du einfach eine neue Zeile unten an.
Um einen Wert in einer Spalte/Zeile zu finden gibt es verschiedene Möglichkeiten.
Die einfachste ist die Spalte von oben nach unten zu durchlaufen, und die Zelle mit dem gesuchten Wert vergleichen. Da die Ticketnummer Ein-Eindeutig ist, kannst du bei Gefunden=Wahr aus der Schleife springen, und hast automatisch die Zeilennummer. Der Rest vom Code kann gleich bleiben
 

jerry0110

Erfahrenes Mitglied
#9
Ich habe deinen Fehler gefunden.
UserForm3.TextBox_Ticketnummer.Text = ListBox1.List(ListIndex, 1)
Du benutzt ListIndex ohne Qualifikation.
UserForm3.TextBox_Ticketnummer.Text = ListBox1.List(ListBox1.ListIndex, 1)
etc.

Was das speichern betrifft:
In CommandButton2 von UserForm3 musst du zuerst die Ticketnummer suchen.
Im jetzigen Code fügst du einfach eine neue Zeile unten an.
Um einen Wert in einer Spalte/Zeile zu finden gibt es verschiedene Möglichkeiten.
Die einfachste ist die Spalte von oben nach unten zu durchlaufen, und die Zelle mit dem gesuchten Wert vergleichen. Da die Ticketnummer Ein-Eindeutig ist, kannst du bei Gefunden=Wahr aus der Schleife springen, und hast automatisch die Zeilennummer. Der Rest vom Code kann gleich bleiben
Ich wusste doch das es an dem blöden Listbox1 liegen muss :)
Danke dafür

Für den Rest mach ich mich mal dran und wenn es nicht klappt melde ich mich.
 

jerry0110

Erfahrenes Mitglied
#10
Also ich habe jetzt was programmiert, was für mich eigentlich eindeutig ist.
die variable zeile ist eine globale variable.

Wenn ich die for schleife durchlaufen lasse dann findet er immer die Zeile 24 wo nichts steht.
Wenn ich die Ticketnummer z. B. 6 habe dann müsste er in Zeile 7 diesen Datensatz finden.
Findet er aber nicht.

Und dann bekomme ich einen Fehlercode 1004 wenn ich dann die Werte übertragen möchte.

Und warum setzt er die Checkbox nicht wenn der Wert auf True steht?

Visual Basic:
Private Sub CommandButton2_Click()

    Dim x As Long
   
    Z = Worksheets("Datentabelle").UsedRange.Rows.Count
    x = Me.TextBox_Ticketnummer
    temp = 0
   
    For i = 1 To Z
        If Worksheets("Datentabelle").Range("P" & i) = x Then
            temp = 1
            Exit For
        End If
    Next
   
    If temp = 1 Then
        Unload Me
        zeile = i
       
    End If
   
       
        Worksheets("Datentabelle").Range("A" & zeile) = TextBox_Ticketnummer
        Worksheets("Datentabelle").Range("B" & zeile) = TextBox_St_Anfang
        Worksheets("Datentabelle").Range("C" & zeile) = TextBox_St_Ende
        Worksheets("Datentabelle").Range("D" & zeile) = TextBox_Betr_Gebiet
        Worksheets("Datentabelle").Range("E" & zeile) = TextBox_Betr_POP
        Worksheets("Datentabelle").Range("F" & zeile) = TextBox_Betr_KR
        Worksheets("Datentabelle").Range("G" & zeile) = TextBox_Betr_DSW
        Worksheets("Datentabelle").Range("H" & zeile) = TextBox_Firmenname
        Worksheets("Datentabelle").Range("I" & zeile) = TextBox_Adresse
        Worksheets("Datentabelle").Range("J" & zeile) = TextBox_ASP
        Worksheets("Datentabelle").Range("K" & zeile) = TextBox_Schadenstelle
        Worksheets("Datentabelle").Range("L" & zeile) = ComboBox_Kabeltyp
        Worksheets("Datentabelle").Range("M" & zeile) = ComboBox_Darkfiber
        Worksheets("Datentabelle").Range("N" & zeile) = ComboBoxWDM_Strecke
        Worksheets("Datentabelle").Range("O" & zeile) = ComboBox_DP_TYP
        Worksheets("Datentabelle").Range("P" & zeile) = TextBox_Betr_PK
        Worksheets("Datentabelle").Range("Q" & zeile) = TextBox_Betr_Grosskunden
        Worksheets("Datentabelle").Range("R" & zeile) = Textbox_Bemerkung
        Worksheets("Datentabelle").Range("S" & zeile) = CheckBox_Störung_erledigt

   
End Sub
 

Zvoni

Erfahrenes Mitglied
#11
Wieso vergleichst du Ticketnummer mit betroffene PK?????
Du musst Ticketnummer mit Spalte A vergleichen?!?!?

Generell solltest du die Prozedur wie folgt aufbauen:
Suche Ticketnummer in Spalte A
Falls gefunden dann
Schreibe Textboxes in die entsprechende Zelle im Arbeitsblatt
Springe aus Schleife
Ende Falls
 

jerry0110

Erfahrenes Mitglied
#12
Ja wollte gerade mein neues script posten :)
Habe es gerade selber bemerkt.

Bin immer noch nicht so weit, warum die Checkbox nicht gefüllt wird.

Visual Basic:
Private Sub CommandButton2_Click()
   
    Dim source As Worksheet
    Dim f As Long
    Dim lastRow As Long
    Dim x As Long
    Dim Temp As Integer
   
    Set source = ActiveWorkbook.Worksheets("Datentabelle")
   
    lastRow = xlsGetLastRow(source)
   

    x = TextBox_Ticketnummer
    Temp = 0
   
    For f = lastRowNr(source) To 2 Step -1
        If source.Range("A" & f) = x Then
            zeile = f
            Temp = 1
            Exit For
        End If
    Next f
           
    If Temp = 1 Then

        Unload Me

    End If
   
MsgBox f
   
        source.Range("A" & f).Value = TextBox_Ticketnummer
        source.Range("B" & f).Value = TextBox_St_Anfang
        source.Range("C" & f).Value = TextBox_St_Ende
        source.Range("D" & f).Value = TextBox_Betr_Gebiet
        source.Range("E" & f).Value = TextBox_Betr_POP
        source.Range("F" & f).Value = TextBox_Betr_KR
        source.Range("G" & f).Value = TextBox_Betr_DSW
        source.Range("H" & f).Value = TextBox_Firmenname
        source.Range("I" & f).Value = TextBox_Adresse
        source.Range("J" & f).Value = TextBox_ASP
        source.Range("K" & f).Value = TextBox_Schadenstelle
        source.Range("L" & f).Value = ComboBox_Kabeltyp
        source.Range("M" & f).Value = ComboBox_Darkfiber
        source.Range("N" & f).Value = ComboBoxWDM_Strecke
        source.Range("O" & f).Value = ComboBox_DP_TYP
        source.Range("P" & f).Value = TextBox_Betr_PK
        source.Range("Q" & f).Value = TextBox_Betr_Grosskunden
        source.Range("R" & f).Value = Textbox_Bemerkung
        source.Range("S" & f).Value = CheckBox_Störung_erledigt
       

   
End Sub
 

Zvoni

Erfahrenes Mitglied
#13
1) Schieb dein source.range etc. vor das Unload me. Damit verhinderst du deinen Fehler 1004

Wegen der Checkbox: Vermutung: Der Wert der Checkbox ist ein True/False (bzw. eine Repräsentation davon).
Der Wert in der Zelle scheint aber ein Text zu sein. Mach doch einfach eine If-Then-Else daraus
If Checkbox=True Then
source.range="WAHR"
Else
source.range="FALSCH"
End if
 

Neue Beiträge