Excel 选择案例的优化——150k+的长时间迭代;数据行

Excel 选择案例的优化——150k+的长时间迭代;数据行,excel,vba,Excel,Vba,我正在做一些宏来自动化一些任务和分析数据。 我在测试我的程序时注意到的一点是处理所有数据所需的时间。我知道我有大量的数据,但我想知道我的代码是否可以提高程序的性能。 现在我有150k+行数据,这个过程需要很多时间。我能用我的代码做些什么吗 Option Explicit Sub x() Dim lin_ori As Variant lin_ori = 2 Sheets("MVIN_MVOU").Cells(1, 13) = "Process Layer"

我正在做一些宏来自动化一些任务和分析数据。 我在测试我的程序时注意到的一点是处理所有数据所需的时间。我知道我有大量的数据,但我想知道我的代码是否可以提高程序的性能。 现在我有150k+行数据,这个过程需要很多时间。我能用我的代码做些什么吗

Option Explicit

Sub x() 

    Dim lin_ori As Variant

    lin_ori = 2

    Sheets("MVIN_MVOU").Cells(1, 13) = "Process Layer"


    Do While Sheets("MVIN_MVOU").Cells(lin_ori, 1) <> ""

         fnd = Application.Match(Worksheets("MVIN_MVOU").Cells(lin_ori, 6), Worksheets("StepArea").Columns(3), 0)

       If Not IsError(fnd) Then      'a match was found

            Sheets("MVIN_MVOU").Cells(lin_ori, 13) = Sheets("StepArea").Cells(fnd, 2)

        End If

    lin_ori = lin_ori + 1


    Loop

End Sub
选项显式
Sub x()
Dim lin_ori作为变体
lin_ori=2
板材(“MVIN_MVOU”)。单元(1,13)=“工艺层”
Do While Sheets(“MVIN_MVOU”)。单元格(lin_ori,1)”
fnd=Application.Match(工作表(“MVIN_MVOU”)。单元格(lin_ori,6),工作表(“StepArea”)。列(3),0)
如果不是IsError(fnd),则“找到匹配项”
板材(“MVIN_MVOU”).单元(lin_ori,13)=板材(“StepArea”).单元(fnd,2)
如果结束
lin_ori=lin_ori+1
环
端接头

加快速度的关键在于使用

选项显式
第xx分段()
将mvinmvouWS设置为工作表
设置mvinmvouWS=ThisWorkbook.Sheets(“MVINMVOU”)
“---将所有数据移动到基于内存的数组中
最后一排一样长
变光面积
Dim Step Area Range作为范围
将STEPWS设置为工作表
设置stepAreaWS=ThisWorkbook.Sheets(“StepArea”)
lastRow=stepAreaWS.Cells(stepAreaWS.Rows.Count,3).结束(xlUp).行
设置stepAreaRange=stepAreaWS.Range(“C1”)。调整大小(最后一行,2)
stepArea=stepAreaRange.Value
“---将所有数据移动到基于内存的数组中
变暗数据范围作为范围
作为变量的Dim数据
lastRow=mvinmvouWS.Cells(mvinmvouWS.Rows.Count,1).End(xlUp).Row
设置dataRange=mvinmvouWS.Range(“A2”)。调整大小(最后一行,13)
data=dataRange.Value
数据(1,13)=“过程层”
我想我会坚持多久
对于i=LBound(数据,1)到UBound(数据,1)
暗指数与长指数相同
索引=FindInArray(stepArea,数据(i,6))
如果索引为-1,则
数据(i,13)=阶梯面积(指数,2)
如果结束
接下来我
“---现在将结果放回工作表
dataRange.Value=data
端接头
私有函数FindInArray(ByRef inArray作为变量,ByVal findWhat作为变量)的长度
我想我会坚持多久
FindInArray=-1
对于i=LBound(inArray,1)到UBound(inArray,1)
如果inArray(i,1)=找到了什么
FindInArray=i
退出
如果结束
接下来我
端函数

好的,现在它可以按我的要求工作了。刚刚更改了一个范围和我希望它在数组中搜索的位置。 非常感谢:)

Sub-cola\u-process\u-layer\u-MVINMVOU()
将mvinmvouWS设置为工作表
设置mvinmvouWS=ThisWorkbook.Sheets(“MVINMVOU”)
将STEPWS设置为工作表
设置stepAreaWS=ThisWorkbook.Sheets(“StepArea”)
“---将所有数据移动到基于内存的数组中
最后一排一样长
变光面积
Dim Step Area Range作为范围
变暗数据范围作为范围
作为变量的Dim数据
lastRow=stepAreaWS.Cells(stepAreaWS.Rows.Count,2).结束(xlUp).行
设置stepAreaRange=stepAreaWS.Range(“A1”)。调整大小(最后一行,4)
stepArea=stepAreaRange.Value
“---将所有数据移动到基于内存的数组中
lastRow=mvinmvouWS.Cells(mvinmvouWS.Rows.Count,1).End(xlUp).Row
设置dataRange=mvinmvouWS.Range(“A1”).Resize(lastRow,13)
data=dataRange.Value
数据(1,13)=“过程层”
我想我会坚持多久
对于i=LBound(数据,1)到UBound(数据,1)
暗指数与长指数相同
索引=FindInArray(stepArea,数据(i,12))
如果索引为-1,则
数据(i,13)=阶梯面积(指数,2)
如果结束
接下来我
“---现在将结果放回工作表
dataRange.Value=data
端接头
私有函数FindInArray(ByRef inArray作为变量,ByVal findWhat作为变量)的长度
我想我会坚持多久
FindInArray=-1
对于i=LBound(inArray,1)到UBound(inArray,1)
如果inArray(i,1)=找到了什么
FindInArray=i
退出
如果结束
接下来我
端函数

这个问题可能更适合Hello PeterT,非常感谢。我从零开始自学VBA,我发现你分享的链接非常有用。谢谢现在代码返回的列不是我想要的列。我在试图弄明白到底是什么错了。我发现数组具有sheet steparea的最后一列(4)。我正在深入了解它。非常感谢分享链接:)
Option Explicit

Sub xx()
    Dim mvinmvouWS As Worksheet
    Set mvinmvouWS = ThisWorkbook.Sheets("MVIN_MVOU")

    '--- move all the data into a memory-based array
    Dim lastRow As Long
    Dim stepArea As Variant
    Dim stepAreaRange As Range
    Dim stepAreaWS As Worksheet
    Set stepAreaWS = ThisWorkbook.Sheets("StepArea")
    lastRow = stepAreaWS.Cells(stepAreaWS.Rows.Count, 3).End(xlUp).Row
    Set stepAreaRange = stepAreaWS.Range("C1").Resize(lastRow, 2)
    stepArea = stepAreaRange.Value

    '--- move all the data into a memory-based array
    Dim dataRange As Range
    Dim data As Variant
    lastRow = mvinmvouWS.Cells(mvinmvouWS.Rows.Count, 1).End(xlUp).Row
    Set dataRange = mvinmvouWS.Range("A2").Resize(lastRow, 13)
    data = dataRange.Value
    data(1, 13) = "Process Layer"

    Dim i As Long
    For i = LBound(data, 1) To UBound(data, 1)
        Dim index As Long
        index = FindInArray(stepArea, data(i, 6))
        If index <> -1 Then
            data(i, 13) = stepArea(index, 2)
        End If
    Next i

    '--- now put the results back to the worksheet
    dataRange.Value = data

End Sub

Private Function FindInArray(ByRef inArray As Variant, ByVal findWhat As Variant) As Long
    Dim i As Long
    FindInArray = -1
    For i = LBound(inArray, 1) To UBound(inArray, 1)
        If inArray(i, 1) = findWhat Then
            FindInArray = i
            Exit For
        End If
    Next i
End Function
Sub cola_process_layer_MVINMVOU()

Dim mvinmvouWS As Worksheet
Set mvinmvouWS = ThisWorkbook.Sheets("MVIN_MVOU")
Dim stepAreaWS As Worksheet
Set stepAreaWS = ThisWorkbook.Sheets("StepArea")

'--- move all the data into a memory-based array
Dim lastRow As Long
Dim stepArea As Variant
Dim stepAreaRange As Range

Dim dataRange As Range
Dim data As Variant

lastRow = stepAreaWS.Cells(stepAreaWS.Rows.Count, 2).End(xlUp).Row
Set stepAreaRange = stepAreaWS.Range("A1").Resize(lastRow, 4)
stepArea = stepAreaRange.Value

'--- move all the data into a memory-based array

lastRow = mvinmvouWS.Cells(mvinmvouWS.Rows.Count, 1).End(xlUp).Row
Set dataRange = mvinmvouWS.Range("A1").Resize(lastRow, 13)
data = dataRange.Value
data(1, 13) = "Process Layer"

Dim i As Long
For i = LBound(data, 1) To UBound(data, 1)
    Dim index As Long
    index = FindInArray(stepArea, data(i, 12))
    If index <> -1 Then
        data(i, 13) = stepArea(index, 2)
    End If
Next i

'--- now put the results back to the worksheet
dataRange.Value = data


End Sub

Private Function FindInArray(ByRef inArray As Variant, ByVal findWhat As Variant) As Long
    Dim i As Long
    FindInArray = -1
    For i = LBound(inArray, 1) To UBound(inArray, 1)
        If inArray(i, 1) = findWhat Then
            FindInArray = i
            Exit For
        End If
    Next i
End Function