VBA Excel Kriterien im Abhängigkeit einer ID Spalt

Hallo,

ich versuche einen Wert in eine Spalte D zu schreiben wenn in der entsprechenden Zeile Spalten B oder C nicht leer sind. Aber der Spalte D soll nur dann ausgefüllt werden wenn das Kriterium für alle Vorkommnisse der Nummer in Spalte A erfüllt sind.
Ich weiss nicht wie ich diese letzte Bedingung umwandeln kann.

Dim rng As Range
For Each rng In Range(„D1:smiley:10“)
If Cells(rng.Row, 2).Value „“ Or Cells(rng.Row, 3).Value „“ Then
rng.Value = „ja“
End If

Kannst Du bitte folgenden Satz noch mal erklären? Ich weiß nicht was Du meinst.

Aber der Spalte D soll nur dann ausgefüllt werden wenn das Kriterium für alle Vorkommnisse der Nummer in Spalte A erfüllt sind.

Gruß Dirk

Hi,

ich verstehe das Kriterium für Spalte A nicht ganz, kannst du das nochmal näher erläutern?

Hi,

ich verstehe das Kriterium für Spalte A nicht ganz, kannst du
das nochmal näher erläutern?

Aber gerne:

Sagen wir in Spalte A werden gewisse Artikel gelistet, welche öfter auftreten können.

In Spalte D soll ein „JA“ erscheinen, wenn für alle Einträge des Artikels entweder in Spalte B oder in Spalte C Informationen stehen.

Hoffe es ist etwas klarer.

Hallo,
ich hab nicht ganz verstanden was in der Spalte A steht.
Ein Beispiel wäre vielleicht hilfreich.

Mit Gruß,
Christian

In A stehen Artikelnummern und Spalte D soll dann für einen Artikel „JA“ enthalten, wenn für jedes Vorkommen von dem Artikel das Kriterium aus B oder C erfüllt ist.

Hoffe es wird langsam Klarer…

Artikel1, B1"", C1="", ->> D"JA"
Artikel1, B2"", C2"", ->> D"JA"
Artikel1, B3="", C3"", -->> D"JA"

aber:

Artikel2, B4="",C4"", -->>D"nichts"
Artikel2, B5="",C5="", -->>D"nichts"

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo schibo,

ich verstehe Dein Problem nicht so ganz, darum mal ein erster Ansatz :

Du bewegst Dich hier in einem Bereich, der nennt sich boolsche Logik.
Du willst 3 Parameter auswerten die jeweils 1 oder 0 sind (oder eben ="" Oder ““) das sind also 8 Zustände und das sieht dann so aus :
A B C
0 0 0 =
0 0 1 =
0 1 0 =
0 1 1 =
1 0 0 =
1 0 1 =
1 1 0 =
1 1 1 =
Wenn Du Deine Bedingungen erstellst schreib erst mal A B C so auf, wie Du es haben willst
A““ B““ C““
Dann ergänze um Deine und/oder Bedingungen

A““ AND ( B““ OR C““) bedeutet also :
B oder C muss etwas enthalten UND A muss etwas enthalten

A=““ AND ( B““ OR C““) bedeutet also :
B oder C muss etwas enthalten UND A darf nichts beinhalten

(A““ AND B““ AND C=““) OR (A““ AND B=““ AND C““)
( A UND B NICHT C ) oder ( A UND C UND NICHT B) muss etwas enthalten

Du musst Dir einfach vorstellen, das VBA auf jede Frage mit 1 oder 0 auf Deine Frage antwortet und dabei Klammern berücksichtigt.
1 bedeutet schreib was in D
0 bedeutet schreib nix
Dabei werden eben einfach erst die Wert in der Klammer ermittelt und dann mit dem Wert außerhalb verglichen.

Wenn ich Dein Problem also richtig verstanden habe, sollte dir folgendes weiterhelfen :

Sub aa()
.’ Füllt Spalte D mit ja, wenn in A und (B und/oder C) einen Wert haben
.’ A B C
.’ 0 0 0 = 0
.’ 0 0 1 = 0
.’ 0 1 0 = 0
.’ 0 1 1 = 0
.’ 1 0 0 = 0
.’ 1 0 1 = 1
.’ 1 1 0 = 1
.’ 1 1 1 = 1
.Dim rng As Range

.For Each rng In Range(„D1:smiley:10“)
…If Cells(rng.Row, 1).Value „“ And (Cells(rng.Row, 2).Value „“ Or Cells(rng.Row, 3).Value „“) Then
…rng.Value = „ja“
…End If
…Next rng
End Sub

Das heißt, wenn ich drei mal den artikel xyz in meiner liste stehen habe. Und bei einem dieser artikel fehlen beide Einträge für Spalte B und C, dann soll für alle einträge von xyz ein „nein“ da stehen?

Ja genau so ist es.

Du brauchst folgendes:

Ich würde die Liste komplett sortieren, so dass alle gleichen Artikel beieinander stehen.
Dann würde ich folgendes machen:

Dim rng as Range
Dim aktArtikel as String
Dim no() as String
Dim i as integer

aktArtikel = Range(„A1“).Value

For each rng in Range(„D1:smiley:100“)
If Cells(rng.Row,1) = aktArtikel then
If Cells(rng.Row, 2).Value „“ Or _
Cells(rng.Row, 3).Value „“ Then
rng.Value = „ja“
else
redim preserve no(i)
no(i) = Cells(rng.row, 1).value
rng.Value = „nein“
i = i + 1
End if
Else
aktArtikel = Cells(rng.row,1).Value
End if

Next

For each rng in Range(„D1:smiley:100“)
For i = 0 to ubound(no)
if Cells(rng.row, 1).value = no(i) then
rng.value = „nein“
end if
next
Next

So müssts theoretisch hinhauen. Sortieren ist glaub ich nicht unbedingt pflicht. Ist jetzt auch zu spät um noch drüber nachzugrübeln.

Wow ich hab den Code zwar noch nicht ganz verstanden, aber es sieht schon ganz gut aus.
Im Moment überspringt er die erste Zeile in der eine neue Artikelnummer erscheint und beachtet diese bei der überprüfung ob die kriterien für jedes Vorkommen der Artikelnummer. zutrifft nicht.

Aber danke schonmal… Heute ist es dann doch schon zu spät.
Grüße
Björn

Hallo,
hab noch nicht ganz verstanden was es mit den Kriterien von B & C auf sich hat. Zum Beispiel in der Zeile B3 und B4 sind die Kriterien gleich, obwohl D einmal JA und ein Leer sein soll. Was für Werte sind in A und welche in B & C enthalten?

Mit Gruß,
Christian

Der Code ist eigentlich recht simpel zu verstehen:

Er geht jede Zeile einmal durch und überprüft ob überhaupt B und C vorhanden sind und trägt je nachdem „ja“ oder „nein“ ein. Wenn er ein nein einträgt, speichert er sich den Artikel in einem Array (redim preserve).

Dann geht er nochmal alle artikel durch und überprüft, jeden Artikel ob er in der liste der „neins“ steht und setzt diese je nachdem auch auf „nein“.

Der Grund warum er den ersten nach einem wechsel auslässt ist:

Du musst nach aktArtikel = Cells(rng.row,1).Value nochmal prüfen ob ein „ja“ oder ein „nein“ rein kommt. So wie im „then“-Fall der ersten If-Schleife.

Danke, jetzt wird mir einiges klar.
Habe auch den Code angepasst, damit die erste neue Artikelnummer nicht vergessen wird.

Leider habe ich allerdings etwa 3000 Zeilen die ich überprüfen möchte und es dauert sehr lange für diese Aktion.
Hast du evtl noch Optimierungsvorschläge wie ich das etwas beschleunigen kann?

Grüße
björn

Man könnte das in noch einem komplexeren aufbau mit zählern und schleifen verknüpfen, so dass er nur einmal durch jede artikelgruppe muss. Das wäre allerdings ein ganz anderer Codeaufbau.

Ansonsten: Wie lange dauert denn der Durchlauf etwa? Ich hätte für 2x3000 so auf maximal 2-3 minuten getippt.

Sorry, keinen Plan. Das ist zu lang her…