Schleifen Bildung in Access 2003 VBA

Hallo Forum,

ich arbeite gerade an einem Projekt, dieses Projekt soll ich in Access 2003 also VBA gemacht werden,
ich bin ein VBA Einsteiger, daher brauche ich eure Hilfe:
Ich habe Folgende Tabellen:

Tabelle Haupt:
Term
Status

Tabelle Test:
MATNR
MAKTX

Tabellen sind verbindungslos

Meine Aufgabe ist es, mit mehreren Schleifen die Spalten „MAKTX“ und „Term“ zu vergleichen,
und die Ergebnisse in einer neuen Spalte ausgeben.
Kurz gefasst ich muss einen String-Vergleicher machen.
Wobei nur die Strings von Term sollen in der neuen Tabelle ausgegeben werden, hier können auch mehrere Werte zu einen Ergebnis passen, ideal wäre diese Werte mit ein „ ; “ zu trennen.

Ziel:

Tabelle Test:
MATNR
MAKTK: Siederohrbogen 5d90 108,0, Siederohrbogen 5d90 108,0
Term (DE):Siederohrbogen ; 5d90 ; 108,0;
Siederohrbogen ; 7d91 ; 110,0 usw.
Status

Genau hier habe ich meine Probleme, da mir noch VBA Kenntnisse fehlen.
Ich wollte fragen, ob jemand helfen könnte oder mir Tipps geben könnte, wie ich das lösen kann.

Hier ist mein Coding, den ich bis jetzt gemacht habe, da sind paar Fehler drin, mir geht es vor allem um die Schleife und der Spalte Erzeugung:

_Option Compare Database
Option Explicit

Sub Test()

Dim db As Database
Dim rs_Test As Recordset
Dim rs_Haupt As Recordset
Dim strHaupt As String
Dim strTest As String
Dim A As String
'Erzeugen einer neuen Spalte
Dim neueSpalte As TableDef
'Spalte „Status“ von Haupt in Test verschieben
Dim status As DAO.TableDef

Set db = CurrentDb()

'Erzeugen der Spalte für die Ergebnisse der Schleife
Set neueSpalte = db.TableDefs(„Test“)
With neueSpalte
.Fields.Append .CreateField(„Term (DE)“, dbText, 20)
.Fields.Refresh
End With
Set neueSpalte = Nothing

'Spalte „Satus“ von Tabelle Haupt in Tabelle Test verschieben
'Fehlt

Set rs_Test = db.OpenRecordset(„tblTest“, dbOpenDynaset)
Set rs_Haupt = db.OpenRecordset(„tblHaupt“, dbOpenDynaset)

A = rs_Test!MAKTX.Value

'Beginn der Schleife
Do A

rs_Test.MoveFirst
rs_Haupt.FindFirst A

If rs_Test!MAKTX.Value = rs_Haupt![Term (DE)].Value Then

End If

Loop Until rs_Haupt.EOF = True
'Ende Schleife

End Sub_

ich arbeite gerade an einem Projekt, dieses Projekt soll ich
in Access 2003 also VBA gemacht werden,
ich bin ein VBA Einsteiger, daher brauche ich eure Hilfe:

Hallo Arpait,

benutze bitte nicht den I-Tag sondern den Pre-Tag, dann sieht der Code aus wie nachstehend.

Access-Vba kann ich nicht. Ich sehe nur du hast da eine If-Schleife in der nichts steht.
Was m.E falsch ist, ist diese zeile
Do A

Entweder nur „Do“ oder „Do Until“ oder „Do While“ *glaub*
Aber das müßte dir doch der Editor singanlisieren, *hmmh*.

Ich an deiner Stelle würde mal im Internet suchen nach diesen Suchwörtern:

+Access +Recordset +TableDef +.Fields.Append

Denn Treffer mit ähnlicher programmierlogik/Aufgabe müßte ja diese Suchwörter in sich haben.

Oder such halte so

+Access +vba +neue +spalte +einfügen +recordset

Halt nach den Wörtern die andere Leute die das Gleiche wie du vorhatten ihre Anfragen genannt haben könnten. Wenn du zu diesen Suichwörtern noch wie gezeigt Codewörter mit dazunimmst die auch in den dir unbekannten Codes sein müßen fallen die Treffer raus wo beschrieben wird wie man das Problem manuell lösen könnte.

Gruß
Reinhard

Option Compare Database
Option Explicit

Sub Test()
Dim db As Database
Dim rs\_Test As Recordset
Dim rs\_Haupt As Recordset
Dim strHaupt As String
Dim strTest As String
Dim A As String
'Erzeugen einer neuen Spalte
Dim neueSpalte As TableDef
'Spalte "Status" von Haupt in Test verschieben
Dim status As DAO.TableDef
Set db = CurrentDb()
'Erzeugen der Spalte für die Ergebnisse der Schleife
Set neueSpalte = db.TableDefs("Test")
With neueSpalte
 .Fields.Append .CreateField("Term (DE)", dbText, 20)
 .Fields.Refresh
End With
Set neueSpalte = Nothing
'Spalte "Satus" von Tabelle Haupt in Tabelle Test verschieben
'Fehlt
Set rs\_Test = db.OpenRecordset("tblTest", dbOpenDynaset)
Set rs\_Haupt = db.OpenRecordset("tblHaupt", dbOpenDynaset)
A = rs\_Test!MAKTX.Value
'Beginn der Schleife
Do A
 rs\_Test.MoveFirst
 rs\_Haupt.FindFirst A
 If rs\_Test!MAKTX.Value = rs\_Haupt![Term (DE)].Value Then
 End If
Loop Until rs\_Haupt.EOF = True
'Ende Schleife
End Sub

Fehlersuche
Moin, arpait,

Hier ist mein Coding, den ich bis jetzt gemacht habe

fremder Leute Coding liest man nicht gern :frowning:

da sind paar Fehler drin

Das ist nicht auszuschließen, so allerdings nicht hilfreich. Schreib bitte, was geht und was nicht geht, ob evtl. eine Fehlermeldung erscheint, dann kann man gezielt draufschauen.

Vorab empfehle ich, den Code im Einzelschritt (F8) zu durchlaufen und die Variablen zu prüfen, da kommt so manches zutage.

Gruß Ralf

Hallo,

ich arbeite gerade an einem Projekt, dieses Projekt soll ich
in Access 2003 also VBA gemacht werden,
ich bin ein VBA Einsteiger, daher brauche ich eure Hilfe:
Ich habe Folgende Tabellen:

Tabelle Haupt:
Term
Status

Tabelle Test:
MATNR
MAKTX

Tabellen sind verbindungslos

tatsächlich?

Meine Aufgabe ist es, mit mehreren Schleifen die Spalten
„MAKTX“ und „Term“ zu vergleichen,

hier gibt es doch dann einen Verbindung…

und die Ergebnisse in einer neuen Spalte ausgeben.

ist fraglich, wenn Deine Beschreibung der Situation vollständig ist.

Kurz gefasst ich muss einen String-Vergleicher machen.
Wobei nur die Strings von Term sollen in der neuen Tabelle
ausgegeben werden, hier können auch mehrere Werte zu einen
Ergebnis passen, ideal wäre diese Werte mit ein „ ; “ zu
trennen.

Verschiedene Werte in EINEM Feld mit „;“ zu trennen, ist db-technisch ein Irrweg. Solche „Listen“ sind in Folge nur sehr schwierig zu behandeln, allenfalls für Anzeige- oder Export/Importzwecke zu verwenden.

Ziel:

Tabelle Test:
MATNR
MAKTK: Siederohrbogen 5d90 108,0, Siederohrbogen 5d90 108,0
Term (DE):Siederohrbogen ; 5d90 ; 108,0;
Siederohrbogen ; 7d91 ; 110,0 usw.
Status

Hier fehlt mir noch die Kenntniss über den GENAUEN Feldinhalt von „MATKTK“ (reden wir hier von SAP-Export-Dateien?) und von „Term“

(Ich schätze jetzt mal, dass in „Term“ jeweils lediglich einer(!) von den Teil-Strings steht, die in „MATKTK“ mit durch „;“ getrennt aufgelistet sind.)

Genau hier habe ich meine Probleme, da mir noch VBA Kenntnisse
fehlen.
Ich wollte fragen, ob jemand helfen könnte oder mir Tipps
geben könnte, wie ich das lösen kann.

Können wir, aber wir brauchen erst noch die genaue Beschreibung der Feldinhalte und was mit dem Ergebnis der Aktion gemacht werden soll.

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo Franz,

vielen Dank, ich will nur ein String-Vergleicher (Zeichenketten Vergleicher) machen, da spielt SAP keine Rolle.
Die Namen der Tabellen wurden leider von meinen Lehrer bestimmt.

Ich habe die Tabelle „Haupt“ und Tabelle „Test“,
ich will einfach per VBA-Code ein Vergleich zwischen den Feldern „Term“ und „MAKTX“ machen ohne SQL, da die Tabellen Verbindunglos sind, wenn es geht.

Felddatentyp ist für alle Text

Beispiel:

Tabelle „Haupt“: Schraubenzieher 389, Düsen + Schrauben usw.
Tabelle „Test“: Schraubenzieher, Düsen , Schrauben usw.

Ziel:

Tabelle „Haupt“: Schraubenzieher 389 Tabelle „Term(DE)“: Schraubenzieher
Tabelle “Haupt “: Düsen + Schrauben „Tabelle Term (DE)“: Düsen; Schrauben

Term(DE) wurde in der Tabelle „Test“ erzeugt.
Das mit den „ ; “ war optional ein Leerzeichen geht auch.

Hallo,

vielen Dank, ich will nur ein String-Vergleicher
(Zeichenketten Vergleicher) machen, da spielt SAP keine Rolle.

ja, SAP spielt wirklich keine Rolle, ich hätte nur die Aufgabenstellung (Tabellenaufbau) besser verstanden als ich es jetzt immer noch tue…

Die Namen der Tabellen wurden leider von meinen Lehrer
bestimmt.

Jaja, immer die anderen… :wink: , die Namen der Tabellen sind ja aber auch unerheblich.

Ich habe die Tabelle „Haupt“ und Tabelle „Test“,
ich will einfach per VBA-Code ein Vergleich zwischen den
Feldern „Term“ und „MAKTX“ machen ohne SQL, da die Tabellen
Verbindunglos sind, wenn es geht.

Warum jetzt plötzlich „MAKTX“

Wenn Du einen „Vergleich“ machen willst, dann sind die Tabelle logisch NICHT verbindungslos… Es mag zwar keine (Tabellen-) Beziehung geben, aber das hindert ja nicht daran, einen Vergleich zwischen bestimmten (sinnvollen) Feldern durchzuführen.

Felddatentyp ist für alle Text
Beispiel:

Tabelle „Haupt“: Schraubenzieher 389, Düsen + Schrauben usw.
Tabelle „Test“: Schraubenzieher, Düsen , Schrauben usw.

Ziel:

Tabelle „Haupt“: Schraubenzieher 389 Tabelle „Term(DE)“:
Schraubenzieher
Tabelle “Haupt “: Düsen + Schrauben „Tabelle Term (DE)“:
Düsen; Schrauben

Sorry, aber diese chaotische Darstellung der Tabellen(inhalte) kann ich nicht lesen/verstehen… Und bevor ich das nicht kann und auch nicht genau weiß,welche Aktion bei Übereinstimmung zu erledigen ist, poste ich auch keinen Codevorschlag.

Wenn in „Term“ und „MATKTK“ jeweils IDENTISCHE Zeichenfolgen (Strings, Texte) drinstehen, dann liefert Dir die folgende Abfrage alle Datensätze aus Tabelle Haupt und Test, in denen der Inhalt von „Term“ und „MATKTK“ genau übereinstimmt:

Select Haupt.\*, Test.\* from Haupt inner Join Test on Haupt.Term = Test.MATKTK

Term(DE) wurde in der Tabelle „Test“ erzeugt.
Das mit den „ ; “ war optional ein Leerzeichen geht auch.

Für was ist „Term(DE)“ denn gut?
(btw: Sonder- und Leerzeichen haben in Feldnamen oder sonstigen Objektnamen NICHTS ZU SUCHEN.

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo,

wie gesagt, ich will ein String-Vergleichermachen.
Es sollen die Spalten „MAKTX“ und „TERM“ verglichen werden.
Die Ergebnisse sollen in einer dritten Spalte angezeigt werden.
Als Ergebnis meine ich nur die gleichen Werte, die in diesen Spalten vorkommen.
Datensätze Anzahl sind über 4000 für jede Spalten.

Ich habe schon ein bisschen Angefangen:

Dim rs_Test As Recordset
Dim rs_Haupt As Recordset

Dim A, B As String
Dim vergleich As String

Set rs_Test = db.OpenRecordset(„Test“, dbOpenTable)
Set rs_Haupt = db.OpenRecordset(„Haupt“, dbOpenTable)

vergleich = InStr(1, rs_Test!MAKTX.Value, rs_Haupt.Fields(„Term (DE)“))

Do While rs_Haupt.EOF

B = rs_Haupt.Fields(„MAKTX“)

If vergleich > 0 Then

Ergebnis in der dritten Spalte einfügen --> Fehlt

If vergleich = 0 Then

End If

Loop

Es geht mir vor allem um die Schleife

Viele Grüße
Arpait00

Hallo,

Dim rs_Test As Recordset
Dim rs_Haupt As Recordset
Dim A, B As String
Dim vergleich As String

'Dim und Set fehlen für db

Set rs_Test = db.OpenRecordset(„Test“, dbOpenTable)
Set rs_Haupt = db.OpenRecordset(„Haupt“, dbOpenTable)

'Gehört das nicht besser in die Schleife?
vergleich = InStr(1, rs_Test!MAKTX.Value, rs_Haupt.Fields(„Term (DE)“))

'Wie wäre es mit einem rs_Haupt.MoveFirst, damit man einen definierten Anfangspunkt hat?

Do While rs_Haupt.EOF

'Oder meintest Du Do Until rs_Haupt.EOF = True

B = rs_Haupt.Fields(„MAKTX“)
If vergleich > 0 Then
Ergebnis in der dritten Spalte einfügen --> Fehlt
If vergleich = 0 Then
End If
'Ohne ein rs_Haupt.MoveNext ist ein Loop ziemlich uneffektiv.
Loop

Es geht mir vor allem um die Schleife

Soll denn jeder Wert aus Haupt![Term(DE)] mit jedem Wert aus Test![MAKTX] verglichen werden? Oder jeweils die Werte aus der jeweiligen ersten zweiten, dritten, … Zeile?
Sollen die Werte identisch sein oder reicht eine teilweise Übereinstimmung aus?

MfG,

ujk

Hallo,

Dim rs_Test As Recordset
Dim rs_Haupt As Recordset
Dim A, B As String
Dim vergleich As String

'Dim und Set fehlen für db

Um ein bisschen Platz zu sparen habe für db Dim und Set weggelassen.

Set rs_Test = db.OpenRecordset(„Test“, dbOpenTable)
Set rs_Haupt = db.OpenRecordset(„Haupt“, dbOpenTable)

'Gehört das nicht besser in die Schleife?

Da hast du recht, aber wie ?

vergleich = InStr(1, rs_Test!MAKTX.Value,
rs_Haupt.Fields(„Term (DE)“))

'Wie wäre es mit einem rs_Haupt.MoveFirst, damit man einen
definierten Anfangspunkt hat?

Wäre sogar besser mit rs_Haupt.MoveFirst zu beginnen.

Kommt das vor der Schleife?

Do While rs_Haupt.EOF

'Oder meintest Du Do Until rs_Haupt.EOF = True

B = rs_Haupt.Fields(„MAKTX“)
If vergleich > 0 Then
Ergebnis in der dritten Spalte einfügen --> Fehlt
If vergleich = 0 Then
End If
'Ohne ein rs_Haupt.MoveNext ist ein Loop ziemlich uneffektiv.
Loop

Wenn ich MoveNext benutze, muss ich auch den MoveLast benutzen und wie soll das gehen?

Es geht mir vor allem um die Schleife

Soll denn jeder Wert aus Haupt![Term(DE)] mit jedem Wert aus
Test![MAKTX] verglichen werden? Oder jeweils die Werte aus der
jeweiligen ersten zweiten, dritten, … Zeile?
Sollen die Werte identisch sein oder reicht eine teilweise
Übereinstimmung aus?

jeder Wert aus Haupt![Term(DE)] mit jedem Wert aus Test![MAKTX] soll verglichen werden.
Eine teilweise Übereinstimmung würde reichen.

MfG,

ujk

Mit freundlichen Grüßen

arpait00

Hallo,

Um ein bisschen Platz zu sparen habe für db Dim und Set
weggelassen.

Das sollte eigentlich einen Fehler geben.

'Gehört das nicht besser in die Schleife?

Da hast du recht, aber wie ?

In den Bereich zwischen Do und Loop

Wäre sogar besser mit rs_Haupt.MoveFirst zu beginnen.

Kommt das vor der Schleife?

Ja, sonst wird in der Schleife jedesmal wieder auf den ersten datensatz gesprungen = Endlosschleife.

Wenn ich MoveNext benutze, muss ich auch den MoveLast benutzen
und wie soll das gehen?

Du must überhaupt nicht tun. Du solltest nur die Methoden anwenden, die die gewünschten Resultate bringen, also am Ende des Schleifendurchlaufs den nächsten Datensatz zum aktuellen machen.

jeder Wert aus Haupt![Term(DE)] mit jedem Wert aus
Test![MAKTX] soll verglichen werden.
Eine teilweise Übereinstimmung würde reichen.

Dann brauchst Du zwei verschachtelte Schleifen, eine äußere, die alle Datensätze von Haupt durchläuft und eine innere, die alle Werte von Test mit dem aktuellen von Haupt vergleicht. Das ist ein möglicher Lösungsansatz.

MfG,

ujk

Hallo,

habe noch ein kleines Problem, ich bekomme ein Fehler : Typfehler 13
bei
vergleich = InStr(CStr(rs_Test!MAKTX.Value), CStr(rs_Haupt![Term(DE)]), 1)

Warum ? Müsste eigentlich so stimmen

Option Compare Database
Option Explicit

Sub Sortieren()

Dim db As DAO.Database
Dim td As TableDef
Dim neueSpalte As TableDef

Set db = CurrentDb()

Set neueSpalte = db.TableDefs(„Test“)

'With neueSpalte
'.Fields.Append .CreateField(„Term (DE)“, dbText, 255)
'.Fields.Refresh
'End With

Dim rs_Test As Recordset
Dim rs_Haupt As Recordset
Dim rst As Recordset
Dim vergleich As String

Set rs_Test = db.OpenRecordset(„Test“, dbOpenTable)
Set rs_Haupt = db.OpenRecordset(„Haupt“, dbOpenTable)

Set rst = db.OpenRecordset(„Test“)

Do While Not rs_Test.EOF = True

Do While Not rs_Haupt.EOF = True

vergleich = InStr(CStr(rs_Test!MAKTX.Value), CStr(rs_Haupt![Term(DE)]), 1)

Debug.Print vergleich;

If vergleich > 0 Then
rs_Test.Edit
rs_Test![Term (DE)] = rs_Haupt![Term(DE)]
rs_Test.Update
End If

rs_Haupt.Move 1
rs_Haupt.MoveNext
Loop

rs_Haupt.MoveFirst
rs_Test.Move 1
rs_Test.MoveNext
Loop

rs_Test.Close
rs_Haupt.Close

End Sub

Hallo,

Dim vergleich As Long

Intensivere Benutzung der VBA-Hilfe ist angeraten… :wink:

Viele Grüße vom Bodensee
Franz, DF6GL

Vielen Dank für die Hilfe.

Mit freundlichen Grüßen
arpait00