VBA比较变体
我要做的是遍历变体,看看里面的一切是否匹配。
…但有没有更快更有效的方法来比较变体? (我真的不需要知道里面是什么。)
如果我比较string“如果string1 = string2那么…”就足够了。 (在这种情况下会出现“If Var1 = Var2 Then ….”)。
Var1 = Sheets(1).Range("A1:B10") Var2 = Sheets(1).Range("C1:D10") ABCD ABC DEF ABC DEF SBC SEF SBC SEF FBC FEF FBC FEF RBC REF RBC REF
数据将主要是文本,大部分时间列A和列B应等于列C和列D(在范围内的指定行数内)。 我需要知道的是如果列A和B(在指定的行)具有相同的内容作为D和C.
如果你试图比较两个范围,就像你在评论中提到的那样,我会build议用第一个范围rng1
遍历for each
循环,然后使用MATCH
来检查rng1
每个项目是否在rng2
,比明确地比较每一对更快。
你正在看两个二维数组。
这个简短例程吐出了尺寸( LBound函数和UBound函数 ),并将这些值输出到VBE的立即窗口(Ctrl + G)。
Sub str_test() Dim v As Long, w As Long, vABs As Variant, vCDs As Variant With ActiveSheet vABs = .Range("A1:B10").Value2 vCDs = .Range("C1:D10").Value2 Debug.Print LBound(vABs, 1) & ":" & UBound(vABs, 1) Debug.Print LBound(vABs, 2) & ":" & UBound(vABs, 2) Debug.Print LBound(vCDs, 1) & ":" & UBound(vCDs, 1) Debug.Print LBound(vCDs, 2) & ":" & UBound(vCDs, 2) For v = LBound(vABs, 1) To UBound(vABs, 1) For w = LBound(vABs, 2) To UBound(vABs, 2) Debug.Print vABs(v, w) & " - " & vCDs(v, w) Next w Next v End With End Sub
结果:
str_test 1:10 1:2 1:10 1:2 LOGG - JWSA EGXL - SBQI WKSL - ZITO VUKB - MCWY (etc, etc, blah, blah...)
你应该能够从那里进行string比较。
如果您试图比较两个相同形状的范围,并且它们的值是数字,则可以使用(在VBA中)工作表函数SumX2MY2(A, B)
。 该函数计算相应条目之间差异的平方。 当且仅当结果为0时,这些数字是相同的。这可能不是最有效的方法 – 但对于大型数组,它可能会胜出(凭借使用Excel的计算引擎而不是解释的VBA代码)。 你可以使用这样的东西:
Sub test() Dim A As Variant, B As Variant A = Range("A1:B2").Value B = Range("C1:D2").Value If Application.WorksheetFunction.SumX2MY2(A, B) = 0 Then Debug.Print "Values the same" Else Debug.Print "Values different" End If End Sub
运行两次,一次两个范围包含相同的值,一次当一些值不同时。
在编辑上:如果要比较两个包含相等文本的范围,并且不想使用嵌套循环,则可以使用数组公式。 select一个单元格,说X1
你不打算使用(隐藏它是安全的),并创build一个这样的function:
Function SameVals(R1 As Range, R2 As Range) As Boolean Range("X1").FormulaArray = "= Sum(If(" & _ R1.Address(ReferenceStyle:=xlR1C1) & _ "=" & R2.Address(ReferenceStyle:=xlR1C1) & _ ",0,1))" SameVals = Range("X1").Value = 0 Range("X1").ClearContents End Function
像这样testing它:
Sub test() MsgBox SameVals(Range("A1:B4"), Range("C1:D4")) End Sub
在testing案例中的数组公式
{= SUM(IF($A$1:$B$4=$C$1:$D$4,0,1)}
在X1中组装。 它首先创build一个0和1的数组,指示范围不同的位置,然后求和这个结果。
与明显的嵌套for循环方法来检查相等的范围相比,这有一些缺点,但是如果您正在testing大范围的相等性并且直接迭代方法的性能似乎是一个问题,那么您可以尝试使用这种方法。
这里是公式的方法(没有VBA):
用公式快速突出差异的另一种方法是:
ABCDEF ABC DEF ABC x TRUE FALSE SBC SEF SBC SEF TRUE TRUE FBC FEF FBC FEF TRUE TRUE RBC REF RBC REF TRUE TRUE ABC DEF ABC DEF =A7=C7 =B7=D7 SBC SEF SBC SEF =A8=C8 =B8=D8 FBC FEF FBC FEF =A9=C9 =B9=D9 RBC REF RBC REF =A10=C10 =B10=D10
这是VBA中的匹配function:
Option Explicit Public Sub compareValues() Dim rng1 As Range, rng2 As Variant, rng3 As Variant Dim ws As Worksheet, result As Variant, cel As Range Set ws = Sheet1 Set rng1 = ws.Range("A1:B10") rng2 = Application.Transpose(ws.Range("C1:C10")) rng3 = Application.Transpose(ws.Range("D1:D10")) For Each cel In rng1 cel = Trim(cel) If Len(cel) > 0 Then result = Application.Match(cel, rng2, 0) If IsError(result) Then result = Application.Match(cel, rng3, 0) If IsError(result) Then cel.Interior.Color = vbYellow End If End If Next End Sub
直接的解决scheme(首先我想到)。 运行在〜0.12毫秒:
oRange1 = Range("A1:B10") oRange2 = Range("C1:D10") For i = 1 To 10 For j = 1 To 2 If oRange1(i, j) <> oRange2(i, j) Then MsgBox "Not equal.": Exit For Next j Next i