我需要能够在excel(VBA)中对已锁定列标题的受保护工作表进行排序

时间:2016-02-03 23:30:15

标签: excel vba excel-vba

我正在制作一份excel文件,一切都很顺利。但是,我要解决最后一个问题,即解决问题:能够在工作表受到保护且列标题被锁定的情况下按升序/降序对列进行排序。我将首先陈述一些关于我的工作表的事实,我要完成的目标,然后是我研究过的可能的解决方案,以及为什么这些解决方案似乎不适用于我的情况。

  1. 首先,我 NOT 使用excel表对象(只是简单 行/列)。
  2. 第一行已应用AutoFilter(用作列标题)。
  3. 工作表中的所有单元格都已解锁, EXCEPT 表示已解锁 整个第一行被锁定(也就是列标题)。
  4. 工作表将受到保护。
  5. 我不希望用户能够编辑第一行中的数据(这个 很重要,无论如何都不能编辑。
  6. 对于受保护的工作表设置,我有“选择已锁定” 单元格“,”选择未锁定的单元格“,”插入行“,”删除行“,”排序“, 并选中“AutoFilter”。
  7. 我正在使用VBA作为我的工作表。
  8. 我正在使用Excel 2013
  9. 现在,假设工作表受到保护,用户当前可以使用顶部的AutoFilter实际按照预期“过滤”数据。问题是每当他们尝试按升序/降序对数据进行“排序”时,我会收到一条错误消息,说明您必须先取消保护表单。

    经过研究我发现这是因为当您排序时,AutoFilter会自动将列标题计为排序范围的一部分...但是因为此列标题(第1行)被锁定,所以导致此错误。但是,要锁定此行,我的VBA代码专门读取这些列标题中的值,在任何情况下都不能更改它们。

    所以过滤效果很好,这只是我现在要弄清楚的排序。我的“理想”解决方案是以某种方式捕获事件,当用户点击自动筛选箭头并选择“排序”时我可以在VBA中取消保护工作表,根据他们的选择进行排序,然后再次保护工作表。然而,经过研究,似乎在这个AutoFilter按钮的事件中确实没有选项(我可能是错的,有时可能会混淆阅读其他人的建议)。

    我希望有人可以帮助我解决这种情况,我也希望避免使用excel表对象,但是如果它是唯一符合我所有上述标准的解决方案那么就是它

    提前感谢您的帮助。

2 个答案:

答案 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

注意

解锁分类所需的单元格,然后在保护工作表时允许选择未锁定的单元格,这样就可以编辑数据,从而使工作表保护无效。 还有上面的代码,仍然存在可以编辑单元格的漏洞。如果选择允许的单元格,请将其拖动到标题行,然后选择替换单元格中的数据,然后选择可编辑的标题单元格。

结束注释

选择需要排序的数据范围并解锁单元格。

保护工作表时,请务必允许

  • 排序
  • 自动筛选

为防止用户更改单元格内容,请禁止选择未锁定的单元格。