2.3k Aufrufe
Gefragt in Tabellenkalkulation von
Guten Abend :-)

Habe eine Kurze frage zu einer Listbox. Hier mein Problem:

Habe eine Userform mit 1 Listbox und 2 Buttons:

Button1: Ende (dürfte sich erklären)
Button2: Füllen (Füllt die Listbox mit meinen Daten)


Private Sub cmdFüllen_Click()
ListBoxFuellen List1, ThisWorkbook.Worksheets("Tabelle1").Range("B2:K165")
End Sub

Private Sub ListBoxFuellen(DieListbox As MSForms.ListBox, DerRange As Range)
With DieListbox
.ColumnCount = DerRange.Columns.Count
.List = DerRange.Value
End With
End Sub


Nun stehen meine Daten (10 Spalten) so wie ich es haben will in meiner Listbox. In der 10ten Spalte befindet sich bei manchen ein X, und bei manchen keines. Nun meine Frage:

Ist es möglich das die Listbox auf Doppelklick überprüft, ob da ein X ist oder nicht, und es je nachdem ändert (also wenn keines da ist, eines reinschreiben, und wenn eines da ist, es löschen). Und sobald ich auf den Ende Button klicke, sollen diese Änderungen (also ob X oder nicht) in die Tabelle übernommen werden (oder g eht das direkt?)

euer Holy

10 Antworten

0 Punkte
Beantwortet von fedjo Experte (2.2k Punkte)
Hallo Holy,
vielleicht könntest du ein Muster uploaden und den Link ins Forum stellen, um deine Erklärungen besser zu verstehen.

Gruß
fedjo
0 Punkte
Beantwortet von
hier ne testdatei (bei der anderen handelt es sich um namen, telefonnummern etc, die wollte ich nicht onlinestellen). Diese ist im Prinzip aber dasselbe

www.file-upload.net/download-3627364/test.xlsm.html
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Holylon,

ohne Listbox könnte das so funktionieren

Sub x_tauschen()
Dim rngC As Range
For Each rngC In Range("F3:F" & Cells(Rows.Count, 2).End(xlUp).Row)
If rngC.Value = "" Then
rngC.Value = "x"
Else
rngC.Value = ""
End If
Next
End Sub


Gruß
Rainer
0 Punkte
Beantwortet von
Hallo Holylon

Es funktioniert auch mit Listbox prima


Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim rngC As Range
For Each rngC In Range("F3:F" & Cells(Rows.Count, 2).End(xlUp).Row)
If rngC.Value = "" Then
rngC.Value = "x"
Else
rngC.Value = ""
End If
Next
End Sub


das problem ist nur das er dann _alle_ die kein X haben austauscht (und umgekehrt). Ich will aber das er nur den ausgewählten (bzw in der Listbox angeklickten) auswechselt.

Ich habe mal was gelesen von wegen das jede Listbox ihre einträge mit einem Wert versieht (also fortlaufen, Eintag 1=2, Eintrag2= 2, usw...)
Gibt es da nicht die Möglichkeit, genau diesen Wert auszulesen (also zb ich doppelklicke auf den 32 Wert in der Listbox, integer wert ist also 32) und dann über diesen Wert die zelle bilde? Beispiel zum verständnis:

Doppelklick auf eintrag 11: Über vba code wert der Variable intIndex zuweisen. Da meine Tabelle auf B3 (also die zu änderten werte) beginnt, addiere ich zu intIndex 2

intIndex intIndex + 2

und dann bilde ich die Zelle mit

strZellname = "F" + cstr(intIndex)

und dann kann ich per range(strzellname) die zu verändernde Zelle ansprechen. Geht das so? Ist zwar kompliziert aber ich könnts mir vorstellen, und bei der kleinen Menge an Daten dürfte es da auch zu keinen Leistungschwächen kommen.

Mir ist noch eine Frage eingefallen. Welchen Code bräuchte ich, wenn ich einen Eintrag auswähle und dann per Buttondruck die gesamte Zeile bearbeiten möchte? (also m it inputboxen, das bekomme ich schon hin) Mein Problem ist hier wieder der Übertrag in die Tabelle.

Lg
0 Punkte
Beantwortet von
Hallo nochmal

Nochwas: Die Änderung sollte in der Listbox auch gleich angezeigt werden ..

lg
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Holy,

das war Deine Frage

Ist es möglich das die Listbox auf Doppelklick überprüft, ob da ein X ist oder nicht, und es je nachdem ändert (also wenn keines da ist, eines reinschreiben, und wenn eines da ist, es löschen). Und sobald ich auf den Ende Button klicke, sollen diese Änderungen (also ob X oder nicht) in die Tabelle übernommen werden (oder g eht das direkt?)

.... ich glaube, hierauf bezogen (oder g eht das direkt?), ist mein Makro genau die richtige Antwort. Eine andere habe ich leider nicht zu Deinem Problem.

Gruß
Rainer
0 Punkte
Beantwortet von
Hallo Rainer

Stimmt, ich habe mich nicht präzise genug ausgedrückt, ich wollte das das Programm überprüft, ob dieser eine Eintrag ein X hat oder nicht, und es dann verändert, in der Listbox und in der Tabelle (von mir aus auch erst dann wenn die Listbox geschlossen wird.

Ist das möglich?

Lg
0 Punkte
Beantwortet von
Hallo Leute

Eine Idee hätt ich noch, ich hab mal gelesen das man den Eintrag in ne Textbox ausgeben kann. ist esn icht möglich das Feld Bezeichnung (Spalte 3) einer Variable zuzuweisen, dann in der Tabelle suchen zu lassen. Und wenn er sie gefunden hat in dieser Zeile dann das mit dem "X" zu überprüfen. Nach der Änderung aktualisiert er automatisch die Listbox indem er den Füllprozess einfach wiederholt. Würde das gehen?

Dazu bräuchte ich halt den Code um die Bezeichnung einer Variable zuweisen zu können, bzw wie man wenn er ein Feld mit der Bezeichnung gefunden hat, erfrägt in welcher zeile er sich befindet.

Jemand ne idee?

lg Holy
0 Punkte
Beantwortet von
Hallo Leute

Ich hab es mal so probiert:


Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim markierterEintrag As String
Dim i As Integer
Dim Zelle As String
Dim Zelle2 As String
Dim Zelleninhalt As String


With ListBox1
markierterEintrag = CStr(.List(.ListIndex))
ThisWorkbook.Worksheets("Tabelle1").Select
For i = 3 To 30
Zelle = "B" + CStr(i)
Zelleninhalt = CStr(Range(Zelle))
If mariertereintrag = Zelleninhalt Then
Zelle2 = "F" + CStr(i)
If Range(Zelle2) = "" Then
Range(Zelle2) = "X"
ElseIf Range(Zelle2) = "X" Then
Range(Zelle2) = ""


End If

End If

UserForm1.ListBox1.Clear 'Löschen und wieder befüllen funktioniert
ListBoxFuellen ListBox1, ThisWorkbook.Worksheets("Tabelle1").Range("B2:F28")

Next i

End With
End Sub


Also "markierterEintrag" entspricht immer der ersten Spalte (zumindest wenn ich es mit ner msgbox ausgebe). Und trotzdem findet er keine Übereinstimmung in der Tabelle, woran könnte das liegen? Problem von dieser Lösung ist halt das nicht alle Daten mit der ersten Spalte eindeutig identifizierbar sind, die 3te Spalte wäre wesentlich besser.

Euer Holy
0 Punkte
Beantwortet von
Nochmal Hallo ;-)

So für alle die es interessiert, habe eine Lösung gefunden:


Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim Zelle As String
Dim zeile As String

zeile = Range("A1:A31").Rows(ListBox1.ListIndex + 1).Row + 1
ThisWorkbook.Worksheets("Tabelle1").Select
Zelle = "F" + CStr(zeile)

If Range(Zelle) = "" Then
Range(Zelle) = "X"
ElseIf Range(Zelle) = "X" Then
Range(Zelle) = ""
End If
UserForm1.ListBox1.Clear
ListBoxFuellen ListBox1, ThisWorkbook.Worksheets("Tabelle1").Range("B2:F28")

End Sub


Das + 1 hier am ende

zeile = Range("A1:A31").Rows(ListBox1.ListIndex + 1).Row + 1


dient dazu, die zellen zu finden (da die Tabelle in "B2" beginnt. So funtkioniert das ganze einwandfrei und die Listbox läuft live mit ;-)

Trotzdem, danke für eure Hilfsbereitschaft. Super Forum hier ;-) Vll meld ich mich ja nochmal mit n paar Problemchen xD

lg
Euer Holy
...