关于vba:当工作表在MS

您所在的位置:网站首页 宏运行时错误代码1004作用于workbook 关于vba:当工作表在MS

关于vba:当工作表在MS

2024-07-14 13:18| 来源: 网络整理| 查看: 265

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

Run-time error '-2147417848 (80010108)':

Method 'Add' of object 'Validation' failed

我试过用

123Me.unprotect ... Me.protect

但这不能正常工作。 因此,在保护工作表而没有上述运行时错误的情况下,如何修改下面的代码以使其工作(即,使代码修改未锁定单元格的验证)?

更新资料

我的原始工作簿是Excel2003。我在Excel 2007中使用Workbook_Open的以下定义测试了@eJames解决方案

123Sub WorkBook_Open()     Me.Worksheets("MainTable").Protect  contents:=True, userinterfaceonly:=True End Sub

当工作表受保护时,代码仍然会失败,并显示以下运行时错误

Run-time error '1004': Application-defined or object-defined error

谢谢,阿齐姆

程式码片段

123456789101112131415161718192021222324'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 相关讨论 如何在Excel中保护单元格的可能重复项,但允许通过VBA脚本修改这些单元格

如果我对问题的理解正确,那么您将是保护工作表的人。在这种情况下,您可以使用以下VBA:

1myWorksheet.Protect contents:=True, userinterfaceonly:=True

这里的关键部分是" userinterfaceonly:= true"。当使用此标志设置保护工作表时,仍允许VBA宏进行更改。

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

编辑:感谢兰斯·罗伯茨(Lance Roberts)的推荐使用WorkBook_Activate而不是Workbook_Open。

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

12345678910111213141516171819Sub 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上查看此线程。他们经历了几乎相同的步骤,并得出了相同的结论。至少你并不孤单!

相关讨论 感谢您的链接,Remou。我还没有遇到这个问题,但至少现在我不知道它发生时会发生什么! 是的,您正确理解了我的问题;我是保护床单的人。我尝试了您的解决方案(在Excel 2007中),并在工作表受到保护时收到运行时错误1004。 在运行myWorksheet.protect或之后,您是否得到该错误? 运行myWorksheet.protect后出现错误。我取消保护工作表,保存文件,将其关闭,将其打开,打开事件会保护工作表,然后运行宏会引发错误。 您是否已解锁该特定单元? (锁定未选中的单元格属性)?我认为答案是肯定的,但是我必须检查一下! :) 我在回答中添加了可能的解决方法。我不确定为什么原始解决方案不起作用,但这也许会有所帮助 谢谢eJames。使用Workbook_Open保护工作表和将代码包装在保护取消保护块中的组合似乎可行。 我刚刚学习了很难用多个工作表弄乱,用Workbook_Open事件激活和取消激活的困难方法,所以我不得不转到Workbook_Activate事件。由于这似乎是该主题上最全面的文章,因此您可能也希望对其进行编辑。 非常感谢您的提示。非常非常有用

我不确定这是否是通用解决方案,但是最近遇到此错误时,我只需要在执行Validation.Add之前执行MywkSheet.Activate。所以:

12345678910111213141516171819202122' 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

在我的情况下,ScreenUpdating已经关闭,因此用户永远不会看到来回切换页面。 HTH。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3