在Excel 2007中运行良好的vba代码将不会在Excel 2013中运行

我有一些vba代码添加用户名和密码来设置用户编辑范围。
该代码在Excel 2007中工作得很好,但是当我尝试在Excel 2013中运行它时,我不断收到运行时错误1004应用程序定义错误或对象定义错误。 代码停止在行集erTimeInputs。 我相信这是因为variableserTimeInputs有一个什么都没有的值,但我不能让它接受一个值。 我试图将其定义为各种数据types,但似乎没有任何工作。

这是我的代码:

Sub AddUserEditRanges() 'Update username and password before running this macro Dim UserNameArr() As Variant Dim UserRangeArr() As Variant Dim UserPsswdArr() As Variant Dim v As Variant Dim LastUserRow As Integer Dim i As Integer Dim ws As Worksheet, rng As Range, UserRange As Range, aer As AllowEditRange Dim UserName As String Dim Psswd As String Dim erTimeInputs as Variable 'Find number of users LastUserRow = Range("A170").End(xlDown).Row 'set arrays UserNameArr = Range("B168:B" & LastUserRow).Value UserPsswdArr = Range("C168:C" & LastUserRow).Value UserRangeArr = Range("D168:D" & LastUserRow).Value For v = LBound(UserNameArr) To UBound(UserNameArr) UserName = UserNameArr(v, 1) UserRange = UserRangeArr(v, 1) Psswd = UserPsswdArr(v, 1) 'Add edit ranges to the worksheets for all users. Set erTimeInputs = _ Worksheets("Week1").Protection.AllowEditRanges.Add(Title:= _ UserName, Range:=Worksheets("Week1") _ .Range(UserRange), Password:=Psswd) Set erTimeInputs = _ Worksheets("Week2").Protection.AllowEditRanges.Add(Title:= _ UserName, Range:=Worksheets("Week2") _ .Range(UserRange), Password:=Psswd) Next End Sub 

正如注释,你可以明确地声明你的variables为AllowEditRangevariablestypes。
现在,只要分配给它的标题不存在,就不会有问题,否则会抛出运行时错误。
我不知道为什么你需要设置或分配给一个variables对象,但如果你想要的只是添加用户名和密码,你可以做到这一点,而不分配给一个variables。

 For v = LBound(UserNameArr) To UBound(UserNameArr) UserName = UserNameArr(v, 1) UserRange = UserRangeArr(v, 1) Psswd = UserPsswdArr(v, 1) 'Check if worksheet is unprotected and ready for editing If Worksheet("Week1").ProtecContents = True Then Msgbox "Unprotect Sheet first", _ vbCritical: Exit Sub 'Add edit ranges to the worksheets for all users. If AllowEditExist(UserName, Worksheets("Week1")) Then 'Delete Existing Worksheets("Week1").Protection.AllowEditRanges(UserName).Delete End If 'Add New Worksheets("Week1").Protection.AllowEditRanges.Add Ttle:= _ UserName, Range:=Worksheets("Week1") _ .Range(UserRange), Password:=Psswd Next 

编辑1:下面的例程将检查AllowEditRange是否已经存在。

 Function AllowEditExist(mytitle As String, sh As Worksheet) As Boolean Dim a As AllowEditRange: AllowEditExist = False For Each a In sh.Protection.AllowEditRanges If a.Title = mytitle Then AllowEditExist = True Exit For End If Next End Function 

重要提示:在添加,删除AllowEditRanges之前,您应该取消保护工作表,否则会产生错误。