
Ich versuche nun schon seit einigen Stunden, das Problem zu lösen, aber ohne Ergebnis ...
Mein Setup:
Ich habe Excel-Tabellen mitRezepte für Kosmetikprodukte.
Jedes Rezept enthält Dutzende von Zutaten, jede mit ihremHandelsname.
Ich habe eine lange Liste mit den Übersetzungen der einzelnen Handelsnamen in'wissenschaftlicher Name.
Ich muss jeden Handelsnamen in sein wissenschaftliches Gegenstück übersetzen. Dieser Teil lässt sich mit einer Vlookup-Funktion sehr einfach erledigen.
Aber einigeNamen austauschenSindRezeptean sich, enthalten mehrere Zutaten in der Tabelle derwissenschaftliche Namen. Es handelt sich also nicht um eine 1:1-Beziehung, sondern manchmal (nicht immer) um eine 1:viele-Beziehung.
Zum Beispiel:
Kosmetik A Blatt
IngredientA_trade_name
IngredientB_trade_name
IngredientC_trade_name
Handel mit der Stammdatei der Liste wissenschaftlicher Namen:
IngredientA_trade_name Science1
IngredientB_trade_name Science2
IngredientB_trade_name Science3
IngredientB_trade_name Science4
IngredientC_trade_name Science5
IngredientC_trade_name Science6
....etc, for lots and lots of ingredients.
Ich habe zwar Möglichkeiten gefunden, mehrere Werte zurückzugeben, aber keine davon funktioniert automatisch:
Ich muss dieZutatName in einer Zelle, dann platzieren Sie die Formel in der Zelle daneben und ziehen Sie sie ein paar Stellen nach unten, damit sie für alle möglichen Übereinstimmungen automatisch ausgefüllt wird. Einige andere Lösungen platzieren die zurückgegebenen Werte in einer einzigen Zelle (Science2,Science3,Science4), was etwas besser ist, aber für den Rest meines Arbeitsablaufs nicht funktioniert ...
Gibt es eine Möglichkeit, die Liste der Handelsnamen durchzugehen und nach Bedarf Zeilen mit allen wissenschaftlichen Namen einzufügen?
Antwort1
Dieses Makro mit VBA erledigt die Aufgabe:
Public Sub ingredients()
Dim wkb As Workbook
Dim wks, wks1 As Worksheet
Set wkb = ThisWorkbook
Set wks = ActiveSheet
wks.Application.ScreenUpdating = False
mastername = "Master"
totalsheets = wkb.Worksheets.Count
For i = 1 To totalsheets
Set wks1 = wkb.Worksheets(i)
wks1name = wks1.Name
If wks1name = mastername Then
i = totalsheets
Else
Set wks1 = Nothing
End If
Next i
reviewing = True
activerow = 1
While reviewing
tradename = wks.Cells(activerow, 1)
If tradename = "" Then
reviewing = False
End If
reviewingmaster = True
activerowmaster = 1
found = 0
While reviewingmaster
sciname = wks1.Cells(activerowmaster, 1)
If sciname = "" Then
reviewingmaster = False
End If
If sciname = tradename Then
found = found + 1
If found > 1 Then
activerow = activerow + 1
wks.Rows(activerow).Insert
End If
wks.Cells(activerow, 2) = wks1.Cells(activerowmaster, 2)
wks.Cells(activerow, 3) = wks1.Cells(activerowmaster, 3)
End If
activerowmaster = activerowmaster + 1
Wend
activerow = activerow + 1
Wend
wks.Application.ScreenUpdating = True
theend = MsgBox("Finished on " & wks.Name, vbInformation)
End Sub
Öffnen Sie dazu Macros /VBA, fügen Sie ein Modul ein unterDiesesArbeitsbuchund fügen Sie den Code auf der rechten Seite ein.
Beachten Sie Folgendes:
- Der Code wird auf dem aktiven Arbeitsblatt ausgeführt.
- Jeder neue wissenschaftliche Name außer dem ersten Handelsnamen wird in einer neuen Zeile hinzugefügt.
- Der Code funktioniert, solange die Spalte A des Arbeitsblatts keine leeren Zellen enthält.
- Da angenommen wird, dass der Name des Master-Listen-ArbeitsblattsMeisterSie müssen die Zeile
mastername="Master"
in den entsprechenden Namen ändern. - Das Eingeben von 500 Handelsnamen und 5000 wissenschaftlichen Namen dauerte 23 Sekunden.
Antwort2
Für Excel 2010 oder 2013 würde ich hierfür das Power Query-Add-In verwenden. Ab Excel 2016 ist Power Query in das Daten-Menüband im Abschnitt „Abrufen und Transformieren“ integriert.
Power Query kann mit einer Excel-Tabelle beginnen. Es verfügt über einen Merge-Befehl, der Abfragen zusammenführen kann, mit der Option, nur die Übereinstimmungen beizubehalten. Ein Abfrageergebnis kann in eine Excel-Tabelle geschrieben werden.
Das Entwerfen Ihrer Anforderungen in Power Query würde einige Minuten dauern und erfordert keinen Code.
...
Ich wurde durch hilfreiches Feedback dazu inspiriert, diese Antwort zu erweitern. Tatsächlich habe ich eine funktionierende Lösung entwickelt, die Sie von meinem OneDrive herunterladen und ausprobieren können:
Es ist die Datei:Power Query-Demo - mehrere Werte für jeden Wert einer Werteliste zurückgeben
Der Aufbau hat bei mir weniger als 2 Minuten gedauert (ohne das Kopieren der Eingabedaten und das Schreiben des Readme-Blatts) und erforderte keinen Code/keine Funktionen.
Die Schlüsseltechnik ist Zusammenführen und Erweitern, wie hier beschrieben: