Comparing and counting values

僤鯓⒐⒋嵵緔 提交于 2019-12-13 04:48:29

问题


I have a table, let's call it my Individuals Table, much like the one below, containing a column of individuals along with their corresponding codes listed in an adjacent cell. Codes for each individual are all listed within the same adjacent cell next to the individual's name, and separated by a carriage return.

Example table

What I'd like to do is the following:

  • Run through the code cell for each individual

  • For each code in the individual's code cell, check if this code exists in a separate Codes Table

  • If the code exists in the Codes Table, add n+1 to the total count for that code in an adjacent cell and add the individual's name to the list of individuals with that same code in another adjacent cell.

  • If the code does not exist in the Codes Table, add the code to the Codes Table, add n+1 to the total count for that code in an adjacent cell and add the individual's name to the list of individuals with that same code in another adjacent cell.

Result of running the algorithm on the example table

If a similar program can achieve the same results, then I'm open to that too.


回答1:


I try to give you a possible solution, by minimizing the use of VBA code.

As starting point I would do is rearranging codes for every individuals. Keeping more codes in a single cell separed by a return it is not as easy to manage like having a single code for each cell. Of course I will keep each code associated with each individual. A way to do it is with your data is by using the formula substitute and replace the returns characters with a semicolon. The formula works this:

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

B2 is the cell where you are converting returns to semicolon. You will then use this formula for all values in your B column.

Once you have replaced returns with semicolon, copy and paste values and then with the function "Text to Columns" in Data tab you will convert each cell to a series of columns (depending on how many codes you had listed in the original cell of your sheet). Now you will be in a situation where the first column you have the names of individuals, and then on the same row in the subsequent columns you have all associated codes, like in the picture here below:

In order to create a complete list of all codes you can easily copy all columns with codes. Paste the codes in a suitable space (I suggest in a new worksheet), and then with some copy and paste jobs put all codes under the same column. Select all codes and with the button "Remove Duplicates" always in the Data tab you will have a list of all unique codes included in your original table.

Then you can copy and paste the column with all unique codes you created under your "Codes" column. Now you can count the codes in the converted table with this formula:

=COUNTIF($B$1:$C$4, D2)

Where first argument of COUNTIF refers to the codes in the converted table and the second argument is a code in your column "Codes" where you pasted the unique codes.

Now as far as I know there is no function in Excel to create a list of names separated by commas (but I would be glad to discover that it exists if anybody knows!!!). Therefore I created a custom one with some VBA code with the name List Individuals:

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

So last step is to use this formula under your "Individuals" cells as follows:

=ListIndividuals(D2,$A$13:$A$16,$D$13:$E$16)

Where first argument is the Code, the second one is the list of individuals in the converted table (it should be the first column), then the third one are the columns with the codes in the converted table. As a result of this custom formula you will have the list of individuals separated by commas.

All above works on my computer, but if you need more information, please do not hesitate to contact me.



来源:https://stackoverflow.com/questions/33973561/comparing-and-counting-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!