下面的代码段会更改单元格的数据验证状态,并在Excel-2003工作表不受保护时运行。但是,当我保护工作表时,宏不会运行并引发运行时错误
运行时错误'-2147417848(80010108)':
方法'添加'对象'验证'失败
我尝试用
包装代码Me.unprotect
...
Me.protect
但是这不能正常工作。那么,当工作表受到保护而没有上述运行时错误时,如何修改下面的代码才能工作(即让代码修改解锁单元格的验证)?
更新
我的原始工作簿是Excel 2003.我在Excel 2007中测试了@ eJames解决方案,其中包含Workbook_Open的以下定义
Sub WorkBook_Open()
Me.Worksheets("MainTable").Protect contents:=True, userinterfaceonly:=True
End Sub
当工作表受到保护时,代码仍会失败并出现以下运行时错误
运行时错误'1004': 应用程序定义或对象定义的错误
谢谢,Azim
代码段
'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
答案 0 :(得分:12)
如果我正确理解了这个问题,那么你就是保护这张纸的人。如果是这种情况,您可以使用以下VBA:
myWorksheet.Protect contents:=True, userinterfaceonly:=True
这里的关键部分是“userinterfaceonly:= true”。当使用此标志设置保护工作表时,仍允许VBA宏进行更改。
将此代码放入WorkBook_Activate
事件中以自动保护工作簿并在激活时设置标记。
修改:感谢Lance Roberts建议您使用Workbook_Activate
代替Workbook_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上查看this thread。他们经历了相同的步骤,得出了同样的结论。至少你并不孤单!
答案 1 :(得分:2)
我不确定这是否是一个通用解决方案,但是当我最近遇到此错误时,我只需要在执行Validation.Add之前执行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
在我的情况下,ScreenUpdating已经关闭,因此用户永远不会看到工作表来回切换。 HTH。