定期删除重复的单元格

Posted

技术标签:

【中文标题】定期删除重复的单元格【英文标题】:Deleting periodically repeating duplicated cells 【发布时间】:2015-10-15 15:46:56 【问题描述】:

我在删除以下工作表中的重复单元格时遇到问题。 Col E 是小时,col F 是我想要组织的时间戳的分钟数。我想做的是在一小时内删除所有包含重复分钟的行,这样我就可以每 5 分钟获得一次电流和功率的读数。问题是,有时你会在一分钟内获得 5 个读数,有时是 6 个读数(因为读数是每 9、10 或 11 秒进行一次)。另一个问题是,我不能简单地删除一天内所有重复的单元格,因为模式每小时都会重复一次,因此如果我简单地选择所有单元格,我只剩下一小时的读数。

我在下面的代码中尝试的是通过双击第一个“E”单元格在一小时内删除所有具有双分钟值的行,该单元首先出现该小时。它在第一个小时 (0:00-0:55) 内正常工作,但对于后面的数字(小时),它开始删除其他行。 下一个合乎逻辑的步骤当然是删除一天内的所有双精度值。

整个事情不需要用户友好或交互,我只想过滤掉 5 分钟的阅读,如果没有别的,将它们粘贴到新的工作表中以供进一步分析。

这是工作表的printscreen,包含数据

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim clickedRow As Long
Dim clickedValue As Long
Dim currentValue As Long
Dim counter As Long

clickedRow = ActiveCell.Row
clickedValue = ActiveCell.Value

For i = clickedRow To (clickedRow + 100)
    currentValue = Range("E" & i).Value
    If (clickedValue = currentValue) Then
        counter = counter + 1
    Else
        Exit For
    End If
Next i

ActiveSheet.Range("A" & clickedRow, "Y" & counter).RemoveDuplicates Columns:=6, Header:=xlNo

End Sub

我尝试了另一件事,但没有证明有效,因为它隐藏了所有重复的单元格,没有遗漏一个:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim clickedRow As Long
Dim clickedValue As Long
Dim currentValue As Long
Dim zadnja As Long
Dim trenutna As Long

clickedRow = ActiveCell.Row
clickedValue = ActiveCell.Value

For i = clickedRow To (clickedRow + 100)

    currentValue = Range("E" & i).Value

    If (currentValue = clickedValue) Then

        zadnja = 5
        trenutna = Range("F" & i).Value

        If (trenutna = zadnja) Then
            Range("E" & i).EntireRow.Hidden = True
        Else
        End If

        zadnja = trenutna

    Else
        Exit For
    End If

Next i

End Sub

【问题讨论】:

我认为 Excel 的删除重复项功能对您不起作用,但您能否解释一下原因,以便我更好地了解如何提供帮助? 不,它不会,因为在分钟列“F”中,值 0、5、10、...、55 每小时重复 5 到 6 次。这是小时值为 1 的另一个打印屏幕:shrani.si/f/43/TU/1UedFbE2/untitled1.jpg 请原谅,因为我是社区的新手,但是有没有办法可以上传整个工作表?我在尝试发布图片时已经遇到了一些问题。谢谢 - 编辑:我将工作表上传到 Google 云端硬盘,您可以在 drive.google.com/file/d/0BzWlcx6eE4TbcENDU3VOVjVZalk/… 上查看它 小时和分钟都使用一个列对您来说会更容易吗? CEILING function 或 FLOOR function 之类的东西可以舍入到 5 分钟的间隔。例如=FLOOR(C2, TIME(0, 5, 0)). 吉普车,不确定这是否可行。我故意将两者分开,以便可以分别比较它们的值。如果您可能有用于类似问题的函数示例,我很乐意查看。谢谢 【参考方案1】:

当您使用Range.RemoveDuplicates method 时,您需要同时考虑小时和分钟。目前,您仅将重复标准基于分钟(例如 Columns(6))。

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    On Error GoTo bm_Safe_Exit
    If Not Intersect(Target, Union(Columns(5), Columns(6))) Is Nothing Then
        Cancel = True
        Dim xlOriginalCalculation As Long, fr As Long, er As Long, tr As Long
        Application.EnableEvents = False
        xlOriginalCalculation = Application.Calculation
        Application.Calculation = xlCalculationManual

        tr = Target.Row
        fr = Application.Match(Cells(tr, 5).Value, Columns(5), 0)
        If Target.Column = 6 Then
            fr = fr + Application.Match(Cells(tr, 6).Value, Cells(fr, 6).Resize(1440, 1), 0) - 1
            er = fr + Application.CountIfs(Columns(5), Cells(tr, 5).Value, Columns(6), Cells(tr, 6).Value) - 1
        Else
            er = fr + Application.CountIfs(Columns(5), Cells(tr, 5).Value) - 1
        End If

        If fr <> er Then
            With Range("A" & fr & ":Y" & er)
                .RemoveDuplicates Columns:=Array(5, 6), Header:=xlNo
            End With
            With Range("A:Y")
                .Cells.Sort key1:=.Columns(5), order1:=xlAscending, _
                            key2:=.Columns(6), order2:=xlAscending, _
                            Orientation:=xlTopToBottom, Header:=xlYes
            End With
        End If
    End If

bm_Safe_Exit:
    Application.EnableEvents = True
    Application.Calculation = xlOriginalCalculation

End Sub

根据小时和分钟删除重复项,这样第 0 小时的第 55 分钟就不会与第 1 小时的第 55 分钟混淆。

如果双击 MINS 列(F 列),则会根据分钟对数据进行重复数据删除。如果双击 HRS 列,则会删除该小时的所有数据。

ActiveSheet 不需要带有工作表代码表。

【讨论】:

吉普车,谢谢您的回答。我们快到了:现在当我双击一个小时,在给定的一组分钟旁边,它会删除重复的分钟。为了加快这个过程,我想要的是,当双击包含给定小时的单元格(例如:1)时,我们只剩下 1:05、1:10、...、1:55。我将尝试使用 for 循环,如果我有任何成功,我会回帖 我尝试将第二个 if 语句(内部语句)放入 for 循环中,并在循环结束时增加 fr = fr + 1 并计算 er = fr + App...(如上),但结果是一样的。基本上我们想要首先:删除重复的单元格,第二个:对单元格进行排序,第三个:移动到下一行并重复前两个步骤。 与其永久删除其他记录,不如按小时过滤并仅显示 01:00、01:05、01:10等? 这也是一种可能。但正如我所说,我无法让它与 for 循环一起工作(通过所有时间) 我添加了一个条件,如果双击的是 HRS 列,那么该小时的所有数据都会被删除。

以上是关于定期删除重复的单元格的主要内容,如果未能解决你的问题,请参考以下文章

连续删除重复的单元格

Excel - 如何删除数据集中单元格B为空的所有行[重复]

如何删除单元格 Hive 表中的重复值

删除表格中的重复单元格

定期更改 UICollectionView 单元格图像

Excel 是不是可以识别单元格中以逗号分隔的数字模式并删除该模式的重复项?