我正在制作一份excel文件,一切都很顺利。但是,我要解决最后一个问题,即解决问题:能够在工作表受到保护且列标题被锁定的情况下按升序/降序对列进行排序。我将首先陈述一些关于我的工作表的事实,我要完成的目标,然后是我研究过的可能的解决方案,以及为什么这些解决方案似乎不适用于我的情况。
现在,假设工作表受到保护,用户当前可以使用顶部的AutoFilter实际按照预期“过滤”数据。问题是每当他们尝试按升序/降序对数据进行“排序”时,我会收到一条错误消息,说明您必须先取消保护表单。
经过研究我发现这是因为当您排序时,AutoFilter会自动将列标题计为排序范围的一部分...但是因为此列标题(第1行)被锁定,所以导致此错误。但是,要锁定此行,我的VBA代码专门读取这些列标题中的值,在任何情况下都不能更改它们。
所以过滤效果很好,这只是我现在要弄清楚的排序。我的“理想”解决方案是以某种方式捕获事件,当用户点击自动筛选箭头并选择“排序”时我可以在VBA中取消保护工作表,根据他们的选择进行排序,然后再次保护工作表。然而,经过研究,似乎在这个AutoFilter按钮的事件中确实没有选项(我可能是错的,有时可能会混淆阅读其他人的建议)。
我希望有人可以帮助我解决这种情况,我也希望避免使用excel表对象,但是如果它是唯一符合我所有上述标准的解决方案那么就是它
提前感谢您的帮助。
答案 0 :(得分:2)
如果您已使用VBA,则可以将此代码插入Sheet模块。这假设标题在第1行。更改为适合。
PM
现在不需要保护工作表。
答案 1 :(得分:0)
从@ Teylyn&#39>中借用一些内容并将其修改为禁止选择标题行,当它被选中时,它会直接选择它下面的单元格并显示错误消息。代码位于工作表模块中,如果需要应用于更多工作表,最好使用Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
,在这种情况下,将Me
的所有实例替换为Sh
下面的代码。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Me.Range("1:1")) Is Nothing Then
Target.Offset(1, 0).Select
MsgBox "You cannot select or edit the headerrow, please use the autofilter button to sort and filter.", vbCritical, "Invalid Selection"
End If
End Sub
解锁分类所需的单元格,然后在保护工作表时允许选择未锁定的单元格,这样就可以编辑数据,从而使工作表保护无效。 还有上面的代码,仍然存在可以编辑单元格的漏洞。如果选择允许的单元格,请将其拖动到标题行,然后选择替换单元格中的数据,然后选择可编辑的标题单元格。
选择需要排序的数据范围并解锁单元格。
保护工作表时,请务必允许
为防止用户更改单元格内容,请禁止选择未锁定的单元格。