|
本帖最后由 13591163120 于 2021-12-23 20:39 编辑
做了一个宏,for循环内列为固定值时,循环时间为2秒
因为需要,把行、列更改为变量值,循环时间增加到2分钟
又加入求和公式后,循环时间再度延迟。
表格压缩后大于1MB没法上传,唉。部品明细表:有两万行数据,生产计划表:有500行,
诉求:优化代码,提高效率
备注:接触VBA一周的新人,不许笑话人。
Sub 导入生产计划()
Dim arr1, arr2, i As Long, j As Long, sText As Date, bText As Date
Application.ScreenUpdating = False '关屏幕刷新
Application.DisplayAlerts = False '关警告信息
行 = Sheets("生产计划").Range("A:A").EntireRow.Find("产品编码", LookAt:=xlWhole).Row '定位生产计划查询起始点
列1 = Sheets("生产计划").Range("a" & 行).End(xlToRight).Column
Sheets("生产计划").Activate
While 列1 > 0 '如果条件为真时执行下列代码
If Cells(21, 列1) = "合计" Or Cells(21, 列1) = "总合计" Then Columns(列1).Delete
列1 = 列1 - 1
Wend
Sheets("部品明细").Range("j1").Resize(20000, 50).ClearContents '清空上次导入结果
用户输入 = InputBox("起始日期:")
sText = 用户输入
Set k = Sheets("生产计划").Range("a" & 行).EntireRow.Find(sText, LookAt:=xlWhole)
If k Is Nothing Then
MsgBox "请确认日期是否正确"
Exit Sub
Else
k = Sheets("生产计划").Range("a" & 行).EntireRow.Find(sText, LookAt:=xlWhole).Column
End If
列1 = Sheets("生产计划").Range("a" & 行).End(xlToRight).Column
arr1 = Sheets("生产计划").Range("a" & 行 + 2 & ":a" & Sheets("生产计划").Range("a" & 行 + 2).End(xlDown).Row)
arr2 = Sheets("部品明细").Range("f2:bc" & Sheets("部品明细").Range("f2").End(xlDown).Row)
Sheets("部品明细").Range(Sheets("部品明细").Cells(1, "J"), Sheets("部品明细").Cells(1, 列1 - k + 10)) = Sheets("生产计划").Range(Sheets("生产计划").Cells(行, k), Sheets("生产计划").Cells(行, 列1)).Value
Sheets("部品明细").Rows("1:1").NumberFormatLocal = "m/d;@"
For i = 1 To UBound(arr1, 1)
For j = 1 To UBound(arr2, 1)
If arr2(j, 1) = arr1(i, 1) Then
Sheets("部品明细").Range(Sheets("部品明细").Cells(j + 1, "J"), Sheets("部品明细").Cells(j + 1, 列1 - k + 10)) = Sheets("生产计划").Range(Sheets("生产计划").Cells(i + 2, k), Sheets("生产计划").Cells(i + 2, 列1)).Value '行、列 转换为变量后,循环速度变慢
Sheets("部品明细").Range("H" & j + 1) = "=SUM(RC[2]:RC[" & 列1 & "])" '加入运算后,循环速度进一步变慢
End If
Next j
Next i
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
1) 用数组 一次性 操作
Sub ccc()
Dim arr(1 To 3)
arr(1) = 2
arr(2) = 3
If arr(1) > arr(2) Then
arr(3) = "=rc[-2]*rc[-1]"
Else
arr(3) = "=rc[-2]/rc[-1]"
End If
Range("A1:C1") = arr
End Sub
2) range() 比 cells() 运行效率高
3) range.value 比 range 运行效率高 ' .formula .formular1c1 同理
4) 用 With 语句
5) 代码 缩进 不对 , 参见 上面的示例
6) 附件数据无需这么多 , 哪怕10行20行 , 说一声 实际上万行就可以
|
|