Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1952to1956
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

schnelles Makro kopiert letzten statt ersten relevanten Eint

schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 14:17:53
Fred
Hallo Excel Profis,
ich habe zwei sehr umfangreiche Tabellen in den Sheets "Live" und "Ziel"
Ein Makro, welches mir Werte von "Ziel" nach "Live" kopiert mit der Bedingung, dass jeweils in Spalte "A" beider Tabellen der Wert identisch ist.
Sub Ziel_nachLive()


Application.ScreenUpdating = False
sn = Sheets("Live").ListObjects(1).DataBodyRange
sp = Sheets("Ziel").ListObjects(1).DataBodyRange

With CreateObject("scripting.dictionary")
For j = 1 To UBound(sp)
.Item(sp(j, 1)) = Array(sp(j, 61), sp(j, 62), sp(j, 63), sp(j, 64))
Next

For j = 1 To UBound(sn)
If .Exists(sn(j, 1)) Then
sn(j, 29) = .Item(sn(j, 1))(0) ' alarm1
sn(j, 30) = .Item(sn(j, 1))(1) ' alarm2
sn(j, 31) = .Item(sn(j, 1))(2) ' alarm3
sn(j, 32) = .Item(sn(j, 1))(3) ' alarm4

End If
Next
End With
Sheets("Live").ListObjects(1).DataBodyRange = sn
End Sub

Nun ist es so, dass in Sheet "Ziel" mehrere DS mit dem gleichen Wert in Spalte "A" vorhanden sind und das schnelle Makro allerdings den letzten gefunden identischen Wert relevant sieht und entsprechend die Werte aus dieser Zeile in "Live" einträgt.
Kann mir ein Excel Experte das Makro entsprechend ändern so das der 1. gefundene Wert relevant ist? Die Tabelle "Ziel" ist absteigend sortiert.

Gruss
Fred


AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 14:27:45
onur
Dummer Frage:
"von "Ziel" nach "Live" kopiert mit der Bedingung, dass jeweils in Spalte "A" beider Tabellen der Wert identisch ist. " ? Und wo in "deinem" Makro wird deiner Meinung danach geprüft?
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 15:01:08
daniel
Hi
lass diese Schleife:
For j = 1 To UBound(sp)

mal rückwärts laufen, also
 For j = UBound(sp) to 1 Step -1

Gruß Daniel
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 15:17:03
Fred
.. dann Laufzeitfehler 9
Gelb:
If .Exists(sn(j, 1)) Then


Daniel kannst du mir sagen, wie ich die Add-Methode des Dictionaries verwende? - Um Werte zum Dictionary hinzuzufügen. Wenn ein Schlüssel bereits vorhanden ist, soll ein Fehler ausgelöst werden, der jedoch mit On Error Resume Next abgefangen wird. Dadurch sollte nur der erste gefundene identische Wert in Spalte "A" in das Dictionary aufgenommen werden, - oder ist das alles Humbug?
Anzeige
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 15:25:24
daniel
hi
sollte eigentlich nicht sein.
aber mit diesen Bruchstücken kann ich keine Fehleranalyse machen.
du solltest schon deinen vollständigen Code zeigen und am besten auch die Datei mit den Daten dazu mitliefern, so dass wir deinen Code auch testen können.

ansonsten, geht das einmalige hinzufügen eines Wertes zu seinem Dictionary so:

If not dictionary.exists(schlüssel) then

dictionary(schlüssel) = Wert
end if

Gruß Daniel
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 17:01:16
Fred
Hallo Daniel,
ich denke mal, dass ich bei "stack overflow" eine ähnliche Lösung gefunden habe und fast 2 Stunden dran rumgeschraubt bin ..
Sub Ziel_nachLive()

' nur der erste Wert wird relevant
Application.ScreenUpdating = False

Dim sn As Variant
Dim sp As Variant
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")

sn = Sheets("Live").ListObjects(1).DataBodyRange
sp = Sheets("Ziel").ListObjects(1).DataBodyRange
For j = 1 To UBound(sp)
On Error Resume Next
dict.Add sp(j, 1), Array(sp(j, 61), sp(j, 62), sp(j, 63), sp(j, 64))
On Error GoTo 0
Next

For j = 1 To UBound(sn)
If dict.Exists(sn(j, 1)) Then
sn(j, 29) = dict(sn(j, 1))(0) ' alarm1
sn(j, 30) = dict(sn(j, 1))(1) ' alarm2
sn(j, 31) = dict(sn(j, 1))(2) ' alarm3
sn(j, 32) = dict(sn(j, 1))(3) ' alarm4
End If
Next

Sheets("Live").ListObjects(1).DataBodyRange = sn

Application.ScreenUpdating = True

End Sub


.. und es funzt anscheinend.

Gruss
Fred

Anzeige
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 17:48:50
onur
Wer sagt denn, dass man seinen "eigenen" Code überhaupt verstehen muss ?
Sowas wird sowieso überbewertet. Hauptsache, es funktioniert anscheinend - irgendwie..... :))
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 18:03:20
Fred
jo, Onur
zum Glück bin ich kein Biologe :-)
Hast du Einwände gegen das Ergebnis meiner Bastelstunde?
Es läuft tatsächlich wie gewünscht. - der erste Wert wird übertragen.
In meiner Version wird die .Add-Methode des Dictionaries verwendet, um Werte zum Dictionary hinzuzufügen. Wenn ein Schlüssel bereits vorhanden ist, klingelt es an der Haustür und ein Fehler wird ausgelöst,- es wird nicht geöffnet, allerdings mit "On Error Resume Next" freundlich "Auf Wiedersehen gewünscht. Daher wird nur der erste gefundene identische Wert in Spalte "A" in das Dictionary aufgenommen. - Oder so ähnlich. Es funzt :-)





Anzeige
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 18:01:48
daniel
ja .add erzeugt einen Fehler, wenn du das Element ein zweites mal hinzufügen willst.
aber wie gesagt, du kannst auch den Wert einfach zuweisen, dann gilt bei mehrfachvorhandensein immer die Letzte Zuweisung, dh du kannst dann über Sortierung oder die Laufrichtung der Schleife bestimmen, ob bei Mehrfachvorhandensein der erste oder letzte Wert im Dictionary steht. (Die Zuweisung macht man dann nicht mit .Add, sondern mit einfach mit "="

auch im anderen Fall würde ich mit .Exists prüfen, ob der Wert schon drin ist.
Die Ausnutzung von Fehlern zur Programmierung ist "hemdsärmelig" und sollte vermieden werden, bzw nur dann angewendet werden, wenn es anders nicht oder nur mit großem Aufwand geht, das ist hier nicht der Fall.

wenn du also immer den ersten Treffer haben willst, dann:
entweder:
For j = UBound(sp) To 1 Step -1 

dict(sp(j, 1)) = Array(sp(j, 61), sp(j, 62), sp(j, 63), sp(j, 64))
Next

oder
For j = 1 To UBound(sp)

If not dict.Exists(sp(j, 1)) then dict.Add sp(j, 1), Array(sp(j, 61), sp(j, 62), sp(j, 63), sp(j, 64))
Next


Gruß Daniel
Anzeige
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 14:33:42
Fred
Hallo Onur,
ich denke mal
.Item(sp(j, 1)) =
und
j = 1
müssen identisch sein. Aber wenn du mich so schon fragst, bin ich ganz gewaltig auf dem Holzweg
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 14:45:56
Fred
Onur,
ich bin mir eigentlich sicher, dass hier
For j = 1 To UBound(sn)

If .Exists(sn(j, 1)) Then
sn(j, 29) = .Item(sn(j, 1))(0) ' alarm1
sn(j, 30) = .Item(sn(j, 1))(1) ' alarm2
sn(j, 31) = .Item(sn(j, 1))(2) ' alarm3
sn(j, 32) = .Item(sn(j, 1))(3) ' alarm4
End If
Next

jede Zeile in der Tabelle "Live" überprüft wird, ob der Wert in der ersten Spalte (sn(j,1)) im zuvor erstellten Dictionary existiert (Exists(sn(j, 1)
Jetzt bringste mich aber auch ins schleudern!
Anzeige
AW: schnelles Makro kopiert letzten statt ersten relevanten Eint
20.11.2023 15:08:57
Fred

Das Makro verwendet ein Dictionary, um die Werte aus der Tabelle "Ziel" in Verbindung mit den Werten aus der ersten Spalte (Spalte "A") zu speichern.
Da dieses Verhalten auf dem Dictionary-Objekt basiert, habe ich mal nachgelesen und erfahren, das das Dictionary-Objekt nur eindeutige Schlüssel akzeptiert. Auf mein Makro umgesetzt: Wenn mehrere Zeilen in "Ziel" denselben Wert in der ersten Spalte haben, wird nur die letzte gefundene Zeile im Dictionary berücksichtigt. Also dieser Umstand sorgt für den Eintrag aus der letzten gefundenen Zeile/Zelle.
Weiter habe ich festgestellt, dass um sicherzustellen, dass der erste gefundene identische Wert in Spalte "A" in der Tabelle "Ziel" relevant ist, dass das Dictionary auf die Verwendung der Methode .Add umgestellt werden kann.
Aber wie???
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige