【问题标题】:How to filter rows, hide/unhide columns in protected worksheet?如何过滤行,隐藏/取消隐藏受保护工作表中的列?
【发布时间】:2020-02-16 00:31:18
【问题描述】:

我有一个用于小组协作的 Excel 工作表。它受密码保护。

由于密码保护限制,我正在尝试编写 VBA 代码,以便其他用户在受保护的工作表中仍然可以过滤行、隐藏/取消隐藏列。

它在 ThisWorkbook 中如下所示:-

Private Sub Workbook_Open()

Dim wSheet As Worksheet

For Each wSheet In Worksheets
    wSheet.Protect Password:="LoveisPatience", _
    UserInterFaceOnly:=True
Next wSheet

With ActiveSheet
    .Protect Password:="LoveisPatience", AllowFiltering:=True
    .EnableSelection = xlUnlockedCells
End With

With ActiveSheet
    .Protect Password:="LoveisPatience", AllowFormattingColumns:=True
    .EnableSelection = xlUnlockedCells
End With

End Sub

使用上面的代码,我设法隐藏以前用“数据选项卡>组”完成的列,但我无法取消隐藏任何列。

并且由于包含此“AllowFormattingColumns:”,行的“AllowFiltering”功能现在无法使用。

如何使过滤行和隐藏/取消隐藏列无缝工作?

【问题讨论】:

  • 我想你会在这里找到你需要的东西:codevba.com/excel/protect_worksheet.htm#.Xki07-KF6Uk。另请查看 Microsoft 对您的主题的看法。 docs.microsoft.com/en-us/office/vba/api/excel.worksheet.protect
  • 您好 Variatus_谢谢您的建议。您在上面显示的网站让我很好地理解了当 Excel 工作表受到保护时可以做什么。谢谢。
  • 每个工作表都有一个Protection 对象,该对象具有许多可以修改的属性,就像您可以修改Range 对象的每个属性一样。 ActiveSheet.Protect 为该工作表创建一个 Protection 对象。任何工作表都不能有多个 Protection 对象。因此下一个ActiveSheet.Protect 删除现有对象并在其位置建立另一个对象。这个过程并没有给人以效率的印象。更好的方法是修改现有的。或者至少删除现有的(Unprotect),以免混淆代码的无辜读者。

标签: excel vba


【解决方案1】:

以下代码适用于我:

Private Sub Workbook_Open()

Dim wSheet As Worksheet

For Each wSheet In Worksheets
    wSheet.Protect Password:="password", UserInterFaceOnly:=True
Next wSheet

With ActiveSheet
    .Protect Password:="password", AllowFiltering:=True, AllowFormattingColumns:=True
    .EnableSelection = xlUnlockedCells
End With

问题似乎是两个 with 语句不一致。第二个 with 语句(格式化列)阻止了第一个(过滤)。这有点奇怪,因为这些行应该是解锁的。

它对你有用吗?

干杯

【讨论】:

  • 嗨 Trib-RS25_ 非常感谢。您的代码运行良好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多