【问题标题】:Hide Columns with VBA使用 VBA 隐藏列
【发布时间】:2023-03-03 21:37:01
【问题描述】:

我有一个包含 2 张工作表的 excel 文件,在单元格 B5 的 sheet1 中,我有一个值会根据其他单元格自动更改。如果 sheet1 上的 B5 分别为 3 或 2,我的目标是隐藏 sheet2 上的 Y:AN 或 AQ:BF 列。我应用了下面的代码,但是当我保护 sheet2 时不起作用。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(False, False) = "B5" Then
    Select Case Target.Value
        Case "3"
            Columns("Y:AN").EntireColumn.Hidden = True
        Case "2"
            Columns("AQ:BF").EntireColumn.Hidden = True
        Case Else
            Union(Columns("Y:AN"), Columns("AQ:BF")).EntireColumn.Hidden = False
    End Select
End If

结束子

【问题讨论】:

  • 以编程方式取消保护/保护,或将保护更改为UserOnlyInterface:=True
  • 如果您将值从 3 更改为 2,它不会取消隐藏“Y:AN”列。这是故意的吗?
  • 你说单元格B5我有一个值会根据其他单元格自动改变。这是否意味着 B5 包含一个公式?如果是这样,B5 更改不会触发 Change 事件。您需要使用Calculate 事件。 SO上有很多关于这个的帖子
  • 如果事件确实触发了,并且代码在Sheet1 中(它必须响应Sheet1!B5 的变化),那么您的代码将隐藏Sheet1 上的列。您需要使用所需的工作表参考来限定它们
  • 此外,如果一次更改 >1 个单元格,您的代码将出错,例如使用复制/粘贴

标签: excel vba


【解决方案1】:

在您的代码中使用 unprotect 方法并在程序之后进行保护

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(False, False) = "B5" Then
    thisworkbook.worksheets("").unprotect  ' enter sheet name, if protected by password .unprotect("password")
    Select Case Target.Value
        Case "3"
            Columns("Y:AN").EntireColumn.Hidden = True
        Case "2"
            Columns("AQ:BF").EntireColumn.Hidden = True
        Case Else
            Union(Columns("Y:AN"), Columns("AQ:BF")).EntireColumn.Hidden = False
    End Select
    thisworkbook.worksheets("").protect   ' enter sheet name, if protected by password .protect("password") //check docs
End If


【讨论】:

    【解决方案2】:

    protect 方法关注的是工作表而不是工作表。你需要添加片段

    worksheets(NAME).protect(password)
    

    例如

    Private Sub Worksheet_Calculate() 
    dim ws as worksheet
    dim password as string
    password = "qwerty"  ' add password
    set ws=thisworkbook.worksheets("Sheet2")
    If Range("B5").Value = "2" Then 
    Sheet2.Columns("AQ:BF").EntireColumn.Hidden = True 
    ElseIf Range("B5").Value = "3" Then 
    Sheet2.Columns("Y:AN").EntireColumn.Hidden = True 
    Else Sheet2.Columns("AQ:BF").EntireColumn.Hidden = False
    Sheet2.Columns("Y:AN").EntireColumn.Hidden = False 
    End If 
    ws.protect(password )
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多