Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在MS Excel中保护工作表时,如何避免运行时错误?_Vba_Excel - Fatal编程技术网

Vba 在MS Excel中保护工作表时,如何避免运行时错误?

Vba 在MS Excel中保护工作表时,如何避免运行时错误?,vba,excel,Vba,Excel,下面的代码段更改单元格的数据验证状态,并在Excel-2003工作表未受保护时运行。但是,当我保护工作表时,宏不会运行并引发运行时错误 运行时错误“-2147417848(80010108)”: 对象“验证”的方法“添加”失败 我尝试过用 Me.unprotect ... Me.protect 但这并不能正常工作。那么,当工作表在没有上述运行时错误的情况下受到保护时,我如何修改下面的代码来工作(即让代码修改未锁定单元格的验证) 更新 我的原著是一本Excel2003。我在Excel2007中测

下面的代码段更改单元格的数据验证状态,并在Excel-2003工作表未受保护时运行。但是,当我保护工作表时,宏不会运行并引发运行时错误

运行时错误“-2147417848(80010108)”:

对象“验证”的方法“添加”失败

我尝试过用

Me.unprotect
...
Me.protect
但这并不能正常工作。那么,当工作表在没有上述运行时错误的情况下受到保护时,我如何修改下面的代码来工作(即让代码修改未锁定单元格的验证)

更新

我的原著是一本Excel2003。我在Excel2007中测试了@solution,并使用以下工作簿\u Open定义

Sub WorkBook_Open()
    Me.Worksheets("MainTable").Protect  contents:=True, userinterfaceonly:=True 
End Sub
当工作表受到保护时,代码仍会失败,并出现以下运行时错误

运行时错误“1004”: 应用程序定义或对象定义错误

谢谢,阿齐姆


代码片段

'cell to add drop down validation list'
dim myNamedRange as String
dim modifyCell as Range 
modifyCell = ActiveCell.Offset(0,1) 


' set list values based on some conditions not defined for brevitity'
If myCondition then
   myNamedRange = "range1"
Else
   myNamedRange = "range2"
End If

With modifyCell.Validation
   .Delete

   'Run time error occurs on the next line'
   .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _
        Operator:=xlBetween, Formula1:="=" & myNamedRange

   ... 
   ' skipping more property setting code '
   ...
End With

如果我理解正确,你就是保护床单的人。如果是这种情况,可以使用以下VBA:

myWorksheet.Protect contents:=True, userinterfaceonly:=True
这里的关键部分是“userinterfaceonly:=true”。使用此标志集保护工作表时,仍允许VBA宏进行更改

将此代码放入
工作簿\u Activate
事件中,以便在激活工作簿时自动保护工作簿并设置标志

编辑:感谢他建议使用
Workbook\u Activate
而不是
Workbook\u Open

编辑:由于上述操作似乎不起作用,您可能必须使用unprotect/protect命令包装VBA代码的失败部分。如果您这样做,我还将使用错误处理程序包装整个宏,以便在发生错误后不会使工作表不受保护:

Sub MyMacro
    On Error Goto HandleError

    ...

    myWorksheet.unprotect
    With ModifyCell.Validation
        ...
    End With
    myWorksheet.protect contents:=True, userinterfaceonly:=True

    ...

Goto SkipErrorHandler
HandleError:
    myWorksheet.protect contents:=True, userinterfaceonly:=True
    ... some code to present the error message to the user
SkipErrorHandler:
End Sub

编辑:查看PCreview。他们经历了几乎相同的步骤,得出了相同的结论。至少你不是一个人

我不确定这是否是一个通用的解决方案,但当我最近出现此错误时,我只需要在执行验证之前执行MywkSheet.Activate。添加。因此:

' set list values based on some conditions not defined for brevitity'
If myCondition then
   myNamedRange = "range1"
Else
   myNamedRange = "range2"
End If

''--------------------------------------------------
Sheets("mysheet").Activate
''--------------------------------------------------

With modifyCell.Validation
   .Delete

   'Run time error occurs on the next line'
   .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _
        Operator:=xlBetween, Formula1:="=" & myNamedRange

   ... 
   ' skipping more property setting code '
   ...
End With

在我的例子中,屏幕更新已经关闭,所以用户永远不会看到页面来回切换。HTH.

谢谢你的链接,雷莫。我还没有遇到那个问题,但至少现在我知道它发生时发生了什么!是的,你正确地理解了我的问题;我是保护床单的人。我尝试了您的解决方案(在Excel 2007中)并在工作表受保护时出现运行时错误“1004”。您是在运行MyWorket.protect时还是之后出现该错误?我是在运行MyWorket.protect后出现该错误的。我取消对工作表的保护,保存文件,关闭它,打开它,打开事件保护工作表,然后运行宏将引发错误。您是否已解锁该特定单元格?(在单元格属性中未选中锁定)?我想答案是肯定的,但我必须检查一下!:)可能重复的