Daten mit unterschiedlichen Bezeichnungen aus unterschiedlichen Worksheets miteinander vergleichen

  • Excel

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Mono.

    Daten mit unterschiedlichen Bezeichnungen aus unterschiedlichen Worksheets miteinander vergleichen

    Hallo liebe Community,

    ich bin blutiger VB-Anfänger und habe mir zu dieser Frage bereits einen Wolf gegoogelt, komme aber leider nicht weiter. Bitte habt Nachsicht, falls diese Frage schon anderswo beantwortet wurde (ich glaube aber nicht in dieser Form).

    Es geht um eine Excel-Tabelle mit mehreren Worksheets, welche automatisch von einem Computersystem generiert wird. Auf dem Worksheet "Treatments" finden sich in Spalte C verschiedene Einheiten (mg, µg, mmol, IE, MBq und noch ein paar mehr). Ein weiteres Worksheet "ExternalIDs" enthält in Spalte L die gleichen Einheiten, welche aber maschinenlesbar gemacht wurden (z.B. wird "µg" zu "mcg", aus "IE" wird "units". Jetzt möchte ich die beiden Spalten (Also Worksheet "Treatments", C2:C5000 und Worksheet "ExternalIDs", L2:L5000) miteinander vergleichen, und wenn die jeweilige Zuordnung passt die Zelle grün hinterlegen. Falls es nicht passt, möchte ich die Zelle rot hinterlegen.
    Aus juristischen Gründen ist es nicht möglich, die Daten einfach rüber zu kopieren - sie müssen händisch eingetragen werden, das Script soll lediglich eine zusätzliche "Kontrollinstanz" bilden.

    Probleme habe ich vor allem damit, dass die Felder mit ungleichen Werten benannt sind und auf unterschiedlichen Worksheets liegen. Folgenden Code habe ich mir bereits zusammengeschustert:

    Quellcode

    1. Sub UnitComparison_Makro()
    2. Dim ZelleA As Range
    3. Dim ZelleB As Range
    4. Dim a As Range
    5. Dim b As Range
    6. Set a = ThisWorkbook.Worksheets("Treatments").Range("C2:C5000")
    7. Set b = ThisWorkbook.Worksheets("ExternalIDs").Range("L2:L5000")
    8. For Each ZelleA In a
    9. Set ZelleB = b.Cells(ZelleA.Row, 12)
    10. If ZelleA.Value = "µg" And ZelleB.Value = "mcg" Then
    11. a.Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    12. End If
    13. Next ZelleA
    14. End Sub


    Leider markiert er nicht was er soll... habe ich ein Brett vor dem Kopf? :S Ich hoffe das ich diese "For"-Schleife (wenn sie einmal klappt) einfach kopieren und für die anderen Werte anpassen kann...

    Vielen Dank fürs Lesen und liebe Grüße!
    Jan
    Liebe Leute,

    mir ist es gerade wie Schuppen vor den Augen gefallen - eine (wenn auch ziemlich unpraktikable) Lösung für das Problem.

    Quellcode

    1. Sub UnitComparison_Makro()
    2. Dim ZelleA As Range
    3. Dim ZelleB As Range
    4. Dim a As Range
    5. 'Dim b As Range
    6. Set a = ThisWorkbook.Worksheets("Treatments").Range("C2:C5000")
    7. 'Set b = ThisWorkbook.Worksheets("ExternalIDs").Range("L2:L5000")
    8. For Each ZelleA In a
    9. Set ZelleB = Worksheets("ExternalIDs").Cells(ZelleA.Row, 12)
    10. If ZelleA.Value = "µg" And ZelleB = "mcg" Then
    11. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    12. ElseIf ZelleA.Value = "ml" And ZelleB = "ml" Then
    13. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    14. ElseIf ZelleA.Value = "mg" And ZelleB = "mg" Then
    15. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    16. ElseIf ZelleA.Value = "Mega IE" And ZelleB = "MEGAunits" Then
    17. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    18. ElseIf ZelleA.Value = "ng" And ZelleB = "ng" Then
    19. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    20. ElseIf ZelleA.Value = "IE" And ZelleB = "units" Then
    21. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    22. ElseIf ZelleA.Value = "kIE" And ZelleB = "kunits" Then
    23. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    24. ElseIf ZelleA.Value = "mmol" And ZelleB = "mmol" Then
    25. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    26. ElseIf ZelleA.Value = "g" And ZelleB = "g" Then
    27. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 4
    28. Else
    29. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = 3
    30. End If
    31. Next ZelleA
    32. End Sub


    Viel besser wäre es natürlich, wenn man die Einheitenpaare in einem dictionary o.ä. speichern und vergleichen könnte... Vor allem würde mir das helfen, damit ich nicht bei neuen Datenpaaren gleich die ganze Schleife bearbeiten sondern nur das "dictionary" ergänzen muss. Fällt jemandem von euch dazu eine Lösung ein?

    Liebe Grüße und vielen Dank,
    Jan
    Hi,

    ungefähr so würde es gehen:

    Visual Basic-Quellcode

    1. Private unitsDictionary As Object
    2. Sub UnitComparison_Makro()
    3. Dim ZelleA As Range
    4. Dim ZelleB As Range
    5. Dim a As Range
    6. 'Dictionary befüllen
    7. Call FillDictionary
    8. 'Dim b As Range
    9. Set a = ThisWorkbook.Worksheets("Treatments").Range("C2:C5000")
    10. 'Set b = ThisWorkbook.Worksheets("ExternalIDs").Range("L2:L5000")
    11. For Each ZelleA In a
    12. Set ZelleB = Worksheets("ExternalIDs").Cells(ZelleA.Row, 12)
    13. Worksheets("Treatments").Cells(ZelleA.Row, 3).Interior.ColorIndex = GetColorForFields(ZelleA.Value, ZelleB.Value)
    14. Next ZelleA
    15. End Sub
    16. 'irgendwelche Daten mal füllen
    17. Sub FillDictionary()
    18. Set unitsDictionary = CreateObject("Scripting.Dictionary")
    19. unitsDictionary.Add "ml", "ml"
    20. unitsDictionary.Add "kIE", "kunits"
    21. unitsDictionary.Add "µg", "mcg"
    22. unitsDictionary.Add "mq", "mqe"
    23. End Sub
    24. 'prüfen ob es passt und entsprechenden Farbcode zurückgeben
    25. Function GetColorForFields(valueOriginal As String, valueMachine As String)
    26. 'nicht im Dictionary => rot
    27. If Not unitsDictionary.Exists(valueOriginal) Then
    28. GetColorForFields = 3
    29. Exit Function
    30. End If
    31. 'Wert ist identisch => grün
    32. If unitsDictionary(valueOriginal) = valueMachine Then
    33. GetColorForFields = 4
    34. Exit Function
    35. End If
    36. 'nix gefunden => rot
    37. GetColorForFields = 3
    38. End Function
    Das ist meine Signatur und sie wird wunderbar sein!