Listenfeld zeilenweise vergleichen

Hallo,

ich habe in meinem Formular zwei listenfelder, lstNeu und lstAlt.
Die Listenfelder haben jeweils 2 Spalten, Gemarkung(Text) und Flur(Zahl).
Es gibt Datensätze, also Text und Zahl, in lstNeu die auch in lstAlt vorhanden sind.
Nun möchte ich alle neuen Datensätze die NICHT in lstAlt stehen in einem neuen Listenfeld, lsiDiff, anzeigen.

Beispiel

lstNeu lstAlt LstDiff
pohlitz 1 pohlitz 1 pohlitz 3
pohlitz 2 pohlitz 2
pohlitz 3

Kann mir diesbezüglich jemand weiterhelfen?
Habe auch schon angefangen ne Funktion zu schreiben, aber irgendwas funktioniert nicht.

Dim strALKGem, strGemGem, grp As String
Dim intALKFlur, intFlurFlur, intz As Integer
Dim ctllst As Control

Set ctllst = Me!lst_FlurAlt
strALKGem = Me![lst_FlurNeu].Column(0)
intALKFlur = Me![lst_FlurNeu].Column(1)
strGemGem = Me![lst_FlurAlt].Column(2)
intFlurFlur = Me![lst_FlurAlt].Column(4)

For intz = 0 To ctllst.ListCount - 1
If strALKGem And intALKFlur strGemGem And intFlurFlur Then
grp = strALKGem And intALKFlur
Me![lst_Diff].RowSource = grp
Me![lst_Diff].ColumnCount = 2
Me![lst_Diff].ColumnWidths = " 2cm; 1cm "
End If
Next intz

strALKGem And intALKFlur
Text Zahl
Wie kann ich beide Werte zusammenfassen und vergleichen?
Gibt es ein logisches UND?

Danek enrico

HAbe den Code ein wenig verändert.
Nun kommt ein fehler „Typen unverträglich“.

ich verknüpfe ja Text und Zahl zu einem String.
Wie kann ich diesen wieder trennen und in einem listenfeld in zwei spalten ausgeben?

Dim strALKGem, strGemGem, grp, lst1, lst2 As String
Dim intALKFlur, intFlurFlur, intz As Integer
Dim ctllst As Control
On Error GoTo myError

Set ctllst = Me!lst_FlurAlt
strALKGem = Me![lst_FlurNeu].Column(0)
intALKFlur = Me![lst_FlurNeu].Column(1)
strGemGem = Me![lst_FlurAlt].Column(2)
intFlurFlur = Me![lst_FlurAlt].Column(4)
lst1 = strALKGem And intALKFlur
lst2 = strGemGem And intFlurFlur
For intz = 0 To ctllst.ListCount - 1
If lst1 lst2 Then
grp = lst1
Me![lst_Diff].RowSource = grp
Me![lst_Diff].ColumnCount = 2
Me![lst_Diff].ColumnWidths = " 2cm; 1cm "
End If
Next intz

danke enrico

Hallo!

HAbe den Code ein wenig verändert.
Nun kommt ein fehler „Typen unverträglich“.

Grundsätzlich müssen Variablen in VBA einzeln definiert werden. Eine Mehrfachzuweisung eines Typs wie bspw. in Pascal ist nicht möglich.
Z.B. würde „Dim A,B,C as String“ die Variablen A und B mit dem Typ Variant definieren und nur C als String. Das kann bei der Wertezuweisung zu Problemen führen. In deinem Fall erscheint der Fehler aber, da du einen Wahrheitswert einer String-Variablen zuordnest (sh. nächste Frage).

ich verknüpfe ja Text und Zahl zu einem String.

nein, du verknüpfst nicht sondern Du nutzt die logische Operation AND die einen Wahrheitswert liefert sofern zwei Bedingungen gleichzeitig erfüllt sind (z.B. ergibt 1=1 And 1=2 --> wahr und 101 --> falsch). Um mehrere Textvariablen (beschränkt auch Zahlen) zu verbinden nutze „&“ als Verbinder (text=text1 & text2 oder text = text1 & cstr(zahl)).

Wie kann ich diesen wieder trennen und in einem listenfeld in
zwei spalten ausgeben?

Füge die Werte für die einzelnen Spalten mit einem Semikolon als Trennzeichen zusammen : lst1 = strALKGem & „;“ & intALKFlur
Wenn das Ausgabelistenfeld zweispaltig eingerichtet ist und die Eigenschaft Herkunftstyp im Formularentwurf bereits auf Wertliste eingestellt ist, werden bei Zuweisung über me![lst_diff].rowsource=grp die Werte automatisch getrennt. Aber bedenke, dass Du für jede neue Zeile die Werteliste fortsetzen musst (Me![lst_Diff].RowSource = Me![lst_Diff].RowSource &";" & grp), sonst wird die bestehende Zeile nur ersetzt…

Dim strALKGem, strGemGem, grp, lst1, lst2 As String
Dim intALKFlur, intFlurFlur, intz As Integer
Dim ctllst As Control
On Error GoTo myError

Set ctllst = Me!lst_FlurAlt
strALKGem = Me![lst_FlurNeu].Column(0)
intALKFlur = Me![lst_FlurNeu].Column(1)
strGemGem = Me![lst_FlurAlt].Column(2)
intFlurFlur = Me![lst_FlurAlt].Column(4)
lst1 = strALKGem And intALKFlur
lst2 = strGemGem And intFlurFlur
For intz = 0 To ctllst.ListCount - 1
If lst1 lst2 Then
grp = lst1
Me![lst_Diff].RowSource = grp
Me![lst_Diff].ColumnCount = 2
Me![lst_Diff].ColumnWidths = " 2cm; 1cm "
End If
Next intz

danke enrico

Übrigens wirst Du für einen vollständigen Vergleich die Zeilen beider Listenfelder in einer verschachtelte For-Next-Schleife durchgehen müssen.
So wie oben vergleichst Du nur einen Einzeleintrag mit allen Einträgen des anderen Feldes.

Hoffe die Hinweise helfen, um Deine Funktion fertig zu stellen.
Entschuldige evtl. Schreibfehler. Habe den Text mit „fixen Fingern“ im Blindflug getippt.

Gruß, tester!

HAllo tester,

danke dir für die tipps.
sind auf jeden fall hilfreich, auch wenn ich im moment das problem anders lösen konnte.
habe auch noch mehr ähnlicher aufgaben und kann dort die tipps benötigen danke.

habe mein problem mittels abfrage auf inkonsistenz lösen können.
danke nochmals
enrico

Hallo Tester,

ich verknüpfe ja Text und Zahl zu einem String.

nein, du verknüpfst nicht sondern Du nutzt die logische
Operation AND die einen Wahrheitswert liefert sofern zwei
Bedingungen gleichzeitig erfüllt sind (z.B. ergibt 1=1 And 1=2
–> wahr und 101 --> falsch).

Du hier muss ich dir korigieren :s
Die Vergleichung zweier Werte findet binaer statt.
Dies bedeutet
1 and 1 oder 1=1 -> True 00000001 and 00000001 = 00000001=1 (True)
1 and 2 oder 1=2 -> False 00000010 and 00000001 = 00000000=0 (False)

In DEM!!! Falle koenntest du auch den AND Operator verwenden.
Möchtest du aber zum Bsp. 3=1 prüfen, so geht des net mehr da 3 and 1 eine 1 liefert und somit True ist und nicht mehr False wie es sein muesste.

Fügen wir das alles nun zusammen kommen wir auf
00000001
and 00000001
and 00000010
and 00000001
= 00000000 -> 0 -> FALSE (Falsch)

Deine zweite Aussage, also 10>1 and 3>1 = false, die stimmt wiederrum da 101 = True . True AND False dagegen liefert wiederrum False :smile:

Gruß, tester!

Gruß Alex