有没有更快的 CountIF

2023-12-08

正如标题所说。是否有任何函数或 VBA 代码可以执行与 countif 相同的功能并且速度更快。目前正处于大规模计数阶段,它正在耗尽我的 CPU。

它只是工作表中的基本计数。不在 VBA 中。=countif(X:X,Y)然而,名单非常庞大。所以两个列表大约有 100,000~ 行


如果您可以不计算出现次数而只是想检查该值是否x存在于列中y's,然后返回布尔值 TRUE 或 FALSEISNUMBER 函数评价一个匹配功能查找将大大加快该过程。

=ISNUMBER(MATCH(S1, Y:Y, 0))

根据需要填写以获取所有回报。对返回的值进行排序和/或过滤以将结果制成表格。

附录:

显然是有的。的巨大改进匹配功能计算时间超过COUNTIF 函数让我想知道 MATCH 是否不能放入循环中,从而推进其中的第一个单元格查找数组参数为先前返回的行号加一,直到不再有匹配项。此外,后续查找相同数字(增加计数)的 MATCh 调用可能会变得越来越小查找数组通过按返回的行号调整(缩小)列的高度来调整单元格范围。如果处理后的值及其计数作为键和项存储在脚本字典中,则可以立即解决重复值,而无需处理计数。

Sub formula_countif_test()
    Dim tmr As Double
    appOFF
    tmr = Timer
    With Sheet2.Cells(1, 1).CurrentRegion
        With .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count) 'skip header
            .Cells(1, 3).Resize(.Rows.Count, 1).FormulaR1C1 = _
                "=countif(c1, rc2)"  'no need for calculate when blocking in formulas like this
        End With
    End With
    Debug.Print "COUNTIF formula: " & Timer - tmr
    appON
End Sub

Sub formula_match_test()
    Dim rw As Long, mrw As Long, tmr As Double, vKEY As Variant
    'the following requires Tools, References, Microsoft Scripting Dictionary
    Dim dVALs As New Scripting.dictionary
    
    dVALs.CompareMode = vbBinaryCompare  'vbtextcompare for non-case sensitive
    
    appOFF
    tmr = Timer
    
    With Sheet2.Cells(1, 1).CurrentRegion
        With .Offset(1, 0).Resize(.Rows.Count - 1, .Columns.Count) 'skip header
            For rw = 1 To .Rows.Count
                vKEY = .Cells(rw, 2).Value2
                If Not dVALs.Exists(vKEY) Then
                    dVALs.Add Key:=vKEY, _
                        Item:=Abs(IsNumeric(Application.Match(vKEY, .Columns(1), 0)))
                    If CBool(dVALs.Item(vKEY)) Then
                        mrw = 0: dVALs.Item(vKEY) = 0
                        Do While IsNumeric(Application.Match(vKEY, .Columns(1).Offset(mrw, 0).Resize(.Rows.Count - mrw + 1, 1), 0))
                            mrw = mrw + Application.Match(vKEY, .Columns(1).Offset(mrw, 0).Resize(.Rows.Count - mrw + 1, 1), 0)
                            dVALs.Item(vKEY) = CLng(dVALs.Item(vKEY)) + 1
                        Loop
                    End If
                    .Cells(rw, 3) = CLng(dVALs.Item(vKEY))
                Else
                    .Cells(rw, 3) = CLng(dVALs.Item(vKEY))
                End If
            Next rw
        End With
    End With
    Debug.Print "MATCH formula: " & Timer - tmr
    dVALs.RemoveAll: Set dVALs = Nothing
    appON
End Sub

Sub appON(Optional ws As Worksheet)
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
End Sub

Sub appOFF(Optional ws As Worksheet)
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
End Sub

        Sample Data for MATCH_COUNTIF

我使用了 10K 行,其中 A 列和 B 列填充为RANDBETWEEN(1, 999)然后复制并粘贴为值。

Elapsed times:
 
    Test 1¹ - 10K rows × 2 columns filled with RANDBETWEEN(1, 999)
        COUNTIF formula:           15.488 seconds
        MATCH formula:                1.592 seconds 
 
    Test 2² - 10K rows × 2 columns filled with RANDBETWEEN(1, 99999)
        COUNTIF formula:           14.722 seconds
        MATCH formula:                3.484 seconds 
 
I also copied the values from the COUNTIF formula into another column and compared them to the ones returned by the coded MATCH function. They were identical across the 10K rows. 
   ¹ More multiples; less zero counts 
   ² More zero counts, less multiples 

虽然数据的性质显然会产生显着差异,但编码的 MATCH 函数每次都优于本机 COUNTIF 工作表函数。

不要忘记 VBE 的工具 ► 参考资料 ► Microsoft 脚本词典。

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

有没有更快的 CountIF 的相关文章

  • Perforce Excel 文件差异

    我有一堆 excel 文件放在 perforce 上 我想对这些 excel 文件进行 diff 类似于我在 perforce 中对其他文件 如 java cs 等 所做的操作 我尝试寻找一个插件 发现 P4OFC 只适合对 word 文件
  • 如何模拟“焦点”和“打字”事件

    尝试模拟 onfocus 和打字事件 但它不起作用 Sub Login MyLogin MyPass Dim IEapp As InternetExplorer Dim IeDoc As Object Dim ieTable As Obje
  • xlwings: 删除一个列 | Excel 中的行

    如何删除 Excel 中的一行 wb xw Book Shipment xlsx wb sheets Page1 1 range 1 1 clear clear 用于删除内容 我想删除该行 我很惊讶 clear 函数有效 但 delete
  • Excel 工作簿 - 从 C# 读取速度非常慢?

    正在尝试读取 Excel 工作簿 发现读取 3560 行 7 列的工作表需要很长时间 大约需要 1 分 17 秒 我所做的就是循环遍历整个工作表并将值存储在列表中 这是正常现象 还是我做错了什么 static void Main strin
  • 导出到excel时如何显示前导零?

    我正在通过更改内容类型来创建 Excel 报告 Response ContentType application vnd ms excel 我有包含前导零的值 问题是导出到 Excel 时缺少前导零 e g 000123 gt 123 我知
  • 如何找到特定程序的安装目录?

    我已经成功地编写了一些用于工作的 VBA 宏 这些宏基本上创建了一个数据文件 将其提供给一个程序并对该程序的输出进行后处理 我的问题是程序安装路径是硬编码在宏中的 并且安装在我同事的计算机上可能会有所不同 我首先想到的是 我可以从每个人那里
  • 使用 ObjPtr(Me) 返回自定义类实例的名称?

    我明白那个ObjPtr http support microsoft com kb 199824将返回内存中对象的地址 并且它指向一个名为 IUNKNOWN 的结构 并且其中编码了某种接口定义以公开对象结构 但我不知道如何确定一个对象的接口
  • 将包含宏的工作簿复制到不带宏的工作簿

    我能够复制工作簿 复制到所需位置 其中在后台包含宏 该副本还包含相同的宏 我的问题是我不希望这个重复的工作簿包含宏 谁能告诉怎么做吗 先感谢您 将您的工作簿保存为无宏 即简单地保存为 Excel 工作簿 对于我的 Excel 2007 这是
  • JasperReports 中每个工作表属性一页

    我有一个要求 我必须在 JasperReports 中设计一个报告 该报告有 4 页 第一张纸有 5 页 类似的其他纸有一页或两页 我面临的问题是 如果我使用net sf jasperreports export xls one page
  • VBA 中 AND 函数如何工作?

    如果这是一个愚蠢的问题 我很抱歉 但是 Excel VBA AND 函数是否检查其中的每个条件然后继续 或者在第一个 FALSE 条件处停止而不检查其他条件 我想知道出于优化目的 但到目前为止在网上没有找到任何相关信息 提前致谢 示例 如果
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • 输入新行并复制上面单元格中的公式

    我正在尝试创建一个 Excel 宏来执行以下操作 在文档末尾输入新行 复制上面单元格中的公式 到目前为止我有这个 Sub New Delta Go to last cell Range A4 Select Selection End xlD
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • 我如何以更好的方式编码而不是像这样的VBA编码

    我正在 Excel 中创建一个仪表板 但是我想知道是否有比这更好的编码方式 我想对其进行模块化 而不是这样做以使其更加整洁 Private Sub Afford If af Value True Then af afr Value Shee
  • SQL Excel VBA 运行时错误 3709 无效连接

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

    我正在与一个接口MS Excel文件通过Powershell 每个 Excel 文档可能有大约 1000 行数据 目前这个脚本似乎读取了Excel文件并以每 0 6 秒 1 条记录的速率将值写入屏幕 乍一看 这似乎非常慢 这是我第一次阅读E
  • Excel 2003 中的 IFERROR

    我通过阅读几个线程了解到IFERROR在 Excel 2003 中由IF ISERROR 我尝试从 Excel 2007 复制的代码是 IFERROR A1 我知道必须有一个简单的解决方案将其转换为IF ISERROR 但我没有任何效果 意
  • 如何在 Excel 中对“高”字符进行 HTML 编码或音译?

    在 Excel 中 如何将包含重音字符 大引号等的单元格内容转换为相同字符的 HTML 或音译纯文本版本 我们有一个 XLS 文档 其中包含一些 高 字符 数据已通过数据库连接提取 并且 Excel 似乎正确处理不同代码页中的各个单元格 或
  • 使用 split 函数到数组中会导致编译错误:无法分配给数组

    我正在尝试使用split 函数根据给定名称字符串中的空格拆分名称 当尝试编译我在下面编写的代码时 出现编译错误 无法分配给数组 我几乎从这里复制了微软的示例 https support microsoft com en us kb 2662
  • 在 VBA 中捕获 shell 命令的输出值?

    发现这个功能http www cpearson com excel ShellAndWait aspx http www cpearson com excel ShellAndWait aspx 但我还需要捕获 shell 的输出 有什么代

随机推荐

  • 无需 Firebase 云消息传递即可推送通知

    是否可以使用第 3 方服务来发送推送通知而不依赖 Google 的 Firebase 云消息传递 FCM 如果默认情况下应用程序中不包含 Firebase 包 那么创建 使用自定义框架是否可以具有与 Firebase 类似的功能集 或者 F
  • 将文本添加到字符串的开头

    在字符串开头添加新值最快的方法是什么 var mystr Doe mystr John mystr 这对你不起作用吗
  • 字符到字形映射表

    我正在关注apple com 上的文档 我设法得到The cmap encoding subtables 我100 知道platformID platformSpecificID是正确的 但是offset是可疑的 这是数据 array 3
  • 如何在opencl中创建离线编译并创建其二进制文件?

    在OpenCl的在线编译中 我们要做 program clCreateProgramWithSource context 1 const char source str const size t source size ret 但是 对于
  • Gradle 依赖项中的重复类

    我正在构建一个 Android 应用程序 并使用 recaptcha 和 easywsdl 存储库 这两个存储库都包含 okhttp 和 okio jar 并且在启动存在重复类的应用程序时出现错误 然而 这些并不相同 如果我从项目中排除 o
  • YouTube API 用于获取频道上的所有视频

    我们需要一个按 YouTube 频道名称排列的视频列表 使用 API 我们可以使用以下 API 获取频道列表 仅频道名称 https gdata youtube com feeds api channels v 2 q tendulkar
  • 在模态上滚动时防止触摸设备上的主体滚动

    我正在开发一个网络应用程序 该应用程序使用大量模态叠加层以及模态中的可滚动内容 在触摸设备上 特别是在 Android 上 移动浏览器希望滚动模式后面的正文内容 而不是模式内的实际可滚动内容区域 或者 如果内容确实滚动 当它到达可滚动区域的
  • 将 byte[] 转换为图像

    我已将图像上传到我的数据库中byte 现在我想把它展示出来 出现错误 用户代码未处理参数异常Parameter is not valid 在这一行 newImage System Drawing Image FromStream strea
  • 使用 JSoup 从表中提取数据

    我想使用 JSoup 框架提取该表 以将内容保存在 表 数组中 第一个 tr 标签是表头 以下所有内容 不包括在内 描述了该内容 table width 100 cellspacing 0 cellpadding 4 border 1 tr
  • 只允许图像FILE_UPLOAD

    基本上下面的代码只允许图片通过我添加的 mov and mp4到允许列表 但上传时它仍然输出该文件不是图像 只是想知道我哪里出了问题 帖子及形式
  • 如何使用手柄在android中缩放视图?

    我正在尝试实现一个手柄来缩放 android 中的视图 我不想使用多点触控之类的东西 而是希望能够仅用一根手指来调整图像大小 这是我的活动代码 我觉得好像我非常接近 但有五件事无法正常工作 缩放已关闭 它的增长速度比应有的要快得多 Solv
  • 在运行时确定泛型方法参数的类型

    给定一个具有以下结构的类 我试图确定泛型方法的调用者分配的参数 T 的类型 public class MyClass public
  • 使用 GKMatch 的 Game Center 多人游戏但似乎无法连接

    大家好 我是 iOS 游戏中心的新人 我正在尝试将使用匹配的多人游戏功能添加到我的游戏中并遵循文档 到目前为止 我的 2 个客户端可以成功获得匹配 即调用 matchmakerViewController didFindMatch 回调并传
  • 使用 Google Apps 脚本将数据从数组复制/推送到工作表范围,一次一行

    我在原始表上使用 getValues 创建了一个多维数组sheetValues 我想将sheetValues数组中的值复制到目标工作表中 如何将sheetValues数组每行的内容推送到目标工作表中 什么函数允许我将数组的每一行一次一行 检
  • 如何知道我在 Windows 批处理文件中连接的是哪个 SSID?

    目前 我有 2 个批处理文件 可以使用注册表编辑器打开和关闭代理 Like reg add HKCU Software Microsoft Windows CurrentVersion Internet Settings v ProxyEn
  • java 9未命名模块在调试时从两者读取包[X](使用IntelliJ)

    在我的项目中 我有一个使用多个第三方库的包 让我们看一下依赖树 INFO commons logging commons logging jar 1 2 compile INFO org apache directory studio or
  • id:css中的悬停id?是否可以?

    这是我的 html 代码 div div div div div div div div 这是我的 CSS 代码 这个悬停为什么不起作用 谁来帮帮我 我需要当我悬停 id 1时 将更改背景颜色 id 2 因为这些 div
  • XTS 将函数应用于一天中的时间子集?

    如何将汇总函数应用于一天中的时间子集 例如 r T16 00 T17 00 Value 我怎样才能应用类似的东西function x quantile x c 90 每天样本小时的价值 您可以使用apply daily在完成一天中的时间子集
  • 正则表达式匹配空格,但不在“字符串”中

    仅当空格未用双引号 括起来时 我才会查找匹配空格的正则表达式 例如 在 Mary had a little lamb 它应该匹配第一个和第二个空格 但不匹配其他空格 我想分割字符串only不在双引号内的空格处 也不在引号处 我正在使用 C
  • 有没有更快的 CountIF

    正如标题所说 是否有任何函数或 VBA 代码可以执行与 countif 相同的功能并且速度更快 目前正处于大规模计数阶段 它正在耗尽我的 CPU 它只是工作表中的基本计数 不在 VBA 中 countif X X Y 然而 名单非常庞大 所