Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何在VBA中加速两个集合的比较?_Excel_Vba - Fatal编程技术网

Excel 如何在VBA中加速两个集合的比较?

Excel 如何在VBA中加速两个集合的比较?,excel,vba,Excel,Vba,我编写了一个宏,它获取集合的集合,然后获取其中两个集合,并给出相似性。 现在,如果我用一个简单的for循环比较这两个集合,那么比较pCol中包含的所有854个集合将需要几个小时。 这是我的密码: 函数比较集合(ByVal pCol作为集合)作为集合 暗淡的外表和长的一样 暗淡无光 “将相互比较的集合 Dim inCol As集合 暗色外套 '用于返回值的集合 Dim retCol As系列 “单一比较的结果 作为压缩结果的Dim res '比较变量 Dim iIdx的长度为 长的 暗淡无光 Se

我编写了一个宏,它获取集合的集合,然后获取其中两个集合,并给出相似性。 现在,如果我用一个简单的for循环比较这两个集合,那么比较pCol中包含的所有854个集合将需要几个小时。 这是我的密码:

函数比较集合(ByVal pCol作为集合)作为集合
暗淡的外表和长的一样
暗淡无光
“将相互比较的集合
Dim inCol As集合
暗色外套
'用于返回值的集合
Dim retCol As系列
“单一比较的结果
作为压缩结果的Dim res
'比较变量
Dim iIdx的长度为
长的
暗淡无光
Set retCol=新集合
对于外部=1到pCol。计数-1
放样坐标=pCol(外部)
对于内部=外部+1至pCol.计数
设置输入=pCol(内部)
设置res=新压缩结果
res.LeftTable=outCol(1)'索引1包含一个标头
res.RightTable=inCol(1)

'比较两个集合A第一个提示:尝试预先计算outCol.Count、inCol.Count和pCol.Count,以避免不必要的计算

第二个提示:如果在对象CompResult中res.Result1和res.Result2是整数,请使用“\”而不是“/”

第三个提示:尽可能使用整数而不是长值

第四个技巧:当为每一列循环时,尝试用“for-each”循环替换for循环。看起来快一点


最后一个技巧可能是转换数组中的集合(范围)并遍历它们,因为它似乎比遍历范围更快。

请发布CompResult类好吗?使用
ArrayList
,然后可以使用
.Contains()
方法。或者使用
字典
类并使用
.Exists()
查看是否存在匹配项。请注意,字典必须包含唯一键,而ArrayList不包含唯一键。@MacroMan感谢您的提示。这真的让它快了很多。现在,我只需要找到一种快速的方法将我庞大的集合(>300k元素)写入excelsheet@TimvdBerg使用
.ToArray()
方法,然后使用
Range.Resize()
一次性写入所有内容。@MacroMan谢谢。ToArray()就像一个符咒。唯一的问题是,仅调整大小并不能帮助我一次性编写它。原因是我用嵌套数组代替了二维数组。你知道我该怎么做吗?
Private mLeftTable As String
Private mRightTable As String
Private mResult1 As Double
Private mResult2 As Double

Public Property Get LeftTable() As String
    LeftTable = mLeftTable
End Property

Public Property Let LeftTable(value As String)
    mLeftTable = value
End Property

Public Property Get RightTable() As String
    RightTable = mRightTable
End Property

Public Property Let RightTable(value As String)
    mRightTable = value
End Property

Public Property Get Result1() As Double
    Result = mResult1
End Property

Public Property Let Result1(value As Double)
    mResult1 = value
End Property

Public Property Get Result2() As Double
    Result = mResult2
End Property

Public Property Let Result2(value As Double)
    mResult2 = value
End Property