编辑:而不是我的解决方案,使用类似的东西
For i = 1 To tmpRngSrcMax
If rngSrc(i) <> rngDes(i) Then ...
Next i
Run Code Online (Sandbox Code Playgroud)
它快了大约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 …Run Code Online (Sandbox Code Playgroud) 我的问题与这个问题有一些相似之处: 为什么像PostgreSQL这样的数据库需要像RabbitMQ这样的消息代理?
在我目前的(半专业)项目中,我也决定是否要使用数据库,基于消息代理(例如使用RabbitMQ),甚至是完全不同的解决方案.
让我们想象两个工具,工具A和工具B.每当工具A运行并完成时,工具B 可能有一些事情要做.工具A的执行需要安静一段时间(> 60秒)并且通常无需执行任何操作工具B.工具A为工具B提供了一些元数据,因此工具B知道该怎么做.
基于消息的解决方案:建立工具B正在使用的消息队列.如果执行工具A 并且工具B应该运行,则工具A将消息(包括元数据)发布到工具B接收的队列,以便工具B将使用消息中的元数据运行.
数据库解决方案:每当工具A运行时,它都会添加一个数据库记录,例如时间戳,元数据和状态"RUNNING".如果执行工具A 并且工具B应该运行,它会将DB记录状态更新为"NEXT_TOOL_B".工具B不断向DB查询"NEXT_TOOL_B"状态的记录.如果找到某些内容,工具B将使用DB记录中的元数据运行.
虽然我知道数据库解决方案的缺点,例如工具B的常量轮询,但我在基于消息的解决方案中遗漏了它的一个特性:
每当第三个工具(例如工具C,例如控制面板UI)想知道当前状态时,它也可以随时查询数据库,并且如果工具A仍在工作,它将发现"运行"状态.在消息解决方案中,我并没有真正看到"监视"状态的方法,除非完成消息将在队列中.
所以我的问题是,你能想到使用消息或任何其他方法实现这一点而不进行轮询吗?