我需要能够sorting已locking列标题在Excel中的受保护的工作表(VBA)

目前我正在做一个excel文档,一切都很好。 不过,我要回到最后一个问题,我有一个问题的解决:可以按升序/降序排列我的列,同时保护工作表和列标题被locking。 我会首先陈述一下我的工作表,我想完成的目标,然后是我研究的可能的解决scheme,以及为什么这些解决scheme似乎不适用于我的情况。

  1. 首先,我使用Excel表格对象(只是简单的行/列)。
  2. 最上面一行应用了AutoFilter(用作列标题)。
  3. 工作表中的所有单元格都被解锁, 除了locking的整个第一行(即列标题)外。
  4. 工作表将受到保护。
  5. 我不希望用户能够在第一行中编辑数据(这很重要,不pipe怎样都不能编辑)。
  6. 对于受保护的表单设置,我选中“selectlocking单元格”,“select解锁单元格”,“插入行”,“删除行”,“sorting”和“自动筛选”。
  7. 我正在为我的工作表使用VBA。
  8. 我正在使用Excel 2013

现在,假设工作表受到保护,用户当前可以使用顶部的自动筛选function来按照预期“过滤”数据。 问题是每当他们尝试按升序/降序“sorting”数据,我得到一个错误,说你必须首先取消保护表格。

研究后,我看到这是由于这样的事实,当你sorting,自动筛选自动计数列标题作为sorting范围的一部分…但由于列标题(行1)被locking,这是造成这一点错误。 但是,这一行已被locking,我的VBA代码专门读取这些列标题中的值,在任何情况下都不能更改。

所以过滤工作很好,这只是我现在试图弄清楚的sorting。 当用户点击AutoFilter箭头并在VBA中select“sorting”时,我的“理想”解决scheme将以某种方式捕捉事件,在VBA中取消保护表单,根据其select进行sorting,然后再次保护表单。 然而,再次研究,似乎真的没有一个选项,当涉及到这个AutoFilterbutton的事件(我可能是错的,有时可能会混淆阅读其他人的build议)。

我希望有人可以帮助我摆脱这种情况,我也想避免使用Excel表格对象,但如果它是唯一的解决scheme,满足我所有的上述标准,那么这样做。

在此先感谢您的帮助。

如果您已经使用VBA,则可以将此代码插入到工作表模块中。 这假定标题在第1行。更改为适合。

 Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("1:1")) Is Nothing Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub 

工作performance在不需要保护。

从@ Teylyn's中借用一下,并调整它不允许select标题行,当它被选中时,它直接select它下面的单元格,并显示一个错误信息。 代码位于表单模块中,如果需要应用于更多表单,最好使用Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) ,在这种情况下,用ShreplaceMe所有实例在下面的代码中。

 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 

注意

解锁sorting所需的单元格,然后在保护需要能够编辑数据的工作表时select解锁的单元格,使工作表保护function无效。
还有上面的代码,还有一个漏洞,通过它可以编辑单元格。 如果您select一个允许的单元格,将其拖到标题行,并selectreplace单元格中的数据,然后select并编辑允许的单元格移动到的标题单元格。

注释结束


select需要sorting的数据范围并解锁单元格。

保护工作表时,一定要允许

  • 分类
  • 自动筛选

为防止用户更改单元格内容,禁止select未locking的单元格。