删除重复项,保留最后一个条目——优化

2023-12-09

我正在开发一个宏,它将遍历电子表格并根据两列(Q 列和 D 列)中分别提供的两个条件删除重复的条目(行)。

这是我所拥有的。我在一个小数据集上测试了它,它是slow.

Sub RemoveDupesKeepLast()
dim i As Integer
dim criteria1, criteria2 As String

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

'start at bottom of sheet, go up
For i = ActiveSheet.UsedRange.Rows.Count to 2 Step -1

    'if there is no entry, go to next row
    If Cells(i, "Q").Value = "" Then
        GoTo gogo:
    End If

    'set criteria that we will filter for
    criteria1 = Cells(i, "D").Value
    criteria2 = Cells(i, "Q").Value

    'filter for criteria2, then criteria1 to get duplicates
    ActiveSheet.Range("A":"CI").AutoFilter field:=17, Criteria1:=criteria2, Operator:=xlFilterValues
    ActiveSheet.Range("A":"CI").AutoFilter field:=4, Criteria1:=criteria1, Operator:=xlFilterValues

    'if there are duplicates, keep deleting rows until only bottom-most entry is left behind
    Do While Range("Q2", Cells(Rows.Count, "Q").End(xlUp)).Cells.SpecialCells(xlCellTypeVisible).Count > 1
        ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1,17).EntireRow.Delete
    Loop

    'reset autofilter
    If ActiveSheet.FilterMode Then
        Cells.AutoFilter
    End If

gogo:
Next i

Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

有什么不同的方法可以解决这个问题来加快速度吗?现在,我基本上会检查每一行,直到到达顶部。实际上,工作表的行数从 30,000 行到最大行数不等。在我看来,应该有一种更快、更干净的方法来实现我想要做的事情,但我似乎想不出一种方法。


此过程删除由 D 列和 Q 列标识的所有重复行。 在重复项中,它将保留最靠近工作表底部的行。 基本上,在右侧创建一个索引列来对底部的所有重复行进行排序和移动,以便可以在一次调用中删除它们。 请注意,它不会更改单元格公式或格式(如果有)。

Sub DeleteDuplicatedRows()
  Dim rgTable As Range, rgIndex As Range, dataColD(), dataColQ()

  Set rgTable = ActiveSheet.UsedRange

  ' load each column representing the identifier in an array
  dataColD = rgTable.Columns("D").value  ' load values from column D
  dataColQ = rgTable.Columns("Q").value  ' load values from column Q

  ' get each unique row number with a dictionary
  Dim dict As New VBA.collection, indexes(), r&, rr
  On Error Resume Next
  For r = UBound(dataColD) To 1 Step -1
    dict.Add r, dataColD(r, 1) & vbNullChar & dataColQ(r, 1)
  Next
  On Error GoTo 0

  ' index all the unique rows in an array
  ReDim indexes(1 To UBound(dataColD), 1 To 1)
  For Each rr In dict: indexes(rr, 1) = rr: Next

  ' insert the indexes in the last column on the right
  Set rgIndex = rgTable.Columns(rgTable.Columns.count + 1)
  rgIndex.value = indexes

  ' sort the rows on the indexes, duplicates will move at the end
  Union(rgTable, rgIndex).Sort key1:=rgIndex, Orientation:=xlTopToBottom, Header:=xlYes

  ' delete the index column on the right and the empty rows at the bottom
  rgIndex.EntireColumn.Delete
  rgTable.Resize(UBound(dataColD) - dict.count + 1).offset(dict.count).EntireRow.Delete

End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除重复项,保留最后一个条目——优化 的相关文章

  • SQL Excel VBA 运行时错误 3709 无效连接

    这是我的第一个问题 欢迎提出建设性的批评 我正在尝试从 Excel VBA 查询 Access 数据库并将返回信息放入 Excel 范围中 我收到此错误 错误消息 运行时错误 3709 连接无法用于 执行此操作 在此情况下它已关闭或无效 语
  • Excel 2003 中的 IFERROR

    我通过阅读几个线程了解到IFERROR在 Excel 2003 中由IF ISERROR 我尝试从 Excel 2007 复制的代码是 IFERROR A1 我知道必须有一个简单的解决方案将其转换为IF ISERROR 但我没有任何效果 意
  • 使用 ADODB 连接从关闭的工作簿中检索数据。某些数据被跳过?

    我目前正在编写一些代码 可以通过 ADODB 连接访问单独的工作簿 由于速度的原因 我选择了这种方法而不是其他方法 下面是我的代码 Sub GetWorksheetData strSourceFile As String strSQL As
  • 使用 VBScript 在日期字段值上选择错误的数据

    我有一张包含以下数据的表 现在 Excel 共有 36 个任务 每个任务有 4 列 第一个任务 即 Task1 名称将始终从 L 列开始 144 列描述了 36 个任务 现在我们需要按行进行检查 并需要检查 TNStart 开始日期 你们能
  • 使用 split 函数到数组中会导致编译错误:无法分配给数组

    我正在尝试使用split 函数根据给定名称字符串中的空格拆分名称 当尝试编译我在下面编写的代码时 出现编译错误 无法分配给数组 我几乎从这里复制了微软的示例 https support microsoft com en us kb 2662
  • 如何使用vba复制Excel工作表中的动态范围

    我试图使宏中的范围是动态的 而不指定最后一行x Sheets SheetName Range A2 K1000 Copy在 1000 行中 我想将其更改为动态 因为有时我的数量会更少或更多 尝试这个 Sub Test Dim lRow as
  • 使用 XMLHTTP 进行抓取会在特定类名处引发错误

    我正在尝试使用此代码抓取网站以提取姓名和联系人 Sub Test Dim htmlDoc As Object Dim htmlDoc2 As Object Dim elem As Variant Dim tag As Variant Dim
  • 读取上传的Excel文件而不保存它

    在这段代码中 我从用户那里获取上传的文件并将其保存在我的应用程序中的文件夹中 然后对此 Excel 文件进行 OleDbConnection 并读取数据 我的问题是 有人可以建议一种阅读此 Excel 文件的首选方法 但无需预先保存它 因为
  • 在 Excel 中自动复制和粘贴特定范围的最佳方法是什么?

    我对 VBA 非常陌生 我想自动化一项任务 但不知道从哪里开始 我有一个如下所示的数据集 样本数据 https i stack imgur com jxqFI png 我想做的是循环遍历 A 列 如果其中有内容 始终是电子邮件 请选择所有行
  • 将 Excel 读取到从第 5 行开始并包括标题的 Python 数据框

    我有一个 Excel 工作簿 它在打开时运行一些 vba 刷新数据透视表并执行其他一些操作 然后我希望将数据透视表刷新的结果导入到 python 中的数据框中以进行进一步分析 import xlrd wb xlrd open workboo
  • 数据透视表错误 |无效的调用或过程

    我需要一些帮助来解决这个问题 我正在尝试创建一个数据透视表 从第一季度开始 在同一张表中包含一系列数据 第一个 if 语句在那里是因为最后一列并不总是包含标题 所以我将其包含在那里 我希望范围是动态的 因为所制作的表格的大小将根据工作表中数
  • Excel - 公式或宏根据链接到另一个单元格的另一个单元格填充单元格

    在 Excel 中 我试图根据其他两个单元格中包含的值创建一个单元格 我需要单元格 X 和 Y 来获取基于单元格 L 和 的数据 就像这样 X Y L 1 2 3 4 5 6 A 6 1 1 6 1 6 1 7 1 7 2 7 2 8 1
  • Excel 2007 从 C# get_Value 始终返回 -2146826265

    我有一个引用 Microsoft Excel 12 0 对象库的小型 C 应用程序 除此之外 它还从 Excel 单元格读取值 它从一些较旧的 Excel xls 文件和一些 2007 文件 xlsx 中读取此值 所有 xls 文件的值都会
  • Pandas.read_excel 有时会错误地将布尔值读取为 1/0

    我需要将一个非常大的 Excel 文件读入 DataFrame 中 该文件包含字符串 整数 浮点和布尔数据 以及丢失的数据和完全空的行 还值得注意的是 某些单元格值源自单元格公式和 或 VBA 尽管理论上这不会影响任何内容 正如标题所示 p
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 使用 Excel VBA 循环工作簿文件夹并将所有工作表导出为制表符分隔文本

    我拼凑了一个 Excel VBA 脚本 该脚本将打开的工作簿中的所有工作表写入单独的制表符分隔文件 这仍然是 宏 吗 我正在 Excel 真空中学习这一点 它一次只处理一本工作簿 效果很好 这里是 Sub exportSheetsToTex
  • 如何获取活跃的Excel实例?

    我有一个 C 应用程序 该应用程序根据用户需求将信息粘贴到 excel 背后的逻辑是这样的 如果没有正在运行的 excel 实例 它会创建一个实例并粘贴到该实例 如果只有一个实例在运行 它会尝试获取该实例并使用它 这是我用来执行此操作的代码
  • 有什么办法可以加快这个 VBA 算法的速度吗?

    我正在寻找实现 VBAtrie http en wikipedia org wiki Trie 构建能够在相对较短的时间内 少于 15 20 秒 处理大量英语词典 约 50 000 个单词 的算法 由于我实际上是一名 C 程序员 这是我第一
  • Excel VSTO 工作簿新活动

    在 Excel 2007 的一个 Excel 插件项目中 我需要检查创建新工作簿的事件 我还需要捕捉 Workbook Open 事件 我很容易做到这一点 在我在互联网上的研究中 我发现了以下内容 打开任何工作簿时都会引发 Applicat
  • 在 Excel 中查找结果将行复制到另一张工作表

    我需要一些帮助将数据从一个 Excel 工作表复制到另一个 例如 样本数据 A B C 1 aaa bbb ddd 2 bbb ccc eee 2 bbb ccc eee 3 ccc fff rrr 4 ccc fff ttt 5 ddd

随机推荐

  • 如何给textBox赋予初始值?

    我希望我的 C 程序具有其初始值textboxes 例如 在其中一个textboxes 应该说 Please enter your name 当您单击 或 tabStop textbox 初始值应该消失 用户将能够输入他们的输入textbo
  • PDFBox:从 ​​JAR 资源将图像加载到 PDF 中

    下午好 我有一个 JAR 文件 我已将一些图像作为资源附加到名为 logos 的文件夹中 由于安全限制 我被告知这样做 我们不希望图像文件与 JAR 暴露在同一文件夹中 我首先尝试加载这些图像 就好像它们是 File 对象一样 但这显然不起
  • 在 C# 中解密使用 3DES 加密的 ColdFusion 中的字符串

    我们在 ColdFusion 中解密之前使用 3DES 和 C 加密的字符串时遇到困难 这是我们最初用来加密字符串的代码 public static string EncryptTripleDES string plaintext stri
  • JAX-RS 使用的无状态 EJB 中的 @Context 注入

    我有类似下面的设置 这是一个简化版本 但我认为它传达了基本思想 我正在使用 Jersey 2 16 Java 1 8 和 Glassfish Open Source 4 1 public interface IReportService S
  • R model.matrix 中缺少级别

    我正在尝试将带有分类变量的数据框转换为 model matrix 但丢失了变量级别 这是我的代码 df1 lt data frame id 1 200 y rbinom 200 1 5 var1 factor rep c abc def g
  • 如何在 Flutter 中创建 GridView 布局

    我正在尝试在 flutter 中布局 4x4 的瓷砖网格 我设法用列和行来做到这一点 但现在我发现了GridView成分 任何人都可以提供一个关于如何使用它来做到这一点的例子吗 我无法真正理解这些文档 我似乎没有得到我想要的结果 使用适合您
  • 使用 JavaScript 删除 Google 地图上的众多标记之一

    我目前使用下面的代码向地图添加标记 我希望能够通过推送 JavaScript 命令随时删除任何一个 这可能吗 前任 放置 5 个标记 删除第 3 个标记 同时保留其他 4 个标记 map show var geocoder new goog
  • 如何在Python中实现类似C的unsigned int 32而不需要外部依赖?

    我需要一个类来保留 Python 的所有功能int类 但确保其结果在 32 位整数内 就像 C 编程语言一样 该类型必须是 有毒的 对 int 执行操作 并且该类型应该导致返回该类型 正如其中一个答案所建议的我的另一个问题 我以前用过num
  • 禁用 Netbeans 自动 svn 忽略?

    如何停止 Netbeans 自动运行svn ignore ing swp files 我使用 Netbeans 作为主要开发环境 但我经常同时使用 gvim 进行快速编辑 gvim 创建带有 swp 扩展名的临时文件 Netbeans 似乎
  • 并行启动多个任务并在窗口中等待它们?

    如何在批处理脚本中并行执行一些任务并等待它们 command1 command3 command4 and command5 should execute in sequence say task1 command6 command7 an
  • 将 n 个项目排列在 k 个非空组中,使得每个组的最小元素和最大元素之间的差异最小化

    Given N有值的物品x 1 x n 和一个整数K找到一个线性时间算法来安排这些N中的项目K非空组 使得每个组中的范围 每个组中的最小和最大元素值 键之间的差异 最小化 因此范围的总和最小 例如给定N 4 K 2和元素1 1 4 3最小范
  • 如何更改来电时的来电振动级别?

    不知何故棘手的问题 我正在使用一款应用程序 用户可以通过该应用程序为不同的联系人设置来电自定义铃声和不同的振动级别 我一直坚持振动水平设置 我们可以设置振动水平 using Vibrator v Vibrator getSystemServ
  • data.table 连接中 i 表达式的 .SD 和 .SDcols

    我正在尝试根据联接将列的子集从 Y 复制到 X 其中列的子集是动态的 我可以很容易地识别这些列 names Y grep xxx names Y 但是当我尝试在 j 表达式中使用该代码时 它只给出列名 而不是列的值 这 SD and SDc
  • 当程序首次运行时,如何写出配置的空白版本? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我一直在用 C 制作一个命令行工具 最终我们使用了一些参数的配置 这些参数只需要设置一次 我没有为这些提供 UI 而是被告知只需设置一个空白配置 如果未设置值 则提供一条消息来说
  • PHP 替换特殊字符,如 à->a、è->e

    我有php文档signup php 它将表单 在form php文档中 的内容保存到MySQL库 当我想重新格式化输入内容时 问题就出现了 我想要解码 UTF 8 字符 例如 gt a first name POST first name
  • Bluez bluetoothctl 扫描与 hcitool 扫描

    我在 Raspberry Pi Buster 和 Stretch 上运行 bluez 5 50 我有一个 ble 传感器设备 仅当按下传感器设备上的按钮时才会公布数据 因此 广告是异步的 并且中间没有定期广告 并且所有数据包都是唯一的 没有
  • 如何让 python 只读取包含一首诗的文件中的每隔一行

    我知道读取每一行的代码是 f open poem txt r for line in f print line 如何让 python 只读取原始文件中的偶数行 假设行的编号从 1 开始 方法有很多种 这里简单介绍一下 with open p
  • 如何卸载jupyter

    我一直在尝试卸载jupyter 我尝试过以下命令 pip uninstall jupyter pip3 uninstall jupyter and rm rf Users user Library Jupyter 即使在运行所有这些命令后
  • C : typedef 结构名称 {...}; VS typedef struct{...} 名称;

    正如标题所说 我有这样的代码 typedef struct Book int id char title 256 char summary 2048 int numberOfAuthors struct Author authors typ
  • 删除重复项,保留最后一个条目——优化

    我正在开发一个宏 它将遍历电子表格并根据两列 Q 列和 D 列 中分别提供的两个条件删除重复的条目 行 这是我所拥有的 我在一个小数据集上测试了它 它是slow Sub RemoveDupesKeepLast dim i As Intege