Excel VBA-随机运行时错误

时间:2018-07-04 03:29:25

标签: excel vba

我是Excel VBA的新手,但设法在工作人员时间表中创建了三个按钮。所有按钮都会根据需要工作,但是,一个特定的按钮会导致随机问题-大约90%的时间都在起作用,但是有时它会导致Excel崩溃或出现错误,例如运行时错误'-2147417848(800 10 108) ':自动化错误调用的对象已与其客户端断开连接。有时,这是一条类似的消息,称对象“范围”的方法“插入”失败。 这是在不同计算机上的不同版本的Excel中发生的。这项任务并不复杂,但是我对自己的VBA知识感到困惑。
用户单击按钮以设置工作表中称为“时间表”的每个格式化行,即,单击“时间表”中的按钮可从sheet4(格式化并包含公式)复制一行并将其插入按钮上方的“时间表”中。
如果有人可以建议其他不会导致Excel崩溃的代码,我将非常感谢-非常感谢!

Sub NewSlot()

' NewSlot Macro used in Timesheet
'
    'turn protection off
    Worksheets("Sheet4").Unprotect Password:="mypasswd"
    Worksheets("Timesheet").Unprotect Password:=" mypasswd "

    ' select row 8 in sheet4
    Sheets("Sheet4").Select
    Rows("8").Select
    Selection.Copy

    ' go back to timesheet
    Sheets("Timesheet").Select

    ' insert copied row
    Dim r As Range
    Set r = ActiveSheet.Buttons(Application.Caller).TopLeftCell
    Range(Cells(r.Row, r.Column), Cells(r.Row, r.Column)).Offset(0, 0).Select

    Selection.Insert shift:=xlDown
    Application.CutCopyMode = False


    'turn protection on
    Worksheets("Sheet4").Protect Password:=" mypasswd "
    Worksheets("Timesheet").Protect Password:=" mypasswd"

End Sub

1 个答案:

答案 0 :(得分:0)

如果要使用VBA反复修改受保护的工作表,请取消保护它,然后使用UserInterfaceOnly:= True对其进行一次保护。

sub protectOnce()
    worksheets("Timesheet").unprotect password:="mypasswd"
    worksheets("sheet4").unprotect password:="mypasswd"
    worksheets("Timesheet").protect password:="mypasswd", UserInterfaceOnly:=True
    worksheets("sheet4").protect password:="mypasswd", UserInterfaceOnly:=True
end sub

完成此操作后,您将不必取消保护即可使用VBA进行修改。如果由于其他原因必须取消保护它,请使用UserInterfaceOnly:= True重新保护它。

这大大减少了您的NewSlot代码。避免使用“选择并激活”(尤其是跨工作表)是“最佳实践”。

Sub NewSlot()

    ' select row 8 in sheet4
    workSheets("Sheet4").Rows("8").Copy

    ' go back to timesheet
    with workSheets("Timesheet")
        ' insert copied row
        Dim r As Range
        Set r = .Buttons(Application.Caller).TopLeftCell
        .Cells(r.Row, "A").entirerow.Insert shift:=xlDown
    end with

End Sub