如何自动隐藏其他工作表中的列

a93*_*02c 0 excel vba

我想编写一个 VBA 函数,以便当隐藏“主”工作表中的列时,所有其他工作表中的同一列(同名)也被隐藏。以下是我的“主”表代码中的内容:

Private Sub Worksheet_Change(ByVal Target As Range)    
    Dim i As Integer, ws As Worksheet

    If IsEntireColumn(Target) = True Then    
        If Target.Hidden = True Then

            For i = 1 To Target.Columns.Count
                For Each ws In ThisWorkbook.Worksheets
                    If ws.Name = "Master" Or ws.Name = "Affiliate Codes" Then
                    Else
                        ws.Cells(1, ColumnIndexReturn(ws.Name, Target.Cells(1, i), 3)).EntireColumn.Hidden = True
                    End If
                Next ws
            Next i 

        End If    
    End If    

End Sub
Run Code Online (Sandbox Code Playgroud)

对于上下文,IsEntireColumn 是一个布尔函数,True如果所选范围确实是整个列,则返回该函数,而 ColumnIndexReturn 是另一个按列名称返回列索引的函数。

由于这是一个 Worksheet_Change 子项,我希望每次隐藏一列时,其他工作表中的相应列也会自动隐藏。但是,到目前为止这种情况还没有发生,其他工作表中的列不会自动隐藏自己。

我可以知道这里可能有什么问题吗?如果需要任何进一步的信息,请随时告诉我。任何帮助将不胜感激!先感谢您!

Fun*_*mas 5

你的要求有点棘手。

您的代码没有执行任何操作的主要原因:Change仅当单元格内容发生更改时才会触发 - 事件。显示/隐藏单元格(或任何其他格式)不会触发更改事件。

更好的事件是Selection_Change每当选择单元格时触发的事件。但是,这也不起作用:当您选择一列时会触发此事件,当您右键单击(选择“隐藏”命令)时会再次触发该事件,但隐藏该列后不会触发该事件

我想到的最好的主意是“记住”活动中选定的专栏Selection_Change下次Selection_Change调用时,对之前记住的列执行显示/隐藏逻辑 - 用户迟早会选择另一个单元格。但有一个例外:当用户在隐藏一列后立即选择另一张工作表时。为了解决这个问题,我们可以使用 -event 。Worksheet_Deactivate

我想出了以下代码:

Option Explicit
Dim lastSelectedColumn As Range

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not lastSelectedColumn Is Nothing Then
        ShowHideColumns lastSelectedColumn
    End If
    
    If IsEntireColumn(Target) Then
        Set lastSelectedColumn = Target
    Else
        Set lastSelectedColumn = Nothing
    End If
End Sub

Private Sub Worksheet_Deactivate()
    If Not lastSelectedColumn Is Nothing Then
        ShowHideColumns lastSelectedColumn
        Set lastSelectedColumn = Nothing
    End If
End Sub

Sub ShowHideColumns(Target As Range)
    Dim col As Long, ws As Worksheet
    For col = 1 To Target.Columns.Count
        For Each ws In ThisWorkbook.Worksheets
            If ws.Name <> "Master" And ws.Name <> "Affiliate Codes" And ws.Name <> Target.Parent.Name Then
                Dim cell As Range
                Set cell = Target.Cells(1, col)
                ws.Cells(1, cell.Column).EntireColumn.Hidden = cell.EntireColumn.Hidden
            End If
        Next ws
    Next col
End Sub

Function IsEntireColumn(Target As Range) As Boolean
    IsEntireColumn = (Target.Rows.Count = Target.Parent.Rows.Count)
End Function
Run Code Online (Sandbox Code Playgroud)

请注意,代码不仅隐藏列,而且还会再次显示它们。