首页 > 解决方案 > VBA 代码在 Excel 2010 中可以快速完美地运行,但在 Excel 2016 或更高版本中添加一条记录需要 30 秒

问题描述

这是我第一篇关于堆栈溢出的帖子,所以如果我做错了什么,请告诉我。我遇到了一个有趣的情况,下面的代码在使用 Excel 2010 的 Windows 7 上几乎可以立即运行,并且多年来我们一直没有遇到任何问题,但现在使用 Excel 2016 和/或在 Windows 10 上添加记录需要将近 30 秒Office 365。这导致用户的生产力出现痛苦的延迟(由于 Windows 7 EOL,我们本周刚刚切换到 Windows 10/Excel 2016)我想知道我是否在 VBA/Excel 中遗漏了一些可能导致的新内容这样的延迟或者如果代码需要一些清理。注意:我没有编写此代码,但我的任务是修复它。

该代码显示了一个 VBA 用户表单,用户可以键入或复制和粘贴多达 16 个不同的字段(如下所示)。一旦他们单击添加按钮,它就会将记录添加到 ws 列表中。一点也不复杂,理论上它应该立即运行。我不知道为什么要花这么长时间。有人可以帮忙吗?

谢谢!

代码

模块1

Sub showme()
    frmqcinfo.Show 0
End Sub

用户表单 frmqcinfo

Private Sub cmdAdd_Click()
    Dim ws As Worksheet
    Dim addme As Range
    Set ws = Sheet1
    Set addme = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

    If Not IsDate(txtdate.Value) Then
        MsgBox " The date field must be a proper date", vbExclamation, "Date format error"
        Me.txtdate.Value = ""
        Me.txtdate.SetFocus
        Exit Sub
    End If

    If Me.txtqcdte.Value = "" Or Me.cboproc.Value = "" Or Me.txttdk.Value = "" Or         Me.txtsmpsz.Value = "" Then
        MsgBox "There is insufficient data. All fields must be added", vbExclamation, "Mandatory                 fields are incomplete"
        Exit Sub
    End If

    With ws
    'set the date format to suit your area

        addme.Value = Format(txtdate.Value, "mm/dd/yy")
        addme.Offset(0, 1).Value = Me.cboproc.Value
        addme.Offset(0, 2).Value = Format(txtqcdte.Value, "mm/dd/yy")
        addme.Offset(0, 3).Value = Format(txttdk.Value, "00")
        addme.Offset(0, 4).Value = Format(txtsmpsz.Value, "00")
        addme.Offset(0, 5).Value = Format(txttranty.Value, "00")
        addme.Offset(0, 6).Value = Format(txtmissln.Value, "00")
        addme.Offset(0, 7).Value = Format(txtmdate.Value, "00")
        addme.Offset(0, 8).Value = Format(txtcovamt.Value, "00")
        addme.Offset(0, 9).Value = Format(txtwdk.Value, "00")
        addme.Offset(0, 10).Value = Format(txtesc.Value, "00")
        addme.Offset(0, 11).Value = Format(txtcsr.Value, "00")
        addme.Offset(0, 12).Value = Format(txtwrnst.Value, "00")
        addme.Offset(0, 13).Value = Format(txtcarrier.Value, "00")
        addme.Offset(0, 14).Value = Format(txtpolnum.Value, "00")
        addme.Offset(0, 15).Value = Format(txtfldzn.Value, "00")
        addme.Offset(0, 16).Value = Format(txtodd.Value, "00")
        addme.Offset(0, 17).Value = Format(txtoth.Value, "00")

    End With
    Sheet4.Select
'reset the form
    Unload Me
    frmqcinfo.Show 0
'update the sheet
    Application.ScreenUpdating = True

End Sub

标签: excelvba

解决方案


尝试关闭计算:Application.Calculation = xlManual。然后在最后重新打开它:Application.Calculation = xlAutomatic


推荐阅读