哪们大侠看看我这个VBA运行速度超慢的原因在哪,该怎么优化?

Sub scpz()

Dim i As Integer, j As Integer

Dim rq

Dim rowNo As Long, rng As Range

Set rng = Sheet17.Range("D2:D4000").Find("", , , xlValue)

If Not rng Is Nothing Then

rowNo = rng.Row '行号

End If

Dim star As Long, rag As Range

Set rag = Sheet10.Range("O8:O4000").Find("", , , xlValue)

If Not rag Is Nothing Then

star = rag.Row '非空行号

End IF

Dim num

With Worksheets("资金日记账")

num = ActiveSheet.Range("e" & Rows.Count).End(xlUp).Row

End With

showProgressBar '调用进度条

i = star '日记账行数

j = rowNo '账务处理行数

rq = Now()

For i = star To num

If Sheet10.Cells(i, 4) <> "" And Sheet10.Cells(i, 15) <> "√" And Sheet10.Cells(i, 4) >= Sheet10.Cells(6, 10) And Sheet10.Cells(i, 4) <= Sheet10.Cells(6, 12) Then

Sheet17.Cells(j, 6) = Sheet10.Cells(i, 4)

Sheet17.Cells(j, 7) = Sheet10.Cells(i, 6)

Sheet17.Cells(j, 8) = Sheet10.Cells(i, 16)

Sheet17.Cells(j, 9) = Sheet10.Cells(i, 17)

If Sheet10.Cells(i, 8) = "" Then

Sheet17.Cells(j, 10) = Sheet10.Cells(i, 9)

Else

Sheet17.Cells(j, 10) = Sheet10.Cells(i, 8)

End If

Sheet17.Cells(j, 11) = rq

Sheet17.Cells(j, 12) = "日记账生成"

Sheet17.Cells(j, 13) = Sheet10.Cells(i, 7)

j = j + 1

Sheet17.Cells(j, 6) = Sheet10.Cells(i + 1, 4)

Sheet17.Cells(j, 7) = Sheet10.Cells(i + 1, 6)

Sheet17.Cells(j, 8) = Sheet10.Cells(i + 1, 16)

Sheet17.Cells(j, 9) = Sheet10.Cells(i + 1, 17)

If Sheet10.Cells(i + 1, 8) = "" Then

Sheet17.Cells(j, 10) = Sheet10.Cells(i + 1, 9)

Else

Sheet17.Cells(j, 10) = Sheet10.Cells(i + 1, 8)

End If

Sheet17.Cells(j, 11) = rq

Sheet17.Cells(j, 12) = "日记账生成"

Sheet17.Cells(j, 13) = Sheet10.Cells(i + 1, 7)

Sheet10.Cells(i, 15) = "√" '反写日记账生成状态

End If

Next

ActiveWorkbook.Unprotect Password:="12315"

Sheets("账务处理").Visible = True

Application.DisplayAlerts = True

Sheets("账务处理").Activate

qinchu

MsgBox "本期资金日记账已生成凭证!", vbExclamation, "凭证生成提示信息"

ActiveWorkbook.Protect Password:="12315", Structure:=True, Windows:=False

Application.DisplayAlerts = True

If Sheet10.Cells(i, 6) <> "" And Sheet10.Cells(i, 15) = "√" Then

'Put in **Sheet 8** what is in **Sheet 9**

MsgBox "本期日记账已生成凭证,无需重复生成!", vbExclamation, "凭证生成提示信息"

End If

End Sub

代码优化建议:

    变量命名:变量名应该具有描述性,让人能够理解变量的含义。例如,使用更具体的变量名来代替 i、j、num 等。

    减少重复计算:在代码中多次使用相同的计算,可以将计算结果存储在一个变量中,以减少计算次数。

    使用 With 语句:使用 With 语句可以减少代码中的嵌套,提高代码可读性。

    避免使用 Select 和 Activate:在代码中避免使用 Select 和 Activate 语句,以减少 Excel 的无响应和卡顿。

    避免使用 Find 函数:在代码中使用 Find 函数来查找单元格,会增加代码的复杂性和运行时间。建议直接使用循环来遍历单元格。

    使用数组:对于大量数据的操作,可以使用数组来存储数据,以减少对 Excel 的操作次数,提高运行速度。

    避免使用 If...Else 语句:在代码中使用 If...Else 语句会增加代码的复杂性和运行时间。如果条件简单,可以直接使用单一语句代替。

    根据以上建议,可以对代码进行优化:

    Sub scpz()

    Dim startRow As Long, endRow As Long Dim nonEmptyRow As Long, j As Long Dim data() As Variant Dim i As Long, k As Long Dim currentDate As Date Dim message As String

    startRow = 8 '账务处理起始行号 endRow = 4000 '账务处理结束行号 nonEmptyRow = 0 '日记账非空行号 j = 0 '当前行号 k = 0 '计数器 currentDate = Now() '获取当前日期 message = "本期资金日记账已生成凭证!" '生成提示信息

    '获取资金日记账最后一行号 With Worksheets("资金日记账") num = .Cells(Rows.Count, "E").End(xlUp).Row End With

    '将数据存储到数组中 data = Sheet10.Range("O8:O" & num).Value

    '调用进度条 Call showProgressBar

    '遍历数据并生成日记账 For i = startRow To num If data(i, 4) <> "" And data(i, 15) <> "√" And data(i, 4) >= Sheet10.Cells(6, 10) And data(i, 4) <= Sheet10.Cells(6, 12) Then nonEmptyRow = i '记录非空行号 j = j + 1 '增加当前行号 Sheet17.Cells(j, 6) = data(i, 4) '复制数据到日记账中 Sheet17.Cells(j, 7) = data(i, 6) Sheet17.Cells(j, 8) = data(i, 16) Sheet17.Cells(j, 9) = data(i, 17) If data(i, 8) = "" Then Sheet17.Cells(j, 10) = data(i, 9) '如果备注为空,则使用摘要作为备注 Else Sheet17.Cells(j, 10) = data(i, 8) '否则使用实际备注 End If Sheet17.Cells(j, 11) = currentDate '记录当前日期 Sheet17.Cells(j, 12) = "日记账生成" '记录操作类型为日记账生成 Sheet17.Cells(j, 13) = data(i, 7) '复制凭证信息到日记账中 k = k + 1 '增加计数器,表示生成了一条日记账记录 ElseIf data(i + 1, 4) <> "" Then '如果下一行不为空,则生成下一行日记账记录 nonEmptyRow = i + 1 '记录非空行号 j = j + 1 '增加当前行号 Sheet17.Cells(j, 6) = data(i + 1, 4) '复制数据到日记账中 Sheet17.Cells(j, 7) = data(i + 1, 6) Sheet17.Cells(j, 8) = data(i + 1, 16) Sheet17.Cells(j, 9) = data(i + 1, 17) If data(i + 1, 8) = "" Then Sheet17.Cells(j, 10) = data(i + 1

温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-08-21
VBA运行速度慢可能由多种原因造成。以下是一些建议,帮助您优化VBA代码和提高运行速度:
避免使用循环:避免在代码中使用大量循环,尤其是嵌套循环。尽量使用更高效的方法,如使用数组或字典进行批量操作。
减少API调用:VBA中的API调用会导致额外的开销,尽量减少使用。如果在代码中使用了大量的API调用,可以考虑对其进行优化或简化。
优化查找和替换操作:当需要在大量数据中进行查找和替换时,可以考虑使用更快速的方法,如使用数组或使用Find和Replace功能。
使用变量缓存:将需要频繁访问或计算的数值存储在变量中,避免重复读取或计算,提高运行效率。
禁用自动计算:在使用大量公式计算的情况下,可以将自动计算功能禁用,待代码执行完毕后再手动计算。
使用事件触发:避免使用频繁的轮询操作,可以使用事件触发机制,只在需要时才执行相应的操作。
合理使用屏幕更新:在操作大量数据时,可以暂时关闭屏幕更新,待操作完成后再重新开启,避免不必要的刷新,提高效率。
避免不必要的文件读写:尽量减少对磁盘的频繁读写操作,可以考虑将数据加载到内存中进行处理。
使用合适的数据结构和算法:根据实际需求选择合适的数据结构和算法,例如使用哈希表优化查找操作。
最重要的是,对于具体问题,您需要进行具体的分析和调试,确定代码中存在的瓶颈,并针对性地优化。可以使用性能测试工具测量不同部分的耗时,在优化代码之前确保您了解哪些部分是最消耗时间的。
第2个回答  2023-08-22
你这个速度慢应该是来自于FOR循环中大量的对表控件的操作导致的(包括但不限于对表单元的读取、赋值、比较)
对控件属性的操作是较为影响效率的,如果数据较少还不太明显,如果数据较多就会越发明显。优化的方式,可以将表控件中的必要关键内容预读取,至二维数组。然后对二维数组进行相关的计算操作。最后将结果一次性赋值给表。用空间换取时间。
相似回答