Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1136to1140
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Combobox ohne doppelte

Combobox ohne doppelte
amintire
Hallo alle zusammen,
ich hab ja nun den Code hier:
Private Sub UserForm_Initialize()
Me.ComboBox1.List = Sheets("ListBox").Cells(2, 1).Resize(6).Value
Wie kann man den umschreiben dass er mir alle Werte zeigt ohne Doppelte Einträge. Also ein Wert soll bei der ComboBox nur einmal vorkommen.
Dankeschön im vorraus.
Gruß Amina
AW: Combobox ohne doppelte
13.02.2010 11:58:41
Hajo_Zi
Hallo Amina,
schaue auf diese Seite http://hajo-excel.de/vba_userform.htm da sind 2 Beispiele für Listbox. Da man übernehmen kann.

AW: Combobox ohne doppelte
13.02.2010 12:30:46
Christian
Hallo Amina,
die Seite von Hajo funktiniert offensichtlich nicht.
Hier mein Vorschlag:

Private Sub UserForm_Initialize()
Dim hsh As Object, i As Long
Set hsh = CreateObject("Scripting.Dictionary")
With Sheets("ListBox")
For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
hsh(.Cells(i, 1).Text) = 0
Next
End With
Me.ComboBox1.List = Application.Transpose(hsh.Keys)
End Sub
Gruß
Christian
Anzeige
AW: Combobox ohne doppelte
13.02.2010 12:39:46
amintire
Hallo Christian,
kannst du mir evtl den Code mit Kommentaren versehen, damit ich weiß welche Daten ich ändern soll wenn jetzt die Liste in Spalte B steht.
Vielen Dank.
Gruß Amina
AW: Combobox ohne doppelte
13.02.2010 12:50:41
Christian
Hallo nochmals,
der Spaltenindex (hier 1 für Spalte A) steht in:

For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
und in

hsh(.Cells(i, 1).Text) = 0

im folgenden Code musst du den Wert nur einmal ändern:

Private Sub UserForm_Initialize()
Dim hsh As Object, i As Long
Const iCOL As Integer = 1    '1 = Spalte A
Set hsh = CreateObject("Scripting.Dictionary")
With Sheets("ListBox")
For i = 2 To .Cells(.Rows.Count, iCOL).End(xlUp).Row
hsh(.Cells(i, iCOL).Text) = 0
Next
End With
Me.ComboBox1.List = Application.Transpose(hsh.Keys)
End Sub
Gruß
Christian
Anzeige
DANKE...
13.02.2010 13:00:39
amintire
Hallo Christian,
vielen lieben Dank für deine Hilfe.
Ich hab den Code ausprobiert und es funktioniert bestens.
Danke nochmals.
Gruß Amina
verknüpfung ComboBox1 und ComboBox2
13.02.2010 13:04:49
amintire
Hallo nochmal,
wie verknüpfe ich den Code mit einmal (ComboBox1)
Const iCOL As Integer = 1 '1 = Spalte A
und (ComboBox2)
Const iCOL As Integer = 2
Gruß Amina
AW: verknüpfung ComboBox1 und ComboBox2
13.02.2010 13:15:51
Christian
ich geh mal davon aus, dass die Anzahl der Einräge in Spalte A und B unterschiedlich ist. Dann _ würde ich adhoc die Schleife einfach zweimal ausführen

Private Sub UserForm_Initialize()
Dim hsh As Object, i As Long
Const COL1 As Integer = 1    'Spalte A
Const COL2 As Integer = 2    'Spalte B
Set hsh = CreateObject("Scripting.Dictionary")
With Sheets("ListBox")
For i = 2 To .Cells(.Rows.Count, COL1).End(xlUp).Row
hsh(.Cells(i, COL1).Text) = 0
Next
Me.ComboBox1.List = Application.Transpose(hsh.Keys)
hsh.RemoveAll
For i = 2 To .Cells(.Rows.Count, COL2).End(xlUp).Row
hsh(.Cells(i, COL2).Text) = 0
Next
Me.ComboBox2.List = Application.Transpose(hsh.Keys)
End With
End Sub
Gruß Christian
Anzeige
AW: beliebig erweiterbar?
13.02.2010 13:19:20
amintire
Hallo Christian,
ist des hier:
Const COL1 As Integer = 1 'Spalte A
Const COL2 As Integer = 2 'Spalte B
beliebi erweiterbar? Also wenn noch ComboBox 3 und 4 und 5 dazukommt jeweils in spalte A - E ?
Und hier drunter schreib ich dann
Me.ComboBox2.List = Application.Transpose(hsh.Keys)
ComboBox3 und 4 usw ?
Lieg ich da richtig oder falsch?
Gruß Amina
AW: rausgefunden...
13.02.2010 13:56:55
amintire
Hallo nochmal alle zusammen,
bin jetzt mal selber drauf gekommen ;)
Hab den Code folgendermaßen geändert und weiß auch wie erweiterbar dieser ist.
Private Sub UserForm_Initialize()
Dim hsh As Object, i As Long
Const COL1 As Integer = 1 'Spalte A
Const COL2 As Integer = 2 'Spalte B
Const COL3 As Integer = 3 ' Spalte C
Set hsh = CreateObject("Scripting.Dictionary")
With Sheets("ListBox")
For i = 2 To .Cells(.Rows.Count, COL1).End(xlUp).Row
hsh(.Cells(i, COL1).Text) = 0
Next
Me.ComboBox1.List = Application.Transpose(hsh.Keys)
hsh.RemoveAll
For i = 2 To .Cells(.Rows.Count, COL2).End(xlUp).Row
hsh(.Cells(i, COL2).Text) = 0
Next
Me.ComboBox2.List = Application.Transpose(hsh.Keys)
hsh.RemoveAll
For i = 2 To .Cells(.Rows.Count, COL3).End(xlUp).Row
hsh(.Cells(i, COL3).Text) = 0
Next
Me.ComboBox3.List = Application.Transpose(hsh.Keys)
End With
Danke für Eure Hilfe.
Gruß Amina
Anzeige
AW: beliebig erweiterbar?
13.02.2010 13:59:06
Christian
Hallo Amina,
Prinzipiell ja.
Nehmen wir mal an, in deiner Tabelle sind in SpalteA 10 Einträge, in SpalteB 200 Einträge, in SpalteC 20, in SpalteD 5000. Aufgrund der großen Differenz ist es dann sinnvoll, wie in meinem letzten Beispiel jede Spalte mit einer eigenen Schleife (For - Next) zu durchlaufen. Auch bei gleicher Anzahl von Einträgen in allen Spalten macht man damit keinen Fehler, aber es es bremst.
Wenn also alle Spalten die gleiche Anzahl von Einträgen haben, dann ist es sehr viel _ performanter nur eine Schleife zu starten und dann mehrere Hashes (in VBA nennt sich das Dictionary) in einem Schleifendurchlauf zu "füttern". Für diesen Fall wäre also zB der folgende Code besser/schneller:

Private Sub UserForm_Initialize()
'ComboBoxes füllen ohne doppelte Einträge
'Annahme: alle Spalten haben die gleiche Anzahl von Einträgen
'Annahme: die Werte aus Spalte A, B und F sollen in ComboBox1, 2, und 3 eingelesen werden:
Dim hsh1 As Object, hsh2 As Object, hsh3 As Object
Dim i As Long, lngLR As Long
Set hsh1 = CreateObject("Scripting.Dictionary")
Set hsh2 = CreateObject("Scripting.Dictionary")
Set hsh3 = CreateObject("Scripting.Dictionary")
With Sheets("ListBox")
For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row   'letzte Zeile in Spalte A
hsh1(.Cells(i, 1).Text) = 0                      '1 = Spalte A
hsh2(.Cells(i, 2).Text) = 0                      '2 = Spalte B
hsh3(.Cells(i, 6).Text) = 0                      '6 = Spalte F
Next
End With
Me.ComboBox1.List = Application.Transpose(hsh1.Keys)
Me.ComboBox2.List = Application.Transpose(hsh2.Keys)
Me.ComboBox3.List = Application.Transpose(hsh3.Keys)
Set hsh1 = Nothing
Set hsh2 = Nothing
Set hsh3 = Nothing
End Sub
Gruß Christian
Anzeige
AW: beliebig erweiterbar?
13.02.2010 14:04:27
amintire
Hallo Christian,
Prinzipiell haben alle Spalten gleich viele Einträge - nur bei einigen sind mehrere doppelt vorhanden und daher wäre die Auswahl bei der ComboBox unterschiedlich.
Würde dann der Code trotzdem besser passen als der andere?
Gruß Amina
AW: beliebig erweiterbar?
13.02.2010 14:35:03
Christian
Wieviele Einträge in welcher Spalte doppelt sind ist egal. Das wird von dem Hash (Dictionary) abgefangen.
Bei meinem letzten Bsp ist wichtig, dass alle relevanten Spalten (hier A, B, F) die gleiche Anzahl von Einträgen haben.
Wenn die max Anzahl von Einträgen nur ein paar 100 sind, wirst du keinen merklichen Unterschied feststellen. Bei ein paar tausend Einträgen wird es aber durchaus relevant ob ich diese Einträge für zB 5 Comboxes fünf mal durchlaufen muss oder nur einmal.
Btw - der Zugriff auf die einzelnen Zellen bremst noch um ein Vielfaches mehr als die Schleifen selbst. Bei ein paar tausend Einträgen pro Spalte wäre es sinnvoll die Werte zuvor in ein Array zu schreiben und auf dessen Werte zuzugreifen anstatt auf jene der Zellen.
Die Entscheidung bleibt dir überlassen.
Grüße
Christian
Anzeige
Code funktioniert nicht mehr...
13.02.2010 19:31:20
amintire
Hallo Christian,
ich hab den ganzen Code nun so eingepflegt
Private Sub Speichern_Click()
Dim i As Long, j As Long
With Sheets("Liste Mitarbeiter")
i = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
.Cells(i, 1) = Me.ComboBox1
For j = 1 To 32
.Cells(i, j + 1) = Me.Controls("TextBox" & j)
Next
.Cells(i, 1).Resize(, 33).Borders.LineStyle = 1
.Cells(i, 1).Resize(, 33).Borders.Weight = 1
End With
If TextBox1 = "" Then
MsgBox ("Bitte Namen eingeben")
TextBox1.SetFocus
End If
ActiveCell.Offset(1, 0).Range("A1").Select
Application.ScreenUpdating = True
Unload Me
End Sub
'Combobox Auswahl für Daten ohne doppelte Einträge
Private Sub UserForm_Initialize()
Dim hsh As Object, i As Long
Const COL1 As Integer = 1    'Spalte A
Const COL2 As Integer = 2    'Spalte B
Const COL3 As Integer = 3     ' Spalte C
Set hsh = CreateObject("Scripting.Dictionary")
With Sheets("ListBox")
For i = 2 To .Cells(.Rows.Count, COL1).End(xlUp).Row
hsh(.Cells(i, COL1).Text) = 0
Next
Me.ComboBox1.List = Application.Transpose(hsh.Keys)
hsh.RemoveAll
For i = 2 To .Cells(.Rows.Count, COL2).End(xlUp).Row   'COL2 = Spale B
hsh(.Cells(i, COL2).Text) = 0
Next
Me.ComboBox2.List = Application.Transpose(hsh.Keys)
hsh.RemoveAll
For i = 2 To .Cells(.Rows.Count, COL3).End(xlUp).Row   'COL3 = Spalte C
hsh(.Cells(i, COL3).Text) = 0        ' wenn weiter gewünscht ab hier code kopieren  _
und ändern
Next
Me.ComboBox3.List = Application.Transpose(hsh.Keys)
End With
End Sub

Private Sub Schließen_Click()
Unload Me
End Sub

Private Sub TextBox1_Change()
End Sub

Und jetzt kommt der Fehler bzw. wird gelb markiert dass das hier nicht stimmt
.Cells(i, j + 1) = Me.Controls("TextBox" & j)
Wo liegt der Fehler? Weißt du des vielleicht?
Gruß Amina
Anzeige
AW: Code funktioniert nicht mehr...
14.02.2010 06:51:44
Christian
Moin,
hast du evt eine oder mehrere der 32 Textboxen umbenannt oder gelöscht?
Wenn ja, dann kann der Part

For j = 1 To 32
.Cells(i, j + 1) = Me.Controls("TextBox" & j)
Next
ja nicht mehr laufen.
Gruß
Christian
AW: funktioniert wieder
14.02.2010 08:56:26
amintire
Hallo Christian,
danke für die Info :)
Gruß Amina :)
Hilfe... ich schaffe es einfach nicht...
15.02.2010 18:45:50
amintire
Hallo Christian...
ich hab jetzt 9 ComboBoxen. Hab den Code nun so umgebaut nur leider kommen die Eingaben nicht in die entsprechenenden Zellen... Was mach ich falsch?
Option Explicit
Private Sub Speichern_Click()
Dim i As Long, j As Long
With Sheets("Liste Mitarbeiter")
i = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(i, 1) = Me.ComboBox1
i = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
.Cells(i, 2) = Me.ComboBox2
i = .Cells(.Rows.Count, 3).End(xlUp).Row + 1
.Cells(i, 3) = Me.ComboBox3
i = .Cells(.Rows.Count, 4).End(xlUp).Row + 1
.Cells(i, 4) = Me.ComboBox4
i = .Cells(.Rows.Count, 5).End(xlUp).Row + 1
.Cells(i, 5) = Me.ComboBox5
i = .Cells(.Rows.Count, 21).End(xlUp).Row + 1
.Cells(i, 20) = Me.ComboBox8
i = .Cells(.Rows.Count, 21).End(xlUp).Row + 1
.Cells(i, 21) = Me.ComboBox9
For j = 1 To 24
.Cells(i, j + 5) = Me.Controls("TextBox" & j)
Next
.Cells(i, 1).Resize(, 33).Borders.LineStyle = 1
.Cells(i, 1).Resize(, 33).Borders.Weight = 1
With Sheets("Liste Mitarbeiter")
i = .Cells(.Rows.Count, 10).End(xlUp).Row + 1
.Cells(i, 10) = Me.ComboBox6
i = .Cells(.Rows.Count, 11).End(xlUp).Row + 1
.Cells(i, 11) = Me.ComboBox7
End With
End With
If ComboBox2 = "" Then
MsgBox ("Bitte Namen eingeben")
ComboBox2.SetFocus
End If
ActiveCell.Offset(1, 0).Range("A1").Select
Application.ScreenUpdating = True
Unload Me
End Sub
'Combobox Auswahl für Daten ohne doppelte Einträge

Private Sub UserForm_Initialize()
'ComboBoxes füllen ohne doppelte Einträge
'Annahme: alle Spalten haben die gleiche Anzahl von Einträgen
'Annahme: die Werte aus Spalte A, B und F sollen in ComboBox1, 2, und 3 eingelesen  _
werden:
Dim hsh1 As Object, hsh2 As Object, hsh3 As Object, hsh4 As Object, hsh5 As Object,  _
hsh6 As Object, hsh7 As Object, hsh8 As Object, hsh9 As Object
Dim i As Long, lngLR As Long
Set hsh1 = CreateObject("Scripting.Dictionary")
Set hsh2 = CreateObject("Scripting.Dictionary")
Set hsh3 = CreateObject("Scripting.Dictionary")
Set hsh4 = CreateObject("Scripting.Dictionary")
Set hsh5 = CreateObject("Scripting.Dictionary")
Set hsh6 = CreateObject("Scripting.Dictionary")
Set hsh7 = CreateObject("Scripting.Dictionary")
Set hsh8 = CreateObject("Scripting.Dictionary")
Set hsh9 = CreateObject("Scripting.Dictionary")
With Sheets("Liste Mitarbeiter")
For i = 5 To .Cells(.Rows.Count, 1).End(xlUp).Row   'letzte Zeile in Spalte A
hsh1(.Cells(i, 1).Text) = 0                      '1 = Spalte A
hsh2(.Cells(i, 2).Text) = 0                      '2 = Spalte B
hsh3(.Cells(i, 3).Text) = 0                      '6 = Spalte F
hsh4(.Cells(i, 4).Text) = 0                      '1 = Spalte A
hsh5(.Cells(i, 5).Text) = 0                      '2 = Spalte B
hsh6(.Cells(i, 10).Text) = 0                      '6 = Spalte F
hsh7(.Cells(i, 11).Text) = 0                      '1 = Spalte A
hsh8(.Cells(i, 20).Text) = 0                      '2 = Spalte B
hsh9(.Cells(i, 21).Text) = 0                      '6 = Spalte F
Next
End With
Me.ComboBox1.List = Application.Transpose(hsh1.Keys)
Me.ComboBox2.List = Application.Transpose(hsh2.Keys)
Me.ComboBox3.List = Application.Transpose(hsh3.Keys)
Me.ComboBox4.List = Application.Transpose(hsh4.Keys)
Me.ComboBox5.List = Application.Transpose(hsh5.Keys)
Me.ComboBox6.List = Application.Transpose(hsh6.Keys)
Me.ComboBox7.List = Application.Transpose(hsh7.Keys)
Me.ComboBox8.List = Application.Transpose(hsh8.Keys)
Me.ComboBox9.List = Application.Transpose(hsh9.Keys)
Set hsh1 = Nothing
Set hsh2 = Nothing
Set hsh3 = Nothing
Set hsh4 = Nothing
Set hsh5 = Nothing
Set hsh6 = Nothing
Set hsh7 = Nothing
Set hsh8 = Nothing
Set hsh9 = Nothing
End Sub
Private Sub Schließen_Click()
Unload Me
End Sub

Hoffe du kannst mir helfen...
Gruß Amina
Anzeige
AW: Hilfe... ich schaffe es einfach nicht...
16.02.2010 13:08:44
Christian
Hallo Amina,
na gut... ein leztes Mal.
Auf Basis von dem Thread:
https://www.herber.de/forum/archiv/1136to1140/t1138422.htm#1138735
Hier hast du ja jetzt Tags vergeben.
Ich nehme an, die Einträge für die 9 ComboBoxes stehen Tabelle "ListBox" in den Spalten 1 bis 9.
Dann zB so.

Option Explicit
Private Sub Speichern_Click()
Dim cntr As Control, lngRow As Long
If Me.ComboBox2 = "" Then
MsgBox ("Bitte Namen eingeben")
Me.ComboBox2.SetFocus
Exit Sub
End If
With Sheets("Liste Mitarbeiter")
If .Cells(.Rows.Count, 2)  "" Then
MsgBox "letzte Zeile belegt", 16
Exit Sub
End If
lngRow = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
'Werte in Tabelle schreiben
For Each cntr In Me.Controls
If cntr.Tag  "" Then
.Range(cntr.Tag & lngRow) = cntr.Value
End If
Next
'Rahmen
.Cells(lngRow, 1).Resize(, 33).Borders.LineStyle = 1
.Cells(lngRow, 1).Resize(, 33).Borders.Weight = 1
End With
'Unload Me
End Sub
Private Sub UserForm_Initialize()
Dim hsh As Object, lngRow As Long, intCol As Integer
'Comboboxes füllen ohne doppelte Einträge
Set hsh = CreateObject("Scripting.Dictionary")
With Sheets("ListBox")
'9 ComboBoxes - Werte aus Spalte 1 bis 9
For intCol = 1 To 9
For lngRow = 2 To .Cells(.Rows.Count, intCol).End(xlUp).Row
hsh(.Cells(lngRow, intCol).Text) = 0
Next
Me.Controls("ComboBox" & intCol).List = Application.Transpose(hsh.Keys)
hsh.RemoveAll
Next
End With
Set hsh = Nothing
End Sub
Private Sub Schließen_Click()
Unload Me
End Sub

Gruß
Christian
Anzeige
AW: Hilfe... ich schaffe es einfach nicht...
16.02.2010 21:07:48
amintire
Hallo Christian,
ich wollte zwei Möglichkeiten ausprobieren. Entweder den Code von Hajo, der leider fehlerhaft ist oder deinen ersten Vorschlag der eigentlich schon eher passt auch weil ich den Rahmen benötige, aber der wie gesagt auch nicht mehr funktioniert.
Wenn ich deinen jetzigen Code hernehme sagt er mir Variable nicht definiert und bringt mir
Sub Adressen_Eingeben()
Eingabefrm.Show
End Sub
dass als Fehlermeldung. Obwohl eben die UserForm so heißt...
Hab ehrlich gesagt keinen Plan mehr...
Gruß Amina
AW: Hilfe... ich schaffe es einfach nicht...
17.02.2010 09:51:54
Christian
es wär ja nicht so schwer gewesen - einfach deinen jetzigen Code komplett löschen und den von mir geposteten einfügen, starten und glücklich sein.
ich hab das schon mal vorbereitet....
https://www.herber.de/bbs/user/68057.xls
Für alles Weitere empfehle ich, erst mal bei den Basics zu beginnen...
Christian
AW: Combobox ohne doppelte
13.02.2010 12:58:40
Gerd
Hallo Amina,
das Dictionary hat die Eigenschaft, dass es bei gleichem Key [.cells(i, 1).Text] keinen neuen Key anlegt, sondern lediglich den Item-Wert [0] überschreibt.
Gruß Gerd
AW: Combobox ohne doppelte
13.02.2010 12:48:01
Hajo_Zi
Hallo Christian,
das war nur eine kurzfristige Sache. Mein Provider hat die Erreichbarkeit der HP eingeschränkt und ich hatte versucht es über einen anderen Weg zu lösen. Das hatte aber zur Folge das die Links nicht mehr gehen. Habe ich jetzt wieder zurückgestellt. Es müßte alles wieder gehen.
Gruß Hajo
Dein Level stimmt-VBA-gut ?
13.02.2010 12:52:30
robert
hi,
da müsstest du die spalte selbst ermitteln können.
ein bisschen nachdenken, dadurch lernt man ja auch :-)
gruß
riobert
AW: Dein Level stimmt-VBA-gut ?
13.02.2010 12:59:20
amintire
Hallo Robert,
danke für die nette Information - man lernt immer dazu wenn man weiß was für was steht.
Gruß Amina
na und hast du es gefunden :-) ?
13.02.2010 13:17:54
robert

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige