【问题标题】:vba code that runs fine in Excel 2007 will not run in Excel 2013在 Excel 2007 中运行良好的 vba 代码不会在 Excel 2013 中运行
【发布时间】:2014-08-26 04:18:00
【问题描述】:

我有一些 vba 代码可以添加用户名和密码来设置用户编辑范围。
该代码在 Excel 2007 中运行良好,但是当我尝试在 Excel 2013 中运行它时,我不断收到运行时错误 1004 应用程序定义或对象定义错误。 代码在 erTimeInputs 行处停止。 我相信这是因为变量 erTimeInputs 没有任何值,但我无法让它接受一个值。我试图将其定义为各种数据类型,但似乎没有任何效果。

这是我的代码:

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

【问题讨论】:

  • Dim erTimeInputs as Variable 这行肯定是错的。没有Variable 类型。或许您正在考虑Variant,就像您定义的其他类型一样?
  • 您可以将其声明为@CodyGray 评论的Variant,或者您可以将其明确声明为:Dim erTimeInputs As AllowEditRange
  • 对不起,变量只是我的拼写错误。我尝试将其声明为 Variant、AllowEditRange、Range 和其他类型,但均未成功。

标签: excel vba


【解决方案1】:

如评论所述,您可以将变量显式声明为 AllowEditRange 变量类型。
现在,只要您分配给它的 Title 不存在就应该没有问题,否则它会抛出运行时错误。
我不知道你为什么需要设置或分配给变量对象,但如果你想要的只是添加用户名和密码,你可以在不分配给变量的情况下做到这一点。

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

Edit1:下面的例程将检查 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之前应取消对工作表的保护,否则会报错。

【讨论】:

  • 感谢您的信息,但当我运行您建议的不带变量的代码时,我仍然收到相同的 1004 错误。如前所述,这在 2007 年已经运行了相当长的一段时间,但是当我在 2013 年运行它时遇到了错误
  • @James42 您是否尝试过检查 AllowEditRange 是否已经存在?我将更新我的帖子并包含一个检查 AllowEditRange 是否已经存在的例程。
  • @James42 我认为上面的代码将在 XL2013 中工作,这很可能已经涵盖了运行时的原因。如果需要,您还可以选择在运行时取消保护工作表,而不是显示MsgBox
  • 感谢大家的努力,但还是不行。我在例程开始时取消保护工作表我只是没有包含该代码,AllowEditRanges 在运行之前都被清除,所以标题肯定不存在。
  • 再次感谢您的帮助,看来您已经成功了。我已经注释掉了清除标题的例程,当然其中一个工作表中仍然存在一个标题。这次是我的错误,所以再次感谢并为红鲱鱼道歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多