2

我发现了一些接近的文章,但与我正在尝试做的不同。我有一个包含 4 列重复数据的 Excel 文件,每列都根据来自不同工作表的数值进行排序。我需要确定四列的值匹配的 25 行(或多少?),并且行 ID 是最低的。大约有 250 行数据需要筛选,所以我只需要前 10% 的数据。我不必以这种方式处理它。如果不能在 Excel 中完成,我可以将这些数据转储到 Access 中。或者我可以在每个文本列旁边分配列(一种为第 1、2、3 和 4 列中的每个字段分配 ID 的方法)并使用这些值。只要结果有效,这种方法是可以协商的。这是我的数据在 Excel 中的样子:

     A      B      C      D
    abc    bcd    abc    def
    cde    fgh    def    bcd
    def    def    bcd    abc
    bcd    hji    xyz    lmn

所以在这种情况下,我想突出显示(或以某种方式识别)值“def”,因为它看起来最接近所有 4 列的顶部,因此它具有最低的行 ID。值“bcd”将在列表中排在第二位,因为它也在所有 4 个中都被识别并且具有较低的行 ID。任何建议,将不胜感激。我对 SQL 相当了解,所以如果您认为最好将其转储到数据库中,您可以建议一个很棒的查询。但理想情况下……将它保存在 Excel 中对我来说是最少的工作量。我对公式、条件格式等持开放态度。谢谢!!

4

3 回答 3

1

我想想出了一个相当酷的解决方案......

因此,假设您在 AD 列中有这些数据,例如从单元格 A2 开始。

现在,您知道您只需要 A 列中已经存在的值 - 否则它们不在所有 4 列中。

所以:

  • 在 E2 中,输入公式=Row()- 这基本上说明了 A 的值所在的位置
  • 在 F2 中,输入=Match($A2,B:B,0)- 这将在 B 列中找到 A2 值的第一个匹配项
  • 将该公式拖到 G2 和 H2 (分别在 C 和 D 中找到 A2 值的第一个匹配项)。
  • 在 I2 中,输入公式=Sum(E2:H2)

现在,为整个数据集向下拖动 E:H。

因此,如果 H = #N/A,这意味着值不在所有 4 列中并且 H 的值越低,匹配的排名越低 - (A 列的文本是您要匹配的值)。

现在您可以根据 H 列等进行排序,以满足您的需求。

希望这能解决问题(并且有意义)!

酷Q,顺便说一句!

于 2013-05-24T18:08:28.803 回答
0

需要澄清

当我第一次想出这个答案时,我使用了约翰在他聪明的 Excel 答案中使用的相同方法,即使用每列最小行数的总和来产生排名。这会在问题中产生样本结果,但请考虑以下修改后的测试数据:

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。按总和排名将宣布 XXX 获胜,即使如果您从第 1 行开始扫描 XXX,则必须一直到第 10 行才能到达最后一个 XXX,而如果您从第 1 行开始扫描 YYY,则只需向下到第 6 行即可到达最后一个年年。

在这种情况下,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

让我们创建一个名为ExcelItemsAccess 的已保存查询,以将条目串在一个长“列表”中......

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

现在我们可以找到为每个 ColNum 找到 Item 的最低 RowNum...

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
于 2013-05-24T18:56:30.500 回答
0

您是否拥有或可以创建所有可能的单元格值的主列表?如果是这样,那么 4 个数据列中的每一个上的一些简单 VLOOKUP 可以为每个唯一的单元格值提供每列中的行号。将 4 个结果相加并按总数排序。

如果您没有唯一值的主列表,我倾向于使用 Access,因为它是一组非常简单的查询来获得您想要的内容。

于 2013-05-24T18:01:38.697 回答