2015-11-28 155 views
0

我有一個表,我們將其稱爲我的個人表,非常類似於下面的表,其中包含一列個人以及相鄰單元格中列出的相應代碼。每個人的代碼都列在個人姓名旁邊的同一個相鄰單元格內,並由回車分隔。比較和計算值

Example table
Example table

我希望做的是以下幾點:通過爲每個

  • 代碼單元對於個人的代碼每個代碼

    • 運行請檢查此代碼是否存在於單獨的代碼表中

    • 如果代碼表存在的代碼,在相鄰小區中添加的n + 1到總計數爲代碼,並添加個人的姓名,以與另一個相鄰小區相同的碼的個人的列表。

    • 如果代碼不存在於代碼表存在,添加代碼到代碼表,在相鄰小區中添加的n + 1到總計數爲代碼,並添加個人的名字到在另一個相鄰單元中具有相同代碼的個人列表。

    Result of running the algorithm on the example table Result of running the algorithm on the example table

    如果類似的程序可以達到同樣的效果,然後我打開即得。

  • 回答

    0

    我試着給你一個可能的解決方案,儘量減少使用VBA代碼。

    作爲出發點,我會做的是重新爲每個人編碼。在一個單獨的單元格中保留更多的代碼,並不像單個代碼那樣易於管理。當然,我會保持每個代碼與每個人的關聯。一種方法是使用公式替換,並用分號替換返回的字符。該公式的工作原理如下:

    =SUBSTITUTE(B2,CHAR(13),CHAR(59)) 
    

    B2是您將單元格轉換爲分號的單元格。然後,您將使用此公式計算B列中的所有值。

    一旦更換了分號,複製和粘貼值,並返回然後用功能「文本分列」中的數據選項卡,您將每個單元格轉換爲一系列的列(取決於你有多少代碼在上市您的工作表的原始單元格)。現在,你會在第一列中,您有個人的名字的情況,然後在同一行中,你擁有所有相關的代碼,也喜歡在這裏下面的圖片隨後的列:

    Converted Reference Table

    爲了創建所有代碼的完整列表,您可以輕鬆地複製包含代碼的所有列。將代碼粘貼到合適的空間(我建議在一個新的工作表中),然後用一些複製和粘貼作業將所有代碼放在同一列下。選擇所有代碼,並在數據選項卡中始終使用「刪除重複項」按鈕,您將擁有包含在原始表中的所有唯一代碼的列表。

    然後,您可以複製並粘貼您在「代碼」列下創建的所有唯一代碼的列。現在你可以用這個公式計算的轉換表的代碼:

    =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) 
    

    其中第一個參數是代碼,第二個是轉換表中的個人列表(它應該是第一列),然後第三個是轉換表中代碼的列。作爲這個自定義公式的結果,您將擁有以逗號分隔的個人列表。

    以上所有都適用於我的電腦,但如果您需要更多信息,請不要猶豫與我聯繫。

    +0

    優秀的解決方案和過程的解釋!謝謝。只是一件小事情 - 它是以下CHAR代碼,它用來替代分號的新行:= SUBSTITUTE(B4,CHAR(10),CHAR(45)) 除此之外,一切都很順利。 –

    +0

    我相信CHAR代碼的差異可能是因爲我使用的是Mac,而您可能使用的是Windows。 – Michele