Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Mehrfachauswahl aus Listenfeld in Tabelle übertragen

1,109 views
Skip to first unread message

M. Meister

unread,
Jul 17, 2002, 6:20:37 AM7/17/02
to
Hallo zusammen,

Situation:
-Formular mit Listenfeld mit Mehrfachauswahl
-an dieses Listenfeld ist ein Textfeld in einer Tabelle
gebunden.

Die Datenübergabe an das Feld in der Tabelle funktioniert
nur, wenn ich bei Mehrfachauswahl "Keine" eintrage. Wie
kann ich bei Mehrfachauswahl "Einzeln oder "Erweitert" die
Einträge an das Feld in der Tabelle übergeben? (Z. B.
hintereinander, mit Kommas getrennt: "Eintrag1, Eintrag3,
Eintrag7")

Vielen Dank

Michael Meister


Christa Kurschat

unread,
Jul 17, 2002, 6:35:27 AM7/17/02
to
Hallo Michael,
<Zitat>
"M. Meister" <michael...@bahn.de> schrieb im Newsbeitrag
news:101201c22d7b$980866f0$95e62ecf@tkmsftngxs02...
Hallo zusammen,

Vielen Dank

Michael Meister
</Zitat>

Du mußt alle selektierten Werte durchlaufen:

For Each varelement In Listenfeld.ItemsSelected
'hier kannst Du was Schlaues machen, z.B.
String = varelement & ", "
Next varelement
string = left(string,len(string)-1) ' letztes Komma raus

Gruß
Christa
--
Access-FAQ: http://www.donkarl.com
KnowHow.mdb: http://www.freeaccess.de
SQL-Server-FAQ: http://www.berndjungbluth.de/sqlfaq/sqlfaq.htm
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm


Michael Meister

unread,
Jul 17, 2002, 10:13:37 AM7/17/02
to
Hallo Christa,
vielen Dank erst mal.

>Du mußt alle selektierten Werte durchlaufen:
>
>For Each varelement In Listenfeld.ItemsSelected
>'hier kannst Du was Schlaues machen, z.B.
>String = varelement & ", "
>Next varelement
>string = left(string,len(string)-1) ' letztes Komma raus
>

Mit VBA hab ich leider kaum was am Hut. Ich habe mal
versucht deinen Codeschnipsel in das Beispiel aus der
Hilfe einzupassen (sh. am Ende). Diese Prozedur wird
ausgeführt, wenn das Listenfeld den Fokus verliert. Leider
funktioniert das nicht, die Zellen in der Tabelle bleiben
beharrlich leer...

Hat noch jemand einen Vorschlag?

Danke schon mal im Voraus
Michael

Private Sub Namen_LostFocus()
Dim frm As Form, ctl As Control
Dim varElement As Variant
Dim wert As String

Set frm = Forms!Formular2
Set ctl = frm!Namen
For Each varElement In ctl.ItemsSelected
wert = varElement & ", "
Debug.Print ctl.ItemData(varElement)
Next varElement
wert = Left(wert, Len(wert) - 1) ' letztes Komma raus

End Sub

Christa Kurschat

unread,
Jul 17, 2002, 10:56:01 AM7/17/02
to
Hallo Michael,
<Zitat>
"Michael Meister" <michael...@bahn.de> schrieb im Newsbeitrag
news:1936f01c22d9c$24da2760$9ae62ecf@tkmsftngxa02...

Hallo Christa,
vielen Dank erst mal.

>Du mußt alle selektierten Werte durchlaufen:
>
>For Each varelement In Listenfeld.ItemsSelected
>'hier kannst Du was Schlaues machen, z.B.
>String = varelement & ", "
>Next varelement
>string = left(string,len(string)-1) ' letztes Komma raus
>

Mit VBA hab ich leider kaum was am Hut. Ich habe mal
versucht deinen Codeschnipsel in das Beispiel aus der
Hilfe einzupassen (sh. am Ende). Diese Prozedur wird
ausgeführt, wenn das Listenfeld den Fokus verliert. Leider
funktioniert das nicht, die Zellen in der Tabelle bleiben
beharrlich leer...

Hat noch jemand einen Vorschlag?

Danke schon mal im Voraus
Michael

</Zitat>

Kommentare im Code.

>Private Sub Namen_LostFocus()
> Dim frm As Form, ctl As Control
> Dim varElement As Variant
> Dim wert As String
>
> Set frm = Forms!Formular2

deklarieren und Zuweisen des Forms kannst Du sparen, wenn Du im
Formular selber bist.

> Set ctl = frm!Namen
set ctl = me!namen


> For Each varElement In ctl.ItemsSelected
> wert = varElement & ", "
> Debug.Print ctl.ItemData(varElement)
> Next varElement
> wert = Left(wert, Len(wert) - 1) ' letztes Komma raus
>

'hier muß dem Tabellenfeld der Inhalt der Variablen Wert zugewiesen
werden
'1.Variante: Feld ist in der Datenherkunft des Forms enthalten
me!FeldinTabelle = wert

'2. Variante: Feld ist nicht in der Datenherkunft enthalten (Code
ungetestet)

Dim rs as dao.recordset
set rs = currentdb.openrecordset ("select * from DeineTabelle where
...") 'richtigen DS suchen
with rs
.movefirst
.edit
!DeinFeld = wert
.update
.close
set rs = nothing

>End Sub

Michael Meister

unread,
Jul 18, 2002, 3:03:33 AM7/18/02
to
Hallo Christa,

dein Code hat fast funktioniert, man musste nur noch den
alten Wert mit dem neuen verknüpfen (sh. Code am Ende).

Ein entscheidendes Problem habe ich dabei aber noch: In
der aktuellen Variante ist im Formular immer die letzte
getroffene Auswahl bei jedem Datensatz markiert und nicht
die in der Tabelle gespeicherte.
Wie bringt man dem Listenfeld nun bei, dass es für jeden
Datensatz die Daten aus der Tabelle holt und erst bei
Änderungen diese an die Tabelle zurückgibt?

Set ctl = Me!Namen


For Each varElement In ctl.ItemsSelected

wert = wert & "," & varElement 'alt plus neu
Debug.Print ctl.ItemData(varElement)
Next varElement
wert = Right(wert, Len(wert) - 1) ' erstes Komma raus

Christa Kurschat

unread,
Jul 18, 2002, 3:42:47 AM7/18/02
to
Hallo Michael,
<Zitat>
"Michael Meister" <michael...@bahn.de> schrieb im Newsbeitrag
news:197c801c22e29$3aadca00$9ae62ecf@tkmsftngxa02...
Hallo Christa,

dein Code hat fast funktioniert, man musste nur noch den
alten Wert mit dem neuen verknüpfen (sh. Code am Ende).

Ein entscheidendes Problem habe ich dabei aber noch: In
der aktuellen Variante ist im Formular immer die letzte
getroffene Auswahl bei jedem Datensatz markiert und nicht
die in der Tabelle gespeicherte.
Wie bringt man dem Listenfeld nun bei, dass es für jeden
Datensatz die Daten aus der Tabelle holt und erst bei
Änderungen diese an die Tabelle zurückgibt?

</Zitat>

Sind die Einträge füe alle Datensätze gleich und Du willst nur die
Auswahl aufheben? Dann:
Im Ereignis "Beim Anzeigen" des Formulars eintragen:
Me!DeinListenfeld.requery
Holt die Datenherkunft neu und hebt damit die Auswahl auf.

Mach den Code in des Ereignis "Nach Aktualisierung". Dann passiert
die Änderung nur, wenn tatsächlich was ausgewählt wurde. Die
Änderungen werden erst bei Datensatzwechsel in die Tabelle
geschrieben.

Michael Meister

unread,
Jul 18, 2002, 7:43:46 AM7/18/02
to
Liebe Christa,

das mit dem Aktualisieren funktioniert so nicht:

>-----Originalnachricht-----


>Sind die Einträge füe alle Datensätze gleich und Du
willst nur die
>Auswahl aufheben? Dann:
>Im Ereignis "Beim Anzeigen" des Formulars eintragen:
>Me!DeinListenfeld.requery
>Holt die Datenherkunft neu und hebt damit die Auswahl auf.

Nein; ich habe beim nächsten Datensatz immer die Auswahl
vom vorherigen. Ändere ich die Auswahl, werden die
Einträge in der Tabelle zwar gespeichert, aber nur die
jeweilige Nummer des Eintrags, nicht der Text des Eintrags.
So sieht der Eintrag in der Tabelle aus:
NamenTab ID
0 1
0,1 2
1,5 3
1,4 4
1,3,4 5
1,3,4,5 6
1,2,3,4,5 7
0,1,2,3,4,5 8
Kann es sein, dass er die Werte im Formular mit den Werten
im Listenfeld deshalb nicht aktualisieren kann, weil er
Zahlen speichert (s.o.), das Listenfeld aber nur Text
will??


>Mach den Code in des Ereignis "Nach Aktualisierung". Dann
passiert
>die Änderung nur, wenn tatsächlich was ausgewählt wurde.
Die
>Änderungen werden erst bei Datensatzwechsel in die Tabelle
>geschrieben.

Wenigstens das funktioniert.

Danke und Gruß
Michael

Zur Info mein Code:

Private Sub Form_AfterUpdate()

Me!Namen.Requery

End Sub

Private Sub Namen_AfterUpdate()

Dim ctl As Control
Dim varElement As Variant
Dim wert As Variant

Set ctl = Me!Namen
For Each varElement In ctl.ItemsSelected
wert = wert & "," & varElement 'alt plus neu
Debug.Print ctl.ItemData(varElement)
Next varElement
wert = Right(wert, Len(wert) - 1) ' erstes Komma raus

Me!NamenTab = wert

End Sub

Christa Kurschat

unread,
Jul 18, 2002, 8:26:01 AM7/18/02
to
Hallo Michael,
<Zitat>

"Michael Meister" <michael...@bahn.de> schrieb im Newsbeitrag

news:17adf01c22e50$5fe771a0$36ef2ecf@tkmsftngxa12...
Liebe Christa,

</Zitat>

hast Du ev. mehrere Spalten in Deinem Listenfeld? Dann kannst Du mit
Column(n) darauf zugreifen.
Beispiel:
In Deinem Listenfeld hast Du folgende Einträge:
1 Eintrag1
2 Eintrag2
3 Eintrag3

Ohne Angabe der Spalte nimmt er 1,2,3. Um die Werte aus der 2.
Spalte zu erhalten, mußt Du:
wert = wert & "," & varElement.column(1) 'alt plus neu
nehmen (die numerierung fängt bei 0 an - 0=1.Spalte, 1=2.Spalte).

Zum requery: Du hast es im AfterUpdate des Forms gemacht, ich meinte
bei OnCurrent.
Ansonsten mußt Du mal ein bißchen experimentieren.

0 new messages