Arrays 用vba中其他数组的内容过滤二维数组的最快方法

Arrays 用vba中其他数组的内容过滤二维数组的最快方法,arrays,excel,vba,2d,Arrays,Excel,Vba,2d,我的工作簿中有超过200000行,所以我需要最快的方法来处理这些数据 我将数据过滤到临时工作表、进行一些计算和删除工作表的简单方法需要花费大量时间,所以我认为如果我使用数组,我可以提高效率 我创建了一个具有动态范围的数组来保存所有数据,并且在不同的数组中也有唯一的记录,但我需要循环主数组并过滤当天的数据,因此我可以对当天的结果进行简单的求和。 第3列为当天,第6列为_与_之和。 我有一个可以在1d数组上工作的代码,但是我如何才能让它在多字段数组中工作呢 f_array = Filter(main

我的工作簿中有超过200000行,所以我需要最快的方法来处理这些数据

我将数据过滤到临时工作表、进行一些计算和删除工作表的简单方法需要花费大量时间,所以我认为如果我使用数组,我可以提高效率

我创建了一个具有动态范围的数组来保存所有数据,并且在不同的数组中也有唯一的记录,但我需要循环主数组并过滤当天的数据,因此我可以对当天的结果进行简单的求和。 第3列为当天,第6列为_与_之和。 我有一个可以在1d数组上工作的代码,但是我如何才能让它在多字段数组中工作呢

f_array = Filter(main_array, "smith")

我只想得到每天的值之和,请测试下一个代码。根据独特的日期数组,它将以更少的时间花费更多的时间。只是好奇处理现有数据范围需要多少时间。现在,它返回到相同的表中,从M2单元开始。它可以很容易地适应返回任何地方:

Sub SummarizePerDate()
 Dim sh As Worksheet, lastR As Long
 Dim arr, arrD, arrFin, i As Long, j As Long
 
 Set sh = ActiveSheet 'use here the sheet with the data to be processed
 lastR = sh.Range("A" & sh.Rows.count).End(xlUp).row
 
 arr = sh.Range("A2:G" & lastR).value 'put the data to be processed in an array
 arrD = sh.Range("K2:K9").value       'use here your array of unique date values
                                      'I used this range when tried testing
 ReDim arrFin(1 To UBound(arrD), 1 To 4)

 For i = 1 To UBound(arrD)
    For j = 1 To UBound(arr)
        If arrD(i, 1) = arr(j, 3) Then
            arrFin(i, 1) = arrD(i, 1)
            arrFin(i, 2) = arrFin(i, 2) + arr(j, 5)
            arrFin(i, 3) = arrFin(i, 3) + arr(j, 6)
            arrFin(i, 4) = arrFin(i, 4) + arr(j, 7)
        End If
    Next j
 Next
 sh.Range("M2").Resize(UBound(arrFin), UBound(arrFin, 2)).value = arrFin
 MsgBox "Ready..."
End Sub

一种比使用数组更快的方法是对工作表执行SQL语句,它具有更简单、更干净、更易于维护的额外好处

添加一个参考工具->参考。。。到最新版本的Microsoft ActiveX数据对象,通常为6.0

然后您可以编写如下代码:

常量文件路径为String=C:\path\to\excel\file.xlsx Dim connectionString作为字符串 连接字符串=_ Provider=Microsoft.ACE.OLEDB.12.0;&_ 数据源=&filepath&;&_ 扩展属性=Excel 12.0;HDR=是 将sql设置为字符串 sql=_ 选择设备、数据、Sumval3作为SumOfVal3&_ 从[Sheet1$]和_ 按设备、数据分组 将rs设置为新ADODB.Recordset rs.打开sql,连接字符串 结果将有三列:设备、数据以及设备和数据分组的总和

拥有记录集后,您可以执行以下操作之一:

使用属性、和迭代记录集并读取值:

做而不做 调试。打印设备 调试。打印rsData 调试。打印rsSumOfVal3 下一个 环 使用以下命令将其转换为二维阵列:

作为变体的Dim-arr arr=rs.GetRows '索引是从零开始的,因此以下行: 调试。打印arr1,0 '将打印第一行第二列-数据-的值 使用;可以指定所选的列和行分隔符

使用Excel将其粘贴到新的Excel工作表中


请注意,默认情况下,记录集将以仅向前模式打开,因此您将无法在记录集中来回移动;并且处于只读模式,因此您无法对记录集中的数据进行任何更改。

您正在考虑在循环主数组时加载具有限定值的附加数组。根据放置输出的位置,只需将附加数组的大小与初始数组的大小相同即可。在循环限定期间,由arri确定,即第3列ie数组从1开始。过滤器仅在1D数组中工作。我知道如何提取行/列切片1D数组,但我无法想象这将如何帮助您。。。数组有多少列?不需要切片。他们可以在其他阵列上使用Application.Match。若在其他数组中找到与主数组第3列的匹配项,则将当前行1添加到最终数组中。否则,应用程序将捕获错误。请在变量中匹配。匹配数组将是1D。应该有很多这样的例子。如果我理解正确,这是一种常见的技术。您将只循环主数组的行,并查看第三列。IDK匹配是否比匹配数组的循环性能差。能否向我们显示数据的图片,并尝试解释需要提取的内容?此外,如果不是ISERROR应用程序,可以通过包装来避免匹配返回的变量。匹配…完美!!。在不到一秒钟的时间里,用91天的时间检查了203000条线路。这也很好,很干净。谢谢