
Antwort1
Pseudocode, um dies in VBA zu tun: (Sie können den echten Code herausfinden). Beachten Sie, dass dies nur in der Antwort geschrieben wurde, sodass Sie die Lücken ausfüllen müssen, aber hoffentlich haben Sie eine allgemeine Vorstellung davon, wie Sie jede Adresse durchgehen und alle Namen sammeln, die eine Spalte haben, die mit dieser Adresse übereinstimmt.
dim address_on as string 'current address
dim names as string 'concatenate list of names
dim in_list_already as boolean
For address_row = 1 to range().end(xldown).row
'loop through addresses
address_on = Range("Column" & address_row).value
names = ""
'First check if address_on is already in destination list?
in_list_already = false
for check_row = 1 to range("Destination").end(xldown).row
If range("Destination Col" & check_row).value = address_on then
in_list_already = true
Exit for
End if
next
if in_list_already = false then
'Find all names that have this address
for name_row = 1 to range().end(xldown).row
If range("Address Column" & name_row).value = address_on then
names = names & Range("Name Column" & name_row).value & ","
End if
next
'remove last comma
names = names.remove(Len(names)-1,1)
'add to list
Range("Column to insert to 1" & next_slot).value = names
Range("Column to insert to 2" & next_slot).value = address_on
End if
next
Wie Sie sehen, names = names & Range("Name Column" & name_row).value & ","
wird es einfach an die Liste angehängt, wenn eine Übereinstimmung vorliegt.
Die obige Methode ist:
- Durchlaufen Sie Ihre Daten
- Existiert das Element bereits in der Ausgabe? Wenn nicht, dann zeige es nicht an (damit es keine Duplikate gibt).
- Sammeln Sie alle Namen mit der Adresse, unter der Sie sich befinden
- Ausgabeergebnisse
Antwort2
Dies lässt sich mithilfe von Formeln problemlos bewerkstelligen, wenn die Datensätze wie in der Frage aggregiert werden (komplizierter ist es, wenn die übereinstimmenden Adressen nicht zusammenliegen):
Einblenden von Spalten zum Anzeigen der Methode:
Ich habe zwei Hilfsspalten erstellt, eine für die Namen und eine zum Filtern. Um die gewünschte Reihenfolge in der Frage zu erreichen, habe ich links die Hilfsspalte für die Namen eingefügt. Die Formel in A2:
=IF(C2=C1,A1& ", " &B2,B2)
Spalte C ist bei mir die Adressspalte. Sie prüft, ob die Adresse in der aktuellen Zeile mit der in der vorherigen Zeile übereinstimmt. Wenn nicht, bedeutet das, dass es sich um eine neue Adresse handelt, und fügt den zugehörigen Namen ein. Wenn es dieselbe Adresse wie die vorherige ist, wird ein Komma und der Zeilenname mit dem Ergebnis in der vorherigen Zeile verknüpft (Sie können also eine beliebige Anzahl übereinstimmender Adressen haben).
Die Hilfsspalte D prüft, ob die Adresse der Zeile die letzte für diese Adresse ist (d. h., die Adresse der nächsten Zeile ist anders). Die Formel in D2:
=C2<>C3
Nachdem Sie die Formeln in die Spalten eingetragen haben, klicken Sie im Menü auf D1 und Autofilter. Deaktivieren Sie im Pulldown-Menü D1 die Option FALSE. Dadurch werden alle Zeilen ausgeblendet, die nicht die letzte Zeile für jede Adresse sind.
Wenn Sie eine permanente, „saubere“ Liste wünschen, kopieren Sie die gewünschten gefilterten Spalten und fügen Sie sie an einer neuen Stelle ein. Nur die sichtbaren werden kopiert, wie in meinen Spalten F und G unten:
Sie können einfügen, während der Filter aktiviert ist. Wenn Sie jedoch in einen Bereich einfügen, für den Zeilen ausgeblendet sind, bleiben einige Ihrer Ergebnisse ausgeblendet, bis Sie den Filter deaktivieren.
Antwort3
Ich möchte eine UDF (User Defined Function) vorschlagen, die das Problem lösen wird.
Wie es funktioniert:
- Ich gehe davon aus, dass die Quelldaten im Bereich liegen
A2:B8
. Geben Sie diese Array (CSE) Formel in ein
E2
, beenden Sie mitStrg+Umschalt+Eingabe& Abfüllen.{=INDEX($B$2:$B$8, MATCH(SMALL(IF(COUNTIF($E$1:E1, $B$2:$B$8)=0, COUNTIF($B$2:$B$8, "<"&$B$2:$B$8), " "), 1), COUNTIF($B$2:$B$8, "<"&$B$2:$B$8), 0))}
KopierenUndPasteunten angezeigter Code als Modul.
Function ExtractinOneCell(LookupValue As String, LookupRange As Range, ColumnNumber As Integer, Char As String) Dim I As Long Dim xRet As String For I = 1 To LookupRange.Columns(2).Cells.Count If LookupRange.Cells(I, 2) = LookupValue Then If xRet = "" Then xRet = LookupRange.Cells(I, ColumnNumber) & Char Else xRet = xRet & "" & LookupRange.Cells(I, ColumnNumber) & Char End If End If Next ExtractinOneCell = Left(xRet, Len(xRet) - 2) End Function
Geben Sie diese Formel ein
D2
und füllen Sie sie aus.=ExtractinOneCell(E2,$A$2:$B$8,1,", ")