Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Vergleiche Wert aus 2D-Array-A mit Wert aus 2D-Array-B

Forumthread: Vergleiche Wert aus 2D-Array-A mit Wert aus 2D-Array-B

Vergleiche Wert aus 2D-Array-A mit Wert aus 2D-Array-B
07.06.2024 01:33:20
HenryHolzwurm
Hallo Zusammen,

Leider bin ich im Forum noch nicht wirklich fündig geworden, oder kann (ob mangelnder Erfahrung) die Lösung für mein Problem nicht erkennen/zuordnen.
Wie der Betreff schon andeutet, habe ich folgende Situation:
Ich habe 2 2D-Arrays, die ich aus verschiedenen Tabellen auslese. Nun möchte ich die Werte aus Spalte 1 des ersten Arrays nach einander mit allen Werten vergleichen, die in Spalte 2 des zweiten Arrays gelistet sind.
Ist der erste Wert aus Array 1 nun irgendwo in der zweiten Spalte des zweiten Arrays enthalten, dann braucht nichts weiter passieren. Ist der Wert jedoch nicht enthalten, dann möchte ich darauf reagieren und die gesamten Werte der Array Zeile in eine Datei eintragen.
Side note: Die Arrays haben nie die gleiche Größe, das muss ich also flexibel anhand der Array-Größe zu handeln versuchen.

Leider ist mein Code nicht wirklich weiter als bis zu einem groben Entwurf gekommen, den ich aber gerne mal poste,.....



' Start Loop arrSource times
For int_ArrayPosSource = LBound(arrSource) To UBound(arrSource)
For int_ArrayPosTarget = LBound(arrTarget) To UBound(arrTarget)
' Read Value of current array position
int_ArrayValueSource = arrTarget(int_ArrayPosSource, 1)
int_ArrayValueTarget = arrTarget(2,int_ArrayPosSource)
' React to values
If int_ArrayValueSource = int_ArrayValueTarget Then
'There is no need for action, as the related Number is already listed
Exit For
Else
' If Value was not found in the full array, values need to be handled
End If
Next
Next


Wäre super, wenn Ihr mir hier weiter helfen könntet.

Beste Grüße,

Euer Henry
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Vergleiche Wert aus 2D-Array-A mit Wert aus 2D-Array-B
07.06.2024 03:50:42
Onur
Dein Code würde, jedesmal wenn die beiden nicht identisch sind, die Zeile Spalte kopieren. Das wären bei 2 Spalten á 100 Zeilen bis zu 10.000 mal.
"Exit For" ist schon mal gut, aber wenn du nicht ein Flag (z.B. found=true) setzt, weiss der Code nicht, ob was gefunden wurde.
Alles zw. "Else" und "End If" steht, darf erst hinter dem ersten "Next" passieren, und zwar nach Abfrage von found (sonst passiert es z.B. 10.000 mal)
for x=1 To UBound(arrSource)

for y= 1 To UBound(arrTarget)
If arrSOURCE(x, 1) = arrTarget(y,2) Then flag=true:Exit For
Next y
If Not flag then bla bla bla 'Nicht gefunden - mach was !
Next x

Denn "GEFUNDEN" ist ja, sobald irgendwo was gefunden wurde (evtl schon beim ersten Wert, aber die Aussage "NICHT GEFUNDEN" ist erst garantiert, wenn die ganze Spalte durchsucht wurde.
Anzeige
AW: Vergleiche Wert aus 2D-Array-A mit Wert aus 2D-Array-B
07.06.2024 07:38:17
daniel
Hi
Sind die Werte, die für die Prüfung verwendet werden, innerhalb ihrer eigenen Spalte eindeutig oder können sie dort mehrfach vorkommen?

Wenn es eindeutigige Werte sind, würde ich so vorgehen und das ganze direkt in Excel lösen, ohne Arrays:

1. Kopiere die erste Spalte der erste Tabelle in die zweite Spalte eines leeren Tabellenblatts.
2. kopiere die zweite Tabelle und füge sie unterhalb ein.
3. Wende auf den ganzen Block das DATEN - DATENTOOLS - DUPLIKATEENTFERNEN an, mit der zweiten Spalte als Kriterium. Damit sollten im unteren Teil alle Zeilen gelöscht werden, die auch im oberen Teil vorkommen
4. Lösche den oberen Block
5. Überführe die übrig gebliebenen Zeilen in die neue Datei

Gruß Daniel
Anzeige
AW: Vergleiche Wert aus 2D-Array-A mit Wert aus 2D-Array-B
07.06.2024 10:22:47
daniel
Hi
wenn du es per doppelter Schleife mit den Arrays machen willst, dann so:

Sub test()


For int_ArrayPosSource = LBound(arrSource) To UBound(arrSource)
int_ArrayValueSource = arrTarget(int_ArrayPosSource, 1)
For int_ArrayPosTarget = LBound(arrTarget) To UBound(arrTarget)
int_ArrayValueTarget = arrTarget(2, int_ArrayPosSource)
If int_ArrayValueSource = int_ArrayValueTarget Then Exit For
Next
If int_ArrayPosTarget > UBound(arrTarget) Then
'... Wert wurde in anderer Liste nicht gefunden, hier die Aktion
End If
Next
End Sub

schleife mit dem Vergleich bei Treffer vorzeitig abbrechen.
die Zeile ist nicht in der anderen Tabelle vorhanden, wenn die Schleife vollständig durchläuft.
ob die Schleife vollständig durchgelaufen ist oder ob vorzeitig abbebrochen wurde, kannst du erkennen, in dem du nach dem Next den Schleifenzähler mit dem Schleifenendwert vergleichst.
die Schleife wurde vollständig durchlaufen, wenn der Schleifenzähler größer ist als der Schleifenendwert.
ist der Zähler kleiner oder gleich, gab es einen Abbruch.

ggf musst du nochmal prüfen, welches Array du sinnvollerweise in der äußeren und welches du in der inneren Schleife durchläufst.
Das habe ich mir jetzt nicht angeschaut.
Das Array, aus dem du Zeilen übernehmen willst, müsste in der äußeren Schleife durchlaufen werden.

Gruß Daniel
Anzeige
AW: Vergleiche Wert aus 2D-Array-A mit Wert aus 2D-Array-B
11.07.2024 00:36:44
HenryHolzwurm
Hallo Zusammen,

Bitte verzeiht mein langes Schweigen. Neben einem Urlaub hat mich dann leider auch die Arbeit doch mehr gefordert, als es mir lieb ist.

Ich habe mich jetzt etwas mehr mit Euren Lösungen befasst und bin schon einmal ein gutes Stück weiter gekommen. Vielen Dank schon einmal dafür.
Für die folgende Frage habe ich auch die zwei Beispieldateien hochgeladen, um die es mir geht. (Hoffe das hat geklappt,....)

Template 1: https://www.herber.de/bbs/user/170839.xlsm
Template 2: https://www.herber.de/bbs/user/170840.xlsx

In dem Macro (Template 1) müsste nur am Anfang der entsprechende Dateipfad noch ergänzt werden, um (bei Ausführung des Makros) ein entsprechendes DropDown Menü zu öffnen und "Template 2" auszuwählen.

Long storry short:
Template 1 beinhaltet das Macro
Template 1 - Tabelle 2: Beinhaltet meine "Hauptliste", mit der ich abgleichen und die ich im Bedarfsfall ergänzen möchte
Template 2 - Tabelle 1: Das ist der Datensatz, aus dem ich einzelne Zeilen im Bedarfsfall übertragen möchte.

Der Bedarfsfall ergibt sich wie folgt:
Ist der Wert in "Template 2 - Tabelle 1 - Spalte 1" noch nicht in "Template 1 - Tabelle 2 -Spalte 2" enthalten, dann sollen alle Werte der zugehörigen Zeile aus "Template 2 - Tabelle 1" in die nächste freie Zeile in "Template 1 - Tabelle 2", mit einer Zelle nach rechts verschoben ergänzt werden.

etwas anschaulicher formuliert: Stehen sich also zum Beispiel diese Werte gegenüber:
Template 2 - Tabelle 1 - Spalte 1: 1,5,8,10,23,56
Template 1 - Tabelle 2 -Spalte 2: 1,5,23,56,33
Hier möchte ich dann also die Werte aus den Zeilen mit den Werten 8,10 und 23 in Template 1 einfügen

Aktuell kommt es schon so irgendwie zu einer Eintragung, aber weder "erwische" ich die Positionen in meinem Array, die ich wirklich übertragen will, noch werden alle in Frage kommenden Werte eingetragen und um das richtige Sheet für die Eintragung habe ich mich bisher noch nciht gekümmert und war froh, überhaupt etwas eingetragen zu bekommen,.....
Könnt Ihr mir hier bitte nochmal helfen?

Den kompletten Code Füge ich hier nochmal mit ein, sollte ich mich bereits im Vorfeld komplett verrannt haben......Ich sehe meine Probleme aber im unteren Bereich des Codes. Also unter dem letzten '--------------------------------'

Vielen Dank Euch allen schon einmal im Vorraus.

Euer Henry

Sub ImportDataAs_Array()


' Variables used for Source sheet
Dim rngDataSource As Range
Dim arrSource As Variant
Dim wbSource As Workbook
ChDrive ("C:\")
ChDir ("C:\Desktop\Sandbox\") 'Hier den Dateipfad eintragen, aus dem der Ordner geöffnet werden soll.

' Variables used for Target sheet
Dim rngDataTarget As Range
Dim arrTarget As Variant

' Variables for LoopComparison, File updating and noting
Dim int_ArrayPosSourceArray As Integer
Dim int_ArrayPosTargetArray As Integer
Dim int_ArrayValueSource As Integer
Dim int_ArrayValueTarget As Integer
Dim int_LastLine As Integer


'------------------------------------------------'
'Select source File

sSourceDirectory = Application.GetOpenFilename("(*.xls*), *.xls*")

' Open Read Extract and close source file in background

' Block PopUps and Screen Updating
Application.ScreenUpdating = False
Application.DisplayAlerts = False

' Open
Set wbSource = Workbooks.Open(sSourceDirectory)
'Define Data Set for Source / C4C report
'Range in Source File
Set rngDataSource = wbSource.Worksheets(1).Range("A1").CurrentRegion
' Redimension and fill array
ReDim arrSource(1 To rngDataSource.Rows.Count, 1 To rngDataSource.Columns.Count)
arrSource = rngDataSource.Value

' Close Souerce File
wbSource.Close SaveChanges:=False


' Enable PopUps and Screen Updating
Application.ScreenUpdating = True
Application.DisplayAlerts = True

'------------------------------------------------'
'Define Data Set for Target / Just SO numbers from calendar
'Range in Target File
Set rngDataTarget = Tabelle2.Range("A1").CurrentRegion

' Redimension and fill array
ReDim arrTarget(1 To rngDataTarget.Rows.Count, 1 To rngDataTarget.Columns.Count)
arrTarget = rngDataTarget.Value

'------------------------------------------------'

'Compare the current Source position (SO Number) with all entries of the tartger array positions for SO Number.
' if existing, skip
' if not, enter and highlightValue read from arr Source

For int_ArrayPosSource = LBound(arrSource) To UBound(arrSource) - 1

int_ArrayValueSource = arrSource(int_ArrayPosSource + 1, 1)

For int_ArrayPosTarget = LBound(arrTarget) To UBound(arrTarget) - 1

int_ArrayValueTarget = arrTarget(int_ArrayPosTarget + 1, 2)

If int_ArrayValueSource = int_ArrayValueTarget Then Exit For

Next

If int_ArrayPosTarget > UBound(arrTarget) - 1 Then

int_LastLine = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(int_LastLine, 1).Value = ""
Cells(int_LastLine, 2).Value = arrSource(x + 1, 1)
Cells(int_LastLine, 3).Value = arrSource(x + 1, 2)
Cells(int_LastLine, 4).Value = arrSource(x + 1, 3)
Cells(int_LastLine, 5).Value = arrSource(x + 1, 4)
Cells(int_LastLine, 6).Value = arrSource(x + 1, 5)
Cells(int_LastLine, 7).Value = arrSource(x + 1, 6)
Cells(int_LastLine, 8).Value = arrSource(x + 1, 7)
Cells(int_LastLine, 9).Value = arrSource(x + 1, 8)
Cells(int_LastLine, 10).Value = arrSource(x + 1, 9)
Cells(int_LastLine, 11).Value = arrSource(x + 1, 10)
Cells(int_LastLine, 12).Value = arrSource(x + 1, 11)
Cells(int_LastLine, 13).Value = arrSource(x + 1, 12)
Cells(int_LastLine, 14).Value = arrSource(x + 1, 13)
End If
Next
End Sub








Anzeige
AW: Vergleiche Wert aus 2D-Array-A mit Wert aus 2D-Array-B
07.06.2024 19:11:02
Oppawinni
hm, ich weiß ja nicht, ob ich das so richtig verstanden habe,
aber hab auch mal was gebastelt.
Ich generiere ein neues Array (arrAction), das alle Einträge von arrTarget enthält, sofern die nicht in arrSource genannt sind.

Dim arrAction() As Variant

Dim ablnFound() As Boolean
Dim lngUbA As Long, lngUbB As Long
Dim i As Long, j As Long, k As Long, lngCnt As Long

ReDim ablnFound(LBound(arrTarget) To UBound(arrTarget))

lngCnt = 0
For i = LBound(arrSource) To UBound(arrSource)
For j = LBound(arrTarget) To UBound(arrTarget)
If arrSource(i, 1) = arrTarget(j, 2) Then
If Not ablnFound(j) Then
ablnFound(j) = True
lngCnt = lngCnt + 1
End If
Exit For
End If
Next
Next

lngUbA = UBound(arrTarget) - LBound(arrTarget) - lngCnt

If lngUbA >= 0 Then
lngUbB = UBound(arrTarget, 2) - LBound(arrTarget, 2)
ReDim arrAction(lngUbA, lngUbB)
i = 0
For j = LBound(arrTarget) To UBound(arrTarget)
If Not ablnFound(j) Then
For k = LBound(arrTarget, 2) To UBound(arrTarget, 2)
arrAction(i, k - LBound(arrTarget, 2)) = arrTarget(j, k)
Debug.Print arrTarget(j, k),
Next
Debug.Print
i = i + 1
End If
Next
'arrAction enthält alle in arrSource nicht enthaltenen Einträge von arrTarget
Else
'Es gibt keine Einträge in arrTarget, die nicht in arrSource enthalten sind.
End If
Anzeige
AW: Vergleiche Wert aus 2D-Array-A mit Wert aus 2D-Array-B
07.06.2024 03:54:49
Onur
Da fehlt noch was:
Dim found,x,y

for x=1 To UBound(arrSource)
found=false
for y= 1 To UBound(arrTarget)
If arrSOURCE(x, 1) = arrTarget(y,2) Then found=true:Exit For
Next y
If Not found then bla bla bla 'Nicht gefunden - mach was !
Next x
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige