如何将1添加到Excel中最近重复的行中?

如何将1添加到Excel中最近重复的行中?,excel,if-statement,repeat,Excel,If Statement,Repeat,我有一个数据集,excel中有6万多行,大约有20列。ID列有时会重复自身,我想添加一个列,该列仅在最近的行中返回1,仅当它重复自身时 这是一个例子。我有 ID DATE ColumnX AS1 Jan-2013 DATA AS2 Feb-2013 DATA AS3 Jan-2013 DATA AS4 Dec-2013

我有一个数据集,excel中有6万多行,大约有20列。ID列有时会重复自身,我想添加一个列,该列仅在最近的行中返回1,仅当它重复自身时

这是一个例子。我有

    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 
我一直在尝试使用sort和嵌套if的组合,但这取决于我的数据始终处于相同的顺序,以便它在前一行中查找ID


加分:考虑我的数据集如果对于Excel来说相当大,那么最有效的代码不会被处理器吞没,我们将不胜感激!p> 按ID排序,然后按日期升序。如果前一行具有相同的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
因此,您可以激活该工作表并获得行数

然后选择并自动筛选结果,并清除包含0或1的D列。然后根据mbroshi建议的值进行筛选,您可以说您已经在使用了。然后对每条记录执行一个循环,将值更改为1,但如果前面的值具有相同的ID,则返回0


根据您的处理器,我认为这不会超过一到两分钟运行。如果你真的发现了一些使用公式的东西,我很想看看

您可以使用的一种方法是将MSQuery指向您的表,并使用SQL应用业务规则。从积极的一面来看,在我对64k行的测试中,这运行速度非常快,只有几秒钟。一个巨大的缺点是查询引擎似乎不支持超过64k行的Excel表,但可能有办法解决这个问题。无论如何,我会提供解决方案,以防它给你一些想法

若要设置,请首先为数据集指定一个命名范围。我把它叫做我的桌子。拯救接下来,在第1行中选择表格右侧的一个单元格,然后单击“来自其他来源的数据”和“来自Microsoft Query的数据”。选择Excel文件*|确定,浏览您的文件。查询Wiz应该打开,显示MYTABLE可用,添加所有列。单击“确实取消”,然后单击“是”,您要继续编辑

MSQuery界面应该打开,单击SQL按钮并用以下代码替换代码。您需要编辑一些细节,例如文件路径。另外,请注意,我使用了不同的列名。这完全是我的妄想。喷气式飞机引擎非常挑剔,我想在构建这个引擎时排除与保留字的冲突

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将抱怨查询无法以图形方式表示。没关系。查询将执行-在此阶段运行可能需要比预期更长的时间。我不知道为什么,但它应该在后续刷新时运行得更快。结果返回后,文件|将数据返回Excel。接受“导入数据”对话框上的默认值

这就是技巧。要针对新数据刷新查询,只需数据|刷新即可。如果需要调整查询,可以通过Excel的“数据|连接|属性|定义”选项卡返回查询

我提供的代码返回您的原始数据和新的_数据列,如果ID重复,并且日期是该ID的最大日期,则该列的值为1,否则为0。如果ID的最长日期在几行上,则此代码不会对关系进行排序。所有这些行都将标记为1

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

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

在这种情况下,还可以使用alias DUPTABLE删除最后一个左连接。

在本例中,短语“最近”并不明显。您已经添加了1,其中包含Dec和Jan两行-至少据我所知,最近一行表示Dec。@EmmadCareem同一ID的最近一行。ID AS2有两个条目:2013年2月和2013年12月,因此最近一行是第二行。您的预期结果并没有显示您所述的业务规则。例如,您希望AS3为1,但此ID不会重复,因此为什么预期结果不是0?真正的问题:你是在试图识别每个ID的最新条目,还是除了过滤有重复的ID之外,你也在尝试这样做?@andyholaday嗨,这是每个ID的最新条目,但我想你在上一篇文章中已经明白了这一点!谢谢这正是我现在正在做的,但是我每个月都要添加数据,所以每次有6万多行时我都要做排序和拖动公式,它会消耗处理器。我想知道你是否测试过这个。我希望计数器溢出超过64k轻松修复:将数据类型更改为Long。除此之外,在超过50k行范围的IME中,使用过滤列表的速度会非常慢。谢谢!这一变通办法有些奏效。我想我只是简单地
不过,将整个数据库迁移到SQL,Excel对于这些事情来说是一件麻烦事……是的,对于这项工作来说,数据库是一个更好的工具。