Anzeige
Archiv - Navigation
1168to1172
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Daten prüfen 2 Kriterien

Daten prüfen 2 Kriterien
Koenig
Guten Tag nochmal.
ich hatte das Thema vor ein paar Tagen schon mal gepostet und Timo hatte mir veruscht zu helfen, leider hat das bei mir noch nicht das richtige Ergebnis gebracht.
Ich habe eine Tabelle
https://www.herber.de/bbs/user/70482.xls
In der "Ausgabe" Tabelle soll folgendes ausgegeben werden:
Zeilenstruktur wie in "Input" Zeile 1
Es sollen die Code gelöscht werden, welche in Tabellenblatt "Bereiningung" stehen.
Baumuster in allen Berichtsgebieten
Baumuster in einzelen Berichtsgebieten
Dabei muss jeder Code einzeln geprüft werden:
Beispiel: Kommt Kombination 4513011 27800 A01 in "Input" vor, wenn ja, dann A01 in "Ausgabe" löschen und für dieses Feld ein leeres ausgeben wenn nicht, dann Wert stehen lassen und nächstes Feld Prüfen. Danach 4513011 27800 474 prüfen usw. Wenn anstelle alle ein Berichtsgebiet steht, dann nur dieses Prüfen.
Man kann das über Excel Formeln lösen, (siehe Tabllenblatt "Test") so lange alle Baumuster geprüft werden, danach wird es kompliziert und es dauert zu lange.
Kann man dies auch über ein Makro erledigen lassen?
Vielen Dank schon jetzt.
Jens

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Daten prüfen 2 Kriterien
28.07.2010 20:06:14
Tino
Hallo,
teste mal ob es diesmal passt.
Sub test()
Dim meARIn(), meARBer()
Dim A&, B&, C&, D&, maxCol&
With Tabelle2
 maxCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
 meARIn = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, maxCol)
End With

With Tabelle3
 maxCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
 meARBer = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, maxCol)
End With

For A = 1 To Ubound(meARBer)
    For B = 1 To Ubound(meARIn)
        If meARIn(B, 3) = meARBer(A, 1) Then
            If meARBer(A, 2) = "alle" Or meARIn(B, 5) = meARBer(A, 2) Then
                For C = 3 To Ubound(meARBer, 2)
                        If meARBer(A, C) = "" Then Exit For
                        
                        For D = 6 To Ubound(meARIn)
                            If Trim(meARBer(A, C)) = Trim(meARIn(B, D)) Then _
                                meARIn(B, D) = Empty
                        Next D
                Next C
            End If
        End If
    Next B
Next A

With Tabelle4
    .Range("A2", .Cells(.Rows.Count, .UsedRange.Columns.Count)).Clear
    With .Range("A2").Resize(Ubound(meARIn), Ubound(meARIn, 2))
        .Cells = meARIn
        .EntireColumn.AutoFit
    End With
End With
End Sub
Hier noch die Test Mappe
https://www.herber.de/bbs/user/70798.xls
Gruß Tino
Anzeige
AW: Daten prüfen 2 Kriterien
29.07.2010 08:24:21
Koenig
Hallo Tino, das sieht super aus, vielen vielen herzlichen Dank.
hab beim testen nur eines noch gefunden, wenn ich das mit sehr vielen Datensätzen machen möchte bekomme ich eine Fehlermeldung. Hast du da noch eine Idee?
Herzlichen Dank
Jens
AW: Daten prüfen 2 Kriterien
29.07.2010 09:14:31
Tino
Hallo,
welche Datensätze sind denn so viel, die Input oder und auch die Bereinigung?
Wenn beide sehr viele sind müssten wir es anders ohne Array machen, dann wird es aber um einiges länger dauern.
Wenn es nur Input ist könnte ich mir vorstellen diese in mehreren Durchläufen abzuarbeiten.
Gruß Tino
AW: Daten prüfen 2 Kriterien
29.07.2010 09:23:23
Koenig
Hallo Tino,
es sind in beiden Tabellen mehr zeilen. Bis zu 10.000. Wenn der Vorgang dann länger dauert, ist das OK. Wichitig ist es für mich eine Möglichkeit zu schaffen, die das überhaupt kann. Wäre super wenn du mir da nochmal helfen könntest.
Vielen herzlichen Dank.
Jens
Anzeige
oder versuch es mal noch so....
29.07.2010 09:21:46
Tino
Hallo,
Sub test()
Dim meARIn(), meARBer()
Dim A&, B&, C&, D&, maxCol&
With Tabelle2
 maxCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
 meARIn = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, maxCol)
End With

With Tabelle3
 maxCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
 meARBer = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, maxCol)
End With

For A = 1 To Ubound(meARBer)
    For B = 1 To Ubound(meARIn)
        If meARIn(B, 3) = meARBer(A, 1) Then
            If meARBer(A, 2) = "alle" Or meARIn(B, 5) = meARBer(A, 2) Then
                For C = 3 To Ubound(meARBer, 2)
                        If meARBer(A, C) = "" Then Exit For
                        
                        For D = 6 To Ubound(meARIn, 2)
                            If Trim(meARBer(A, C)) = Trim(meARIn(B, D)) Then _
                                meARIn(B, D) = Empty
                        Next D
                Next C
            End If
        End If
    Next B
Next A

With Tabelle4
    .Range("A2", .Cells(.Rows.Count, .UsedRange.Columns.Count)).Clear
    With .Range("A2").Resize(Ubound(meARIn), Ubound(meARIn, 2))
        .Cells = meARIn
        .EntireColumn.AutoFit
    End With
    .Activate
End With
End Sub
Gruß Tino
Anzeige
AW: oder versuch es mal noch so....
29.07.2010 09:27:20
Koenig
Hallo Tino
wow, das läuft schon mal sauber durch auch bei 10.000 sätzen. Werde es mal im Detail anschauen und dir bescheid sagen. Vielen vielen Dank schon mal
Jens
AW: oder versuch es mal noch so....
29.07.2010 10:08:53
Koenig
Hallo Tino,
nochmal ich. Kann man in dem Macro anstelle Tabelle2; Tabelle3 usw. auch feste Bezeichnungen nehmen, also in dem Fall so wie Tabellenblätter heißen.
Wäre super wenn du mir hier noch kurz helfen könntest.
Ansonsten funktioniert es super.
Danke
Jens
AW: oder versuch es mal noch so....
29.07.2010 10:31:49
Tino
Hallo,
ich verwende gern den Codenamen der Tabellen,
dies hat den Vorteil, dass die Makros auch noch laufen wenn die Tabelle umbenannt wird.
Wenn Du dies nicht möchtest, ersetze die Zeilen wie folgt.
With Tabelle2
durch
With Sheets("Input")
meARIn = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, maxCol)
durch
meARIn = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, maxCol).Value2
With Tabelle3
durch
With Sheets("Bereinigung")
meARBer = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, maxCol)
durch
meARBer = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, maxCol).Value2
With Tabelle4
durch
With Sheets("Ausgabe")
Gruß Tino
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige