如何识别4列中具有最低行ID的文本值?
我发现了一些接近的文章,但与我正在做的不一样。 我有一个包含4列重复数据的Excel文件,每列都根据来自不同工作表的数值进行sorting。 我需要确定这四列的值匹配的25(左右?)行,并且行ID是最低的。 将有大约250行的数据进行筛选,所以我只需要最好的10%。 我不需要这样做。 如果这不能在Excel中完成,我可以将这些数据转储到Access中。 或者,我可以在每个文本列旁边分配列(一种为列1,2,3和4中的每个字段分配ID)并使用这些值。 只要结果有效,方法是可以谈判的。 这里是我的数据在Excel中的样子:
ABCD abc bcd abc def cde fgh def bcd def def bcd abc bcd hji xyz lmn
所以在这种情况下,我想突出(或以某种方式识别)值“def”,因为它看起来最接近所有4列的顶部,因此它有最低的行ID。 值“bcd”将在列表中第二位,因为它也被全部标识为4并且具有低行ID。 任何build议,将不胜感激。 我知道SQL相当好,所以如果你认为把它倒在数据库中是最好的,你可以build议一个很棒的查询。 但理想情况下…保持在Excel中对我来说是最less的工作量。 我打开公式,条件格式等,谢谢!
我想我想出了一个相当好的解决scheme…
所以,假设你在AD列中有这个数据,在A2单元格开始。
现在,你知道只有在列A中已经存在的情况下才需要值 – 否则它们不是全部4列。
所以:
- 在E2中,input公式
=Row()
– 这基本上说明A的值在哪里 - 在F2中,input
=Match($A2,B:B,0)
– 这将在列B中findA2的值的第一个匹配 - 将该公式拖到G2和H2(分别在C和D中findA2的第一个值)。
- 在I2中input公式
=Sum(E2:H2)
现在,将E:H拖放到整个数据集中。
所以,如果H = #N/A
,那么这意味着这些值不是全部4列,并且H的值越低,匹配的等级越低 – (列A的文本是您匹配的值) 。
现在你可以根据H列等进行分类,以满足你的需求。
希望这个窍门(而且是有道理的)!
酷Q,BTW!
你有,还是可以创build一个所有可能的单元值的主列表? 如果是这样,那么对于每个唯一的单元格值,4个数据列中的每一列上的一些简单的VLOOKUP可以给出每列中的行号。 加起来4个reesults然后sorting总数。
如果您没有唯一值的主列表,我倾向于访问Access,因为这是一个非常简单的查询来获得您想要的。
澄清需要
当我第一次提出这个答案的时候,我使用了John在他的聪明的Excel答案中使用的相同方法,即使用每列最小行数的总和来产生排名。 这会在问题中产生样本结果,但请考虑以下修改后的testing数据:
F1 F2 F3 F4 RowNum --- --- --- --- ------ XXX bar baz bat 1 foo XXX baz bat 2 YYY bar XXX bat 3 foo YYY baz bat 4 foo bar YYY bat 5 foo bar baz YYY 6 foo bar baz bat 7 foo bar baz bat 8 foo bar baz bat 9 foo bar baz XXX 10
XXX出现在第1,2,3和10行,因此总和为16.YYY出现在第3,4,5和6行,因此总和为18.按总数sorting将宣布XXX为赢家,即使如果您从第1行开始扫描XXX,则必须一直行到第10行才能到达最后一个XXX,而如果您从第1行开始扫描YYY,则只需要到第6行即可到达最后一行YYY。
在这种情况下,YYY应该是赢家吗?
(原始答案)
下面的代码将Excel数据导入到Access中并添加一个[RowNum]列
Sub ImportExcelData() On Error Resume Next '' in case it doesn't already exist DoCmd.DeleteObject acTable, "ExcelData" On Error GoTo 0 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "ExcelData", "C:\Users\Gord\Documents\ExcelData.xlsx", False CurrentDb.Execute "ALTER TABLE ExcelData ADD COLUMN RowNum AUTOINCREMENT(1,1)", dbFailOnError End Sub
所以现在我们在Access中有一个[ExcelData]表
F1 F2 F3 F4 RowNum --- --- --- --- ------ abc bcd abc def 1 cde fgh def bcd 2 def def bcd abc 3 bcd hji xyz lmn 4
让我们在Access中创build一个名为ExcelItems
的已保存查询,将条目串在一个长“列表”中。
SELECT F1 AS Item, RowNum, 1 AS ColNum FROM ExcelData UNION ALL SELECT F2 AS Item, RowNum, 2 AS ColNum FROM ExcelData UNION ALL SELECT F3 AS Item, RowNum, 3 AS ColNum FROM ExcelData UNION ALL SELECT F4 AS Item, RowNum, 4 AS ColNum FROM ExcelData
… …返回
Item RowNum ColNum ---- ------ ------ abc 1 1 cde 2 1 def 3 1 bcd 4 1 bcd 1 2 fgh 2 2 def 3 2 hji 4 2 abc 1 3 def 2 3 bcd 3 3 xyz 4 3 def 1 4 bcd 2 4 abc 3 4 lmn 4 4
现在我们可以find最低的RowNum,其中每个ColNumfindItem …
TRANSFORM Min(ExcelItems.[RowNum]) AS MinOfRowNum SELECT ExcelItems.[Item] FROM ExcelItems GROUP BY ExcelItems.[Item] PIVOT ExcelItems.[ColNum] In (1,2,3,4);
… …返回
Item 1 2 3 4 ---- - - - - abc 1 1 3 bcd 4 1 3 2 cde 2 def 3 3 2 1 fgh 2 hji 4 lmn 4 xyz 4
如果我们将查询保存为ExcelItems_Crosstab
那么我们可以使用它来排列出现在所有四列中的项目:
SELECT Item, [1]+[2]+[3]+[4] AS Rank FROM ExcelItems_Crosstab WHERE ([1]+[2]+[3]+[4]) IS NOT NULL ORDER BY 2
… …返回
Item Rank ---- ---- def 9 bcd 10