# VBA ! Combobox



## KingOfMetropole (11. Februar 2005)

Hallo

ich habe folgendes Problem:

  oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Pfad & ";Persist Security Info=False"
     strSQL = "SELECT FKurz & FName & FStraße & FPLZ & FOrt FROM Adressdatenbank"

diesen inhalt zeigt er in der ComboBox an ! ist es möglich sich auf FKurz zu beschränken aber er trotzdem alle ausliest ? ( Ich möchte also nur FKurz angezeigt bekommen )

Vielen Dank im voraus


----------



## KingOfMetropole (14. Februar 2005)

hat keiner einen Ratschlag ?


----------



## M4st3r (14. Februar 2005)

Ich versteh das Problem nicht! Was zeigt er an? Wie lässt du es in der Combo anzeigen?


----------



## KingOfMetropole (14. Februar 2005)

oke ich probiere das mal genauer zu erläutern:


```
Private Sub UserForm_Activate()
'Variablen deklarieren
  Dim oConn As ADODB.Connection
  Dim oRS As ADODB.Recordset
  Dim x As Variant
  Dim y() As Variant
'Verbindung zur Datenbank wird aufgebaut
  Set oConn = CreateObject("ADODB.Connection")
  oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Pfad & _
  ";Persist Security Info=False"
'Füllen des Recordsets
	 strSQL = "SELECT FName FROM Adressdatenbank order by FName"
  Set oRS = oConn.Execute(strSQL)
  x = oRS.GetRows()
  If IsArray(x) Then
	ReDim y(UBound(x, 2))
	For i = 0 To UBound(x, 2)
	  y(i) = x(0, i)
	Next i
'Ausgabe des Recordsets in eine ComboBox
	ComboBox1.List = y()
  End If
'Verbindungsabbau
  Set oConn = Nothing
  Set oRS = Nothing
End Sub
```
 
Also bisher lesen wir dadurch nur die Spalte "FName" aus. Allerdings wollen wir noch die Adressspalten auslesen. Ist es möglich diese gleichzeitig mit auszulesen, aber in der ComboBox zu verstecken. ?

Also soll in der Combobox nur der Name stehen und sich daraus in dem Feld die Adresse der Firma komplett wiederspiegeln 

Hier ein Ausschnitt wie es bisher aussieht:


```
'Text wird aus ComboBox1 in das TextFeld2 übernommen
Private Sub ComboBox1_Click()
TextBox2.Text = ComboBox1.Value
End Sub
'Anzeigen der Adressdaten der Firma in TextFeld2
Private Sub TextBox2_Change()
Me.TextBox2 = "FName" & vbCrLf & "FStraße" & vbCrLf & "FPLZ" & vbCrLf & "FOrt"
End Sub
Private Sub UserForm_Activate()
'Variablen deklarieren
  Dim oConn As ADODB.Connection
  Dim oRS As ADODB.Recordset
  Dim x As Variant
  Dim y() As Variant
'Verbindung zur Datenbank wird aufgebaut
  Set oConn = CreateObject("ADODB.Connection")
  oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Pfad & _
  ";Persist Security Info=False"
'Füllen des Recordsets
	 strSQL = "SELECT FName FROM Adressdatenbank order by FName"
  Set oRS = oConn.Execute(strSQL)
  x = oRS.GetRows()
  If IsArray(x) Then
	ReDim y(UBound(x, 2))
	For i = 0 To UBound(x, 2)
	  y(i) = x(0, i)
	Next i
'Ausgabe des Recordsets in eine ComboBox
	ComboBox1.List = y()
  End If
'Verbindungsabbau
  Set oConn = Nothing
  Set oRS = Nothing
End Sub
```


----------



## M4st3r (14. Februar 2005)

Schonmal versucht das Recordset mit ner While-Schleife zu durchlaufen und die Combo so zu füllen:


```
oRS.MoveFirst
   Do While Not oRS.EOF
 	Combo1.AddItem oRS.Fields("Feldname").Value
 	oRS.MoveNext
   Wend
```


----------



## KingOfMetropole (14. Februar 2005)

joa  ist bestimmt ein guter Ansatz aber wo genau im Code gehört das hin ? )

sind halt noch net so fit in VBA *g*

aber danke schonmal


----------



## M4st3r (14. Februar 2005)

Statt


```
x = oRS.GetRows()
      If IsArray(x) Then
   	ReDim y(UBound(x, 2))
   	For i = 0 To UBound(x, 2)
   	  y(i) = x(0, i)
   	 Next i
   end if
```
 
   mal 


```
oRS.MoveFirst
     While Not oRS.EOF
   	Combo1.AddItem oRS.Fields("Feldname").Value
   	oRS.MoveNext
     Wend
```
 
  versuchen - nur noch Combo1 gegen den Namen deiner Combo austauschen


----------



## KingOfMetropole (14. Februar 2005)

Sorry aber es wird dann beim Kompilieren eine Fehlermeldung angezeigt:

"Wend ohne While"

Woran kann das liegen?


----------



## M4st3r (14. Februar 2005)

Oh, Sorry, das "*DO*" vor dem "*WHILE*" muss weg...


----------



## KingOfMetropole (14. Februar 2005)

mhhh gut also die combobox wird jetzt auch weiterhin mit den Daten gefüllt. 
nur wie bekommen wir jetzt in der untersten textbox die anderen daten zu der dazugehörigen firma angezeigt ?


----------



## M4st3r (14. Februar 2005)

Indem du im Click-Event der Textbox eine neue Abfrage auf FName machst und die ermittelten Daten in das Textfeld einfügst!


----------



## KingOfMetropole (14. Februar 2005)

sorry sind wir gerade total mit überfordert *g*

click_event bei der textbox ?


```
'Text wird aus ComboBox1 in das TextFeld2 übernommen
Private Sub ComboBox1_Click()
TextBox2.Text = ComboBox1.Value
End Sub
'Anzeigen der Adressdaten der Firma in TextFeld2
Private Sub TextBox2_Change()
Me.TextBox2 = "FName" & vbCrLf & "FStraße" & vbCrLf & "FPLZ" & vbCrLf & "FOrt"
End Sub
```
 
das haben wir bisher.... aber funktioniert nicht wirklich


----------



## M4st3r (14. Februar 2005)

Wenn sich das Textfeld bei der Änderung der Combp ändern soll dann muss der Combo_Click Event das verarbeiten. In dem steht dann eine SQL die die entsprechenden Daten aus der Datenbank holt. dann kannst du wieder über *oRS.field("Feldname").value* die entsprechenden Daten in das Textfeld einfügen


----------



## MareikeRemmel (18. Februar 2005)

Ich habe eine Idee wie man es in VB6 machen könnte, keine Ahnung ob es auch mit VBA geht. Schau einmal ob es die Eigenschaft "Tag" gibt.
Dann könntest du die Daten, welche in der Combobox nicht angezeigt werden sollen in dem Tag der Combobox speicher.
Z.B. so:
combo1.Tag=Starße|Ort|PLZ
Und dann könntest du dir die Datenbankabfrage bei jedem Klick sparen.


----------



## thekorn (18. Februar 2005)

Naja, einfach die Daten in ein 2-dimensionales Array (Datenfeld) einlesen:

```
oRS.MoveFirst
    i = 0
    While Not oRS.EOF
        daten(i, 0) = oRS.Fields("Feldname0").Value
        daten(i, 1) = oRS.Fields("Feldname1").Value
        daten(i, 2) = oRS.Fields("Feldname2").Value
        daten(i, 3) = oRS.Fields("Feldname3").Value
        Combo1.AddItem daten(i, 0)
        oRS.MoveNext
    Wend
```

Wird nun die Auswahl im Combofeld geändert, so kann man über ".ListIndex" den aktiven Eintrag auslesen:

```
Private Sub ComboBox1_Change()
TextBox2.Text = daten(ComboBox1.ListIndex, 1) & vbCrLf & daten(ComboBox1.ListIndex, 2) & vbCrLf & daten(ComboBox1.ListIndex, 3) & vbCrLf & daten(ComboBox1.ListIndex, 4)
End Sub
```

(Es gibt evtl. einen Fehler wenn nichts ausgewählt wird, ".ListIndex" ist dann -1)

So sollte es relativ einfach gehen.

gruß
thekorn


----------

