我試着給你一個可能的解決方案,儘量減少使用VBA代碼。
作爲出發點,我會做的是重新爲每個人編碼。在一個單獨的單元格中保留更多的代碼,並不像單個代碼那樣易於管理。當然,我會保持每個代碼與每個人的關聯。一種方法是使用公式替換,並用分號替換返回的字符。該公式的工作原理如下:
=SUBSTITUTE(B2,CHAR(13),CHAR(59))
B2是您將單元格轉換爲分號的單元格。然後,您將使用此公式計算B列中的所有值。
一旦更換了分號,複製和粘貼值,並返回然後用功能「文本分列」中的數據選項卡,您將每個單元格轉換爲一系列的列(取決於你有多少代碼在上市您的工作表的原始單元格)。現在,你會在第一列中,您有個人的名字的情況,然後在同一行中,你擁有所有相關的代碼,也喜歡在這裏下面的圖片隨後的列:
爲了創建所有代碼的完整列表,您可以輕鬆地複製包含代碼的所有列。將代碼粘貼到合適的空間(我建議在一個新的工作表中),然後用一些複製和粘貼作業將所有代碼放在同一列下。選擇所有代碼,並在數據選項卡中始終使用「刪除重複項」按鈕,您將擁有包含在原始表中的所有唯一代碼的列表。
然後,您可以複製並粘貼您在「代碼」列下創建的所有唯一代碼的列。現在你可以用這個公式計算的轉換表的代碼:
=COUNTIF($B$1:$C$4, D2)
凡COUNTIF的第一個參數是指在轉換表,第二個參數的代碼是在您的專欄「代碼」代碼,您粘貼唯一的代碼。
現在據我所知在Excel中沒有函數來創建一個用逗號分隔的名稱列表(但如果有人知道,我會很高興地發現它存在!!!)。因此,我創建了一個自定義的一些VBA代碼與名稱列表個人:
Function ListIndividuals(refCode, NameRange As Range, CodesRange As Range) As String
'Check size in row number of NameRange and CodesRange is same, otherwise give error
If NameRange.Rows.Count <> CodesRange.Rows.Count Then
ListIndividuals = CVErr(xlErrRef)
Exit Function
End If
result = ""
For Col = 1 To CodesRange.Columns.Count
For n = 1 To CodesRange.Rows.Count
If CodesRange.Cells(n, Col).Value = refCode Then
If CodesRange.Cells(n, Col).Value <> "" Then
If result = "" Then
result = NameRange(n)
Else
result = result & ", " & NameRange(n)
End If
End If
End If
Next
Next
ListIndividuals = result
End Function
所以最後一步是如下使用這個公式在你的「個人」細胞:
=ListIndividuals(D2,$A$13:$A$16,$D$13:$E$16)
其中第一個參數是代碼,第二個是轉換表中的個人列表(它應該是第一列),然後第三個是轉換表中代碼的列。作爲這個自定義公式的結果,您將擁有以逗號分隔的個人列表。
以上所有都適用於我的電腦,但如果您需要更多信息,請不要猶豫與我聯繫。
優秀的解決方案和過程的解釋!謝謝。只是一件小事情 - 它是以下CHAR代碼,它用來替代分號的新行:= SUBSTITUTE(B4,CHAR(10),CHAR(45)) 除此之外,一切都很順利。 –
我相信CHAR代碼的差異可能是因爲我使用的是Mac,而您可能使用的是Windows。 – Michele