我怎样才能在Excel中最近重复的行添加1?

我有一个数据集,在excel中有60多行,大约有20列。 “ID列”有时会重复自己,我想要添加一个列,只返回1是最近的唯一IF如果它重复自己的行。

这里是例子。 我有…

ID DATE ColumnX AS1 Jan-2013 DATA AS2 Feb-2013 DATA AS3 Jan-2013 DATA AS4 Dec-2013 DATA AS2 Dec-2013 DATA 

我想要…

  ID DATE ColumnX New Column AS1 Jan-2013 DATA 1 AS2 Feb-2013 DATA 0 AS3 Jan-2013 DATA 1 AS4 Dec-2013 DATA 1 AS2 Dec-2013 DATA 1 

我一直在尝试sorting和嵌套的组合,但它取决于我的数据总是在相同的顺序(以便它查找上一行中的ID)。

奖励点:考虑我的数据集,如果相当大的Excel,所以最有效的代码,不会吃掉处理器将不胜感激!

您可以使用的方法是将MSQuery指向您的表,并使用SQL来应用业务规则。 从积极的一面来看,这个速度非常快(在我testing64k行的时间里几秒钟)。 一个巨大的减去是查询引擎似乎不支持超过64k行的Excel表,但可能有办法解决这个问题。 无论如何,我提供的解决scheme,以防止它给你一些想法。

首先给你的数据设置一个命名的范围。 我把它叫做MYTABLE 。 保存。 接下来在第1行的表格右侧select一个单元格,然后单击Data | From other sources | from Microsoft Query Data | From other sources | from Microsoft Query Data | From other sources | from Microsoft Query 。 selectExcel Files* | OK Excel Files* | OK ,浏览您的文件。 查询Wiz应该打开,显示MYTABLE可用,添加所有的列。 单击取消(确实),然后单击Yes ,您要继续编辑。

MSQuery界面应该打开,点击SQLbutton,并用下面的代码replace。 您将需要编辑一些具体信息,例如文件path。 (另外,注意我使用了不同的列名,这是我的偏执狂,Jet引擎非常挑剔,我想排除与保留字的冲突,因为我build立了这个引擎。

 SELECT MYTABLE.ID_X, MYTABLE.DATE_X, MYTABLE.COLUMN_X, IIF(MAXDATES.ID_x IS NULL,0,1) * IIF(DUPTABLE.ID_X IS NULL,0,1) AS NEW_DATA FROM ((`C:\Users\andy3h\Desktop\SOTEST1.xlsx`.MYTABLE MYTABLE LEFT OUTER JOIN ( SELECT MYTABLE1.ID_X, MAX(MYTABLE1.DATE_X) AS MAXDATE FROM `C:\Users\andy3h\Desktop\SOTEST1.xlsx`.MYTABLE MYTABLE1 GROUP BY MYTABLE1.ID_X ) AS MAXDATES ON MYTABLE.ID_X = MAXDATES.ID_X AND MYTABLE.DATE_X = MAXDATES.MAXDATE) LEFT OUTER JOIN ( SELECT MYTABLE2.ID_X FROM `C:\Users\andy3h\Desktop\SOTEST1.xlsx`.MYTABLE MYTABLE2 GROUP BY MYTABLE2.ID_X HAVING COUNT(1) > 1 ) AS DUPTABLE ON MYTABLE.ID_X = DUPTABLE.ID_X) 

随着代码就位MSQuery将抱怨查询不能用graphics表示。 OK 。 查询将执行 – 在此阶段运行可能需要比预期更长的时间。 我不确定为什么,但是在后续的刷新中运行得更快。 一旦结果返回, File | Return data to Excel File | Return data to Excel 。 接受“导入数据”对话框中的默认值。

这是技术。 要刷新对新数据的查询,只需Data | Refresh Data | Refresh 。 如果您需要调整查询,可以通过Excel Data | Connections | Properties | Definition tab Excel回到它 Data | Connections | Properties | Definition tab Data | Connections | Properties | Definition tab

我提供的代码返回您的原始数据加上NEW_DATA列,如果ID是重复的,值为1 ,date是该ID的最大date,否则为0 。 如果一个ID的最大date在几行上,这个代码将不会sorting。 所有这样的行将被标记1

编辑:代码很容易修改,以忽略重复逻辑,并显示所有ID的最新行。 只需更改SELECT子句的最后一位即可读取

 IIF(MAXDATES.ID_x IS NULL,0,1) AS NEW_DATA 

在这种情况下,您也可以使用别名DUPTABLE删除最终的LEFT JOIN

按IDsorting,然后按DATE(升序)sorting。 如果前一行具有相同的ID,并且下一行具有不同的ID或者为空(对于最后一行),则将新列中的条目定义为1,否则为0。

这可以在VBA中完成。 我有兴趣知道这是可能的只是使用公式,我不得不做类似的事情之前。

 Sub Macro1() Dim rowCount As Long Sheets("Sheet1").Activate rowCount = Cells(Rows.Count, 1).End(xlUp).Row Columns("A:D").Select Selection.AutoFilter Range("D2:D" & rowCount).Select Selection.ClearContents Columns("A:D").Select ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _ ("B1:B" & rowCount), SortOn:=xlSortOnValues ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _ ("A1:A" & rowCount), SortOn:=xlSortOnValues ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.Apply Dim counter As Integer For counter = 2 To rowCount Cells(counter, 4) = 1 If Cells(counter, 1) = Cells(counter + 1, 1) Then Cells(counter, 4) = 0 Next counter End Sub 

所以你激活表单并获得行数。

然后select并自动筛选结果,并清除具有0或1的D列。 然后过滤值mbroshibuild议你说你已经在使用。 然后为每个logging执行一个循环,将值更改为1,但如果前面的值具有相同的ID,则返回0。

根据你的处理器,我不认为这将需要超过一两分钟的时间运行。 如果你发现使用公式的东西,我会有兴趣看到它!