Hallo,
ich habe eine Tabelle und ein Formular. Auf dem Formular
befinden sich Comboboxen welche werte aus z.B. Spalte A
einlesen sollen ! Beim DropDown sollen diese dann angezeigt werden.
Wie mache ich das, dass
a) dass die Überschrift der z.B. Spalte A nicht mit eingelesen wird
b) keine doppelten werten aufgelistet werden
Für a und b habe ich keine Lösung. Mein Ansatz war wie folgt :
Private Sub ComboBox1_DropButtonClick()
Dim Bereich
Bereich = Columns("A:A").Select
ComboBox1.ListRows = Bereich
End Sub
Danke
Gruß
Albe
ich habe neulich einen Excel-VBA-Kurs gegeben, wo genau dieses Problem zur
Sprache kam. Ich habe allerdings die Combo beim Laden des Formulars gefüllt
und nicht erst beim Dropdown.
Mit Deinem Bereich kommst Du nicht weit. Ich hab das so gemacht:
zuerst habe ich den Bereich ohne Überschrift auf ein neu eingefügtes
Tabellenblatt kopiert und mit Spezialfilter die Dubletten und die
Überschrift rausgeworfen.
Das Füllen ging dann so:
Sub DatenInForm()
Dim LetzteZeile, X As Integer
Range("a1").Select
LetzteZeile = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row - 1
ReDim strListenWert(LetzteZeile) As String
For X = 0 To LetzteZeile
Cells(X + 1, 1).Select
strListenWert(X) = Cells(X + 1, 1).Value
frmTest.cboListe.AddItem strListenWert(X)
Next
Sheets("Hilfstabelle").Delete 'brauchen wir nicht mehr
frmTest.Show
End Sub
Gruß
Susanne
"Beck, Alwin" <ungu...@ungueltig.invalid> schrieb im Newsbeitrag
news:%2370e9uU...@TK2MSFTNGP03.phx.gbl...
> ich habe eine Tabelle und ein Formular. Auf dem Formular
> befinden sich Comboboxen welche werte aus z.B. Spalte A
> einlesen sollen ! Beim DropDown sollen diese dann angezeigt werden.
Lies mal bitte
Andreas.
Am Thu, 26 Mar 2009 10:28:46 +0100 schrieb Susanne Senger:
> ich habe neulich einen Excel-VBA-Kurs gegeben, wo genau dieses Problem zur
> Sprache kam. Ich habe allerdings die Combo beim Laden des Formulars gefüllt
> und nicht erst beim Dropdown.
> Mit Deinem Bereich kommst Du nicht weit. Ich hab das so gemacht:
> zuerst habe ich den Bereich ohne Überschrift auf ein neu eingefügtes
> Tabellenblatt kopiert und mit Spezialfilter die Dubletten und die
> Überschrift rausgeworfen.
> Das Füllen ging dann so:
> Sub DatenInForm()
> Dim LetzteZeile, X As Integer
> Range("a1").Select
> LetzteZeile = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row - 1
> ReDim strListenWert(LetzteZeile) As String
> For X = 0 To LetzteZeile
> Cells(X + 1, 1).Select
> strListenWert(X) = Cells(X + 1, 1).Value
> frmTest.cboListe.AddItem strListenWert(X)
> Next
> Sheets("Hilfstabelle").Delete 'brauchen wir nicht mehr
> frmTest.Show
> End Sub
sei mir nicht böse, aber wenn du schon VBA-Kurse gibst, solltest du auch
ein Vorbild sein. Ein paar Anmerkungen zu deinem Code:
LetzteZeile ist als Variant deklariert, da fehlt die Angabe des Datentyps!
Was soll das Select dort? Range("a1").Select
Weches Blatt ist gemeint (vollständig referenzieren)? Range("a1").Select
Weches Blatt ist gemeint (vollständig referenzieren)? Cells(X + 1,
1).Select
Warum selektierst du auch dort?
Wo ist das Array strListenWert deklariert? Benötigst du den Inhalt in der
Kombobox UND zusätzlich noch im Array?
Wenn im Initialisierungsereignis der Userforn (UserForm_Initialize) die
Prozedur aufgerufen wird, ist frmTest.Show unnötig.
Du löschst dann auch noch das Blatt "Hilfstabelle", willst du dir beim
nächsten Anzeigen noch mal die ganze Arbeit machen?
Ungeachtet dessen sollte man die Sache anders anpacken. In einer Schleife
werden alle Zellen der Spalte 1 ab Zeile 2 durchlaufen, bis man am Ende
angekommen ist (leere Zelle). Wenn Leerzellen vorkommen dürfen, muss man
natürlich anders das Ende bestimmen.
Dann erzeugt man eine Collection und fügt den Zellinhalt oder etwas anderes
als Element ein. Ganz wichtig ist, dass als Schlüssel (Key) der Zellinhalt
benutzt wird. Vor dem Einfügen wird das Error-Objekt zurückgesetzt. Tritt
ein Fehler auf, weil der Zellinhalt schon einmal als Schlüssel benutzt
wurde, wird nichts in die Kombobox eingetragen. Ist die Fehlernummer Null,
kann man mit AddItem den Inhalt in die Kombobox kopieren. Zu beachten ist,
dass die Groß- und Kleinschreibung beim Verwenden von Schlüsseln nicht
beachtet wird.
Man könnte nun auch erst den Inhalt der Zellen in einem Array
zwischenspeichern und mit irgendeiner Sortierroutine sortieren, bevor man
den Kram in einer weiteren Schleife in die Kombobox überträgt.
Nachfolgend ein kleines Beispiel, wie so etwas aussehen könnte. Zum
Sortieren habe ich hier auf die Schnelle ein ListView-Control genommen, was
die Eigenschaft Sorted hat. Man kann dabei angeben, ob auf- oder absteigend
sortiert wird.
Private Sub FillKomboBox()
Dim objList As Object
Dim colUni As New Collection
Dim i As Long
Const lvwDescending = 1
Const lvwAscending = 0
On Error Resume Next
' Listbox laden
Set objList = CreateObject("MSComctlLib.ListViewCtrl")
objList.Sorted = True
objList.SortOrder = lvwAscending
With Worksheets("Tabelle2")
' Dummy-Listbox füllen
i = 2 ' 1. Zeile mit Daten
Do While .Cells(i, 1) <> "" ' 1= Spalte A
Err.Clear
colUni.Add .Cells(i, 1), "A" & .Cells(i, 1)
If Err.Number = 0 Then
' Nur einzigartige
objList.ListItems.Add , , .Cells(i, 1)
End If
i = i + 1
Loop
ComboBox1.Clear
' Listbox auslesen
For i = 1 To objList.ListItems.Count
ComboBox1.AddItem objList.ListItems(i)
Next
End With
End Sub
Private Sub UserForm_Initialize()
FillKomboBox
End Sub
Viele Grüße
Michael
--
http://michael-schwimmer.de
Masterclass Excel VBA ISBN-10: 3827325250
Das Excel-VBA Codebook ISBN-10: 3827324718
Microsoft Office Excel 2007-Programmierung ISBN-10: 3866454139