VBA阵列比较

时间:2017-11-09 14:35:55

标签: arrays vba comparison

我试图将第1,2和3列与第4,5列和第6列进行比较。第1列和第4列是次数,但它们并不总是排列,所以我希望有一个错误边界2秒。第2列和第5列以及第3列和第6列应始终完全匹配。我希望代码在第1列中运行并检查第3列中的任何值是否在该范围内。如果是,我想看看其他两个值是否匹配。如果它们都匹配,我想将array1和array2中的一些值粘贴到" Sheet2。"关键是我希望它能够快速运行。下面我已经发布了我到目前为止的内容。任何建议/批评/改革都将非常受欢迎!

谢谢,

萨姆

Sub Comp()

Dim array1() As Variant
Dim array2() As Variant
Dim last1 As String
Dim last2 As String
Dim C As Integer
Dim A As Integer
Dim high As Long
Dim low As Long
Dim x As Boolean

last2 = Sheets("Comparison").Range("B1000000").End(xlUp).Row
last1 = Sheets("Comparison").Range("BV10000").End(xlUp).Row
C = 0
A = 0

ReDim array1(C To last1, 3)
ReDim array2(A To last2, 5)

For C = 0 To last1

array1(C, 1) = Sheets("Comparison").Range("A" & C + 2).Value
array1(C, 2) = Sheets("Comparison").Range("D" & C + 2).Value
array1(C, 3) = Sheets("Comparison").Range("G" & C + 2).Value

high = array1(C, 1) + (1.15740740740741E-05 * 2)  '2 seconds
low = array1(C, 1) + (1.15740740740741E-05 * 2)  '2 seconds
x = False

For A = 0 To last2

array2(last2, 1) = Sheets("Comparison").Range("I" & A + 2).Value
array2(last2, 2) = Sheets("Comparison").Range("K" & A + 2).Value
array2(last2, 3) = Sheets("Comparison").Range("M" & A + 2).Value
array2(last2, 4) = Sheets("Comparison").Range("J" & A + 2).Value
array2(last2, 5) = Sheets("Comparison").Range("L" & A + 2).Value

If array1(C, 2) = array2(A, 2) And array1(C, 3) = array2(A, 3) And high >= array2(A, 1) And array2(A, 1) >= low Then

x = True

If x = True Then

Exit For

If x = True Then Sheets("Sheet2").Range("C100000").End(xlUp).Offset(1, 0).Value = array2(A, 4).Value And Sheets("Sheet2").Range("D100000").End(xlUp).Offset(1, 0).Value = array2(A, 5).Value

Else

Next A

Exit For

For C = 0 To last1

If x = True Then Sheets("Sheet2").Range("A100000").End(x1up).Offset(1, 0) = array1(C, 1).Value And Sheets("Sheet2").Range("B100000").End(x1up).Offset(1, 0) = array1(C, 3).Value

Next C

End Sub

1 个答案:

答案 0 :(得分:0)

  1. 您的代码中有几个拼写错误,我已经更正如下。
  2. 所需的i / o越少,性能越好。最好一次读取几行数据,比读取1行一次,做一些事情,读下一行,做一些事情。因此,将所有数据读入数组并将匹配保存在第3个数组中会更好。完成所有比较后,我们将其写回工作表。 Ref
  3. 代码如下,未经测试。

    arrayMatch
    1. 如果范围是连续的,则一次将值分配给一个数组是最好的方法。但是在你的情况下它们是分开的列,我设置3个数组来存储值。与array2相同的原因,一次读取值比循环更好。如果您需要更好的性能,则无需更改列顺序。请注意,分配这样的数组值,该数组将基于1。

    2. 我猜大约有500场比赛。您可以随意调整它。

    3. 由于没有人能预测实际会有多少场比赛,因此arrayMatch可能不够大。这肯定是浪费时间和记忆,所以决定{{1}}的大小很重要。