Excel 选择案例的优化——150k+的长时间迭代;数据行
我正在做一些宏来自动化一些任务和分析数据。 我在测试我的程序时注意到的一点是处理所有数据所需的时间。我知道我有大量的数据,但我想知道我的代码是否可以提高程序的性能。 现在我有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"
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