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