背景详情 我有一个带有Activex下拉(组合框)对象的Excel电子表格,可帮助用户了解可用的选项。我这样做是因为数据验证列表下拉列表的字体太小,并且收集了很多抱怨。
所以我的解决方案是添加组合框对象,允许用户从一系列选项中进行选择。但是,我必须将组合框链接到具有linkedcell属性的单元格,以便用户和各种公式都可以看到已选择的内容。我还将组合框设置为在不使用时消失(与选择相关单元格时仅显示数据验证下拉按钮的方式相同)。
以下是问题: 我不希望用户编辑链接单元格中的值,因此我确保在未选择组合框时锁定链接的单元格:
Private Sub comboBox1_GotFocus()
Call unlockComboBoxTargetCell(comboBox1)
End Sub
上述程序执行此操作:
If (targetComboBox.LinkedCell <> "") Then
Dim targetCell As Variant
Set targetCell = Range(targetComboBox.LinkedCell)
If Not targetCell Is Nothing And targetCell.Locked <> False Then
unlockSheet (activesheet.Name)
targetCell.MergeArea.Locked = False
lockSheet (activesheet.Name)
End If
End If
存在锁定目标细胞的等效程序。 但是,每当您在工作簿上执行“另存为”操作时,链接和锁定单元格似乎都会产生问题:Excel会突然显示此错误: “您尝试更改的单元格或图表受到保护,因此只读...” 对于每个被锁定的单元,此错误大约会出现两次或三次,并且是组合框的链接单元。
有没有一种方法可以解决这个问题?现在我最好的解决方案是让单元格解锁并在单元格上进行数据验证,这样如果用户编辑单元格,当输入无效内容时,它们至少会被拒绝。我可以确保组合框在选中时会覆盖链接的单元格,但有时这意味着它有一个非常大的,令人讨厌的组合框,右侧有一个非常小的下拉按钮。
也许我对用户界面有点过分了?
提前感谢您阅读这篇漫长而有意义的帖子。
答案 0 :(得分:2)
在您创建的“lockSheet”过程中,“保护”工作表的代码需要一个额外的参数UserInterfaceOnly
,设置为true。
我认为LockSheet子是这样的;
sub lockSheet(strSheetName as string)
thisworkbook.sheets(strSheetName).Protect
end sub
试试这个:
sub lockSheet(strSheetName as string)
thisworkbook.sheets(strSheetName).Protect, UserInterfaceOnly=True
end sub
UserInterfaceOnly
允许对受保护的工作表进行编程更改。
比尔