我想编写一个 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 子项,我希望每次隐藏一列时,其他工作表中的相应列也会自动隐藏。但是,到目前为止这种情况还没有发生,其他工作表中的列不会自动隐藏自己。
我可以知道这里可能有什么问题吗?如果需要任何进一步的信息,请随时告诉我。任何帮助将不胜感激!先感谢您!
你的要求有点棘手。
您的代码没有执行任何操作的主要原因: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)
请注意,代码不仅隐藏列,而且还会再次显示它们。
归档时间: |
|
查看次数: |
106 次 |
最近记录: |