2列的快速比较方法[关闭]

2024-02-28

EDIT:对于我的解决方案,请使用类似的东西

 For i = 1 To tmpRngSrcMax
     If rngSrc(i) <> rngDes(i) Then ...
 Next i

速度大约快 100 倍。

我必须使用 VBA 比较包含字符串数据的两列。这是我的方法:

Set rngDes = wsDes.Range("A2:A" & wsDes.Cells(Rows.Count, 1).End(xlUp).Row)
Set rngSrc = wsSrc.Range("I3:I" & wsSrc.Cells(Rows.Count, 1).End(xlUp).Row)

tmpRngSrcMax = wsSrc.Cells(Rows.Count, 1).End(xlUp).Row
cntNewItems = 0

For Each x In rngSrc

tmpFound = Application.WorksheetFunction.CountIf(rngDes, x.Row)
Application.StatusBar = "Processed: " & x.Row & " of " & tmpRngSrcMax & " / " & Format(x.Row / tmpRngSrcMax, "Percent")
DoEvents ' keeps Excel away from the "Not responding" state

If tmpFound = 0 Then ' new item
    cntNewItems = cntNewItems + 1

    tmpLastRow = wsDes.Cells(Rows.Count, 1).End(xlUp).Row + 1  ' first empty row on target sheet
    wsDes.Cells(tmpLastRow, 1) = wsSrc.Cells(x.Row, 9)
End If
Next x

因此,我使用 For Each 循环来迭代第一 (src) 列,并使用 CountIf 方法来检查该项目是否已存在于第二 (des) 列中。如果没有,请复制到第一 (src) 列的末尾。

该代码可以工作,但在我的机器上,给定大约 7000 行的列大约需要 200 秒。我注意到 CountIf 直接用作公式时运行速度更快。

有人有代码优化的想法吗?


好的。让我们澄清一些事情。

所以专栏A has 10,000随机生成的值,列I has 5000随机生成的值。看起来像这样

我已经针对 10,000 个单元格运行了 3 个不同的代码。

the for i = 1 to ... for j = 1 to ...方法,你建议的方法

Sub ForLoop()

Application.ScreenUpdating = False

    Dim stNow As Date
    stNow = Now

    Dim lastA As Long
    lastA = Range("A" & Rows.Count).End(xlUp).Row

    Dim lastB As Long
    lastB = Range("I" & Rows.Count).End(xlUp).Row

    Dim match As Boolean

    Dim i As Long, j As Long
    Dim r1 As Range, r2 As Range
    For i = 2 To lastA
        Set r1 = Range("A" & i)
        match = False
        For j = 3 To lastB
            Set r2 = Range("I" & j)
            If r1 = r2 Then
                match = True
            End If
        Next j
        If Not match Then
            Range("I" & Range("I" & Rows.Count).End(xlUp).Row + 1) = r1
        End If
    Next i

    Debug.Print DateDiff("s", stNow, Now)
Application.ScreenUpdating = True
End Sub

席德的方法

Sub Sample()
    Dim wsDes As Worksheet, wsSrc As Worksheet
    Dim rngDes As Range, rngSrc As Range
    Dim DesLRow As Long, SrcLRow As Long
    Dim i As Long, j As Long, n As Long
    Dim DesArray, SrcArray, TempAr() As String
    Dim boolFound As Boolean

    Set wsDes = ThisWorkbook.Sheets("Sheet1")
    Set wsSrc = ThisWorkbook.Sheets("Sheet2")

    DesLRow = wsDes.Cells(Rows.Count, 1).End(xlUp).Row
    SrcLRow = wsSrc.Cells(Rows.Count, 1).End(xlUp).Row

    Set rngDes = wsDes.Range("A2:A" & DesLRow)
    Set rngSrc = wsSrc.Range("I3:I" & SrcLRow)

    DesArray = rngDes.Value
    SrcArray = rngSrc.Value

    For i = LBound(SrcArray) To UBound(SrcArray)
        For j = LBound(DesArray) To UBound(DesArray)
            If SrcArray(i, 1) = DesArray(j, 1) Then
                boolFound = True
                Exit For
            End If
        Next j

        If boolFound = False Then
            ReDim Preserve TempAr(n)
            TempAr(n) = SrcArray(i, 1)
            n = n + 1
        Else
            boolFound = False
        End If
    Next i

    wsDes.Cells(DesLRow + 1, 1).Resize(UBound(TempAr) + 1, 1).Value = _
    Application.Transpose(TempAr)
End Sub

我的(不知怎的)方法

Sub Main()
Application.ScreenUpdating = False

    Dim stNow As Date
    stNow = Now

    Dim arr As Variant
    arr = Range("A3:A" & Range("A" & Rows.Count).End(xlUp).Row).Value

    Dim varr As Variant
    varr = Range("I3:I" & Range("I" & Rows.Count).End(xlUp).Row).Value

    Dim x, y, match As Boolean
    For Each x In arr
        match = False
        For Each y In varr
            If x = y Then match = True
        Next y
        If Not match Then
            Range("I" & Range("I" & Rows.Count).End(xlUp).Row + 1) = x
        End If
    Next

    Debug.Print DateDiff("s", stNow, Now)
Application.ScreenUpdating = True
End Sub

结果如下

现在,您选择快速比较法 :)


填充随机值

Sub FillRandom()
    Cells.ClearContents
    Range("A1") = "Column A"
    Range("I2") = "Column I"

    Dim i As Long
    For i = 2 To 10002
        Range("A" & i) = Int((10002 - 2 + 1) * Rnd + 2)
        If i < 5000 Then
            Range("I" & Range("I" & Rows.Count).End(xlUp).Row + 1) = _ 
                 Int((10002 - 2 + 1) * Rnd + 2)
        End If
    Next i

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

2列的快速比较方法[关闭] 的相关文章

  • 无法在我的抓取工具中设置超时选项以防止无限循环

    我已经使用 IE 在 vba 中编写了一个脚本 在其搜索框中的网页中启动搜索 通过点击搜索按钮根据搜索填充结果 网页加载它是searchbox几秒钟后它就会打开 但是 我的下面的脚本可以处理这个障碍并以正确的方式执行搜索 现在 我有一个稍微
  • 使用 VBA 的下拉菜单

    我需要使用 VBA 从下拉菜单中选择特定选项 我怎样才能做到这一点 链接到我们试图从中提取的网页 IE document getElementsByName down count click 我尝试过的代码 Full Module Priv
  • 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
  • 合并和颜色样式不适用于 Apache POI excel 2003 格式

    在 Apache POI 中 我为某些单元格应用了一些样式并合并了这些单元格 当我在 2010 年或 2007 年打开时 它工作正常 但在 2003 年 格式样式消失了 每次保存 2003 Excel 文件之前都会弹出兼容性检查对话框 请参
  • 在合并的单元格中选择、插入照片并将其居中

    我是一名研发面包师 正在为我的团队制作食谱模板 模板中有照片 但我需要轻松地允许他们单击一个按钮 打开照片的文件选择器 然后将该照片放在合并的单元格中 我其实不太擅长做这个 Sub InsertPhotoMacro Dim photoNam
  • VBA 有没有办法了解未使用的变量?

    标准 VBA 编辑器中是否有工具 方法或设置来警告已被修改的变量Dim med 但没有被使用 MZ Tools http www mztools com index aspx将搜索您的代码并告诉您哪些内容未被使用 VBA的版本可以找到her
  • 使用 ObjPtr(Me) 返回自定义类实例的名称?

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

    我有一个要求 我必须在 JasperReports 中设计一个报告 该报告有 4 页 第一张纸有 5 页 类似的其他纸有一页或两页 我面临的问题是 如果我使用net sf jasperreports export xls one page
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • VBA ByRef 参数类型不匹配

    最初在我的主代码部分中 我有一个丑陋的 if 语句 尽管它会运行丑陋 我决定将其设为我要调用的函数 这导致我收到错误 编译错误 ByRef 参数类型不匹配 我的假设是该函数需要正确引用 尽管我一直在阅读文档并且不明白为什么 gt 声明 Sh
  • Excel 数字缩写格式

    这是我想要完成的任务 Value Display 1 1 11 11 111 111 1111 1 11k 11111 11 11k 111111 111 11k 1111111 1 11M 11111111 11 11M 11111111
  • 如何在Power Query中对N列求和

    我的数据每月都会更新 因此我尝试创建一个强大的查询表 该表将显示我创建的枢转 N 列的总和 但我似乎不知道如何在强大的查询中执行此操作 我目前有这个代码 旋转后 创建要求和的列的列表 添加索引列以限制每行 添加一列 该列对该行的列进行求和
  • 在Excel中,我可以使用超链接来运行vba宏吗?

    我有一个包含多行数据的电子表格 我希望能够单击一个单元格 该单元格将使用该行中的数据运行宏 由于行数总是在变化 我认为每行的超链接可能是最好的方法 ROW MeterID Lat Long ReadX ReadY ReadZ CoeffA
  • 在 PYTHON 中读取 EXCEL 时,“utf-16-le”编解码器无法解码字节

    我正在尝试读取不同语言 阿拉伯语 希腊语 意大利语 希伯来语等 的各种数量的 xls 文件 当我尝试调用 open workbook 函数时 出现如下所示的错误 不知道如何将格式设置为任何语言 Code book xlrd open wor
  • Excel 2003 中的 IFERROR

    我通过阅读几个线程了解到IFERROR在 Excel 2003 中由IF ISERROR 我尝试从 Excel 2007 复制的代码是 IFERROR A1 我知道必须有一个简单的解决方案将其转换为IF ISERROR 但我没有任何效果 意
  • 如何使用 VBA 添加 MS Outlook 提醒事件处理程序

    我想扩展 MS Outlook 以便当弹出日历提醒时 我可以运行一个可以运行外部程序 如批处理脚本 的 VBA 挂钩 就我而言 我想将提醒 转发 到 Linux 桌面 因为我在这两种环境中工作 并且 Windows 桌面并不总是可见 我看到
  • 无法使用 VBA 代码从 Excel 连接到 Teradata - 无法通过网络访问 Teradata 服务器

    我一直在尝试使用 vba 代码从 Excel 连接到 Teradata 但收到以下错误 无法通过网络访问 Teradata Server 我已经能够从 Teradata SQL 助手成功连接 并且还成功 ping 通 Teradata 服务
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 如何使用vba复制Excel工作表中的动态范围

    我试图使宏中的范围是动态的 而不指定最后一行x Sheets SheetName Range A2 K1000 Copy在 1000 行中 我想将其更改为动态 因为有时我的数量会更少或更多 尝试这个 Sub Test Dim lRow as

随机推荐

  • 创建任务板模板

    基本想法是 我希望能够制作一个新的承包商任务板主模板 我将有一个称为承包商集成的迭代路径 里面有一个主模板 其中有 4 个故事 每个故事有 10 个任务 我希望能够通过更改分配给它的名称来为每个新来的人使用此模板 因此 每次我招募新人时 都
  • 组件属性不支持复杂内容(混合 C# 和标记)

    我正在尝试使用 Razor 参数并将其传递到 Blazor 中进行进一步处理 但在我尝试构建的 onclick 事件上收到此错误消息 组件属性不支持复杂内容 混合 C 和标记 img 标签如下 tr for int j 0 j lt Can
  • 宝石安装 ffi -v '1.1.5' osx 10.8

    我一直在尝试通过以下方式在 OSX 10 8 上安装 ffi gem install ffi v 1 1 5 结果 ERROR Error installing ffi ERROR Failed to build gem native ex
  • Pytest 不选取类内的测试方法

    一直使用Pythonunittest2 并且刚刚开始迁移到pytest 当然 我试图进行比较 但我无法弄清楚的一件事是 Question为什么 Pytest 不选择 测试 类中定义的测试方法 什么对我有用 login test py imp
  • 可以更少地引用扩展属性吗?

    是否有可能以更少的时间扩展扩展财产 我在一个 分布式 文件中有定义 需要添加 important在我的特殊情况下 现有财产 例如 我有一个定义此类的 less 文件 pfx grey light bg background color e5
  • 从命令行将文件包含在项目中

    有没有办法在 vs2012 中从命令行将文件包含在项目中 我之所以问这个问题 是因为每当我使用其他 IDE 如 ST3 或从 Photoshop 等保存文件时 将添加到项目文件夹中的任何新文件包含在内是非常令人沮丧的 我正在使用 Grunt
  • Android:暂停/恢复计时器或线程

    我已经检查了有关如何暂停 恢复计时器的所有答案 但找不到解决方案 我创建了一个计时器任务 它计算员工的工作时间并将其放入 TextView 中进行显示 代码如下 Timer T new Timer T scheduleAtFixedRate
  • 如何获取 solr 术语频率?

    我有一个问题 如何才能像我们通过以下方法在 lucene 中获得术语频率一样 DocFreq new Term 字段 值 使用 solr solrnet Try 调试查询 打开 http wiki apache org solr SolrR
  • 如何在没有“onLocationChange”方法的情况下知道 GPS 位置

    我想通过单击一个按钮来发送短信 并且在短信中我想发送位置信息 我试过 location locationManager getLastKnownLocation LocationManager NETWORK PROVIDER 但第一次显示
  • 使用 gson 反序列化时将默认值设置为变量

    我正在尝试转换JSON http www json org 到 Java 对象 当一对的某个值是null 应该设置一些默认值 这是我的POJO https en wikipedia org wiki Plain Old Java Objec
  • 在后台下载多个文件(仅限 iOS 7)

    我目前正在开发一个播客应用程序 该应用程序只能在 iOS 7 上运行 并且它具有允许在后台模式下同步和下载最近剧集的功能 所以很清楚同步 我实现了application performFetchWithCompletionHandler方法
  • WCF服务部署-工具

    有一个 WCF 服务正在 IIS 下运行 该服务访问其文件夹中的文件 访问 SQL Server 数据库并将消息写入事件日志 某数据中心部署平台为Windows Server 2008 我开发了这项服务 但我仍然是一个初学者 部署将导致创建
  • Laravel 5.2 类 App\Http\Controllers\AuthController 不存在

    我的整个应用程序是在 Laravel 5 2 中制作的 工作得很好 但是当我尝试通过以下命令获取路由列表时 php artisan 路线 列表 它向我显示以下错误 ReflectionException 类 App Http Control
  • Keras 模型未能减少损失

    我提出一个例子 其中tf keras模型无法从非常简单的数据中学习 我在用着tensorflow gpu 2 0 0 keras 2 3 0和Python 3 7 在文章的最后 我给出了重现我观察到的问题的 Python 代码 Data 样
  • 无法使用 Swift 4 包管理器导入包

    尝试在我的机器上使用 Xcode beta v9 测试 Swift 4 但在将包导入测试项目时遇到问题 启动项目使用swift package init type executable Changed Package swift并添加了 2
  • 如何探索使用 scikit learn 构建的决策树

    我正在使用构建决策树 clf tree DecisionTreeClassifier clf clf fit X train Y train 这一切都很好 但是 我该如何探索决策树呢 例如 如何查找 X train 中的哪些条目出现在特定叶
  • [[ $- = *i* ]] 在 bash 中意味着什么?

    我正在安装液体提示 https github com nojhan liquidprompt并且在文档中他们要求您添加 i source liquidprompt liquidprompt在你的 bashrc 我试图理解该行的第一部分 但这
  • HashMap UUID 还是 String 作为键?

    HashMap
  • 从服务中的 C# 文件加载 SSRS 报告

    我们正在考虑用 SSRS 取代 Crystal 我想知道是否可以在 C 中加载 rdl 或 rdl data 文件并将报告生成到内存流 我见过一些使用的例子本地报告 http msdn microsoft com en us library
  • 2列的快速比较方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 EDIT 对于我的解决方案 请使用类似的东西 For i 1 To tmpRngSrcMax If rngSrc i lt gt rngDes