问题描述
早上好,
其实是一件容易的事,但也带来了问题。
我有两种情况。
场景 1 - 在开头和结尾隐藏列(但不在中间)- 这有效 比我有一个再次显示所有列的默认按钮,这就是计划之前,我可以在按钮场景 2 上再次单击,但这次我必须隐藏 和 这部分之间的列不起作用。
这是可解的还是逻辑本身不可解的?在这种情况下,我的方法是通过一个简单的 Makro。
Sub Szenario2()
'
' Szenario2 Makro
'
'
Columns("B:C").Select
Range("B2").Activate
Selection.EntireColumn.Hidden = True
Columns("E:K").Select
Range("E2").Activate
Selection.EntireColumn.Hidden = True
Columns("M:R").Select
Range("M2").Activate
Selection.EntireColumn.Hidden = True
Columns("X:AM").Select
Range("X2").Activate
ActiveWindow.SmallScroll ToRight:=4
Columns("X:AQ").Select
Range("X2").Activate
ActiveWindow.SmallScroll ToRight:=4
Columns("X:AT").Select
Range("X2").Activate
Selection.EntireColumn.Hidden = True
Columns("AV:BD").Select
Selection.EntireColumn.Hidden = True
Columns("BH:BH").Select
Selection.EntireColumn.Hidden = True
Columns("BK:BM").Select
Selection.EntireColumn.Hidden = True
Columns("BR:BT").Select
Selection.EntireColumn.Hidden = True
Columns("BZ:BZ").Select
Selection.EntireColumn.Hidden = True
Columns("CE:CE").Select
Selection.EntireColumn.Hidden = True
ActiveWindow.ScrollColumn = 24
ActiveWindow.ScrollColumn = 23
ActiveWindow.ScrollColumn = 25
ActiveWindow.ScrollColumn = 49
ActiveWindow.ScrollColumn = 58
ActiveWindow.ScrollColumn = 59
ActiveWindow.ScrollColumn = 61
ActiveWindow.ScrollColumn = 64
Columns("CJ:CN").Select
Selection.EntireColumn.Hidden = True
ActiveWindow.ScrollColumn = 61
ActiveWindow.ScrollColumn = 58
ActiveWindow.ScrollColumn = 52
ActiveWindow.ScrollColumn = 46
ActiveWindow.ScrollColumn = 22
ActiveWindow.ScrollColumn = 18
ActiveWindow.ScrollColumn = 11
ActiveWindow.ScrollColumn = 4
ActiveWindow.ScrollColumn = 1
End Sub
最后它通过激活按钮场景 2 向我展示了列 AU、BE、BF、BG。所有这些实际上都属于选择,但这些不是全部,其他的都隐藏了。
如果我想先拥有我的原始表格视图,我必须点击场景 1,然后点击默认按钮。
感谢提供方法。
附注
也许这会导致 50% 的数据在表格中格式化而另外 50% 的数据未在表格中格式化的问题?
解决方法
此代码将在很大程度上执行您想要的操作。您可以通过多种不同方式调用它以适应您的场景。
Private Sub HideColumns(ByVal Hide As Boolean,_
Optional ByVal Arr As Variant)
Dim UsedRng As Range ' used range to show/hide from
Dim Rng As Range ' range of columns to hide or show
Dim i As Integer ' loop counter: Arr index
Application.ScreenUpdating = False ' don't waste time on showing until you're done
With ActiveSheet ' better name the sheet !
With .UsedRange
i = .Columns.Count + .Column ' temporary,local use of this variable
End With
Set Rng = Range(.Columns(1),.Columns(i))
Rng.Columns.Hidden = Hide ' hide or unhide all columns
If IsMissing(Arr) Then
' 'HideColumns True' will hide everything
Exit Sub
Else
Set Rng = .Columns(Arr(0))
For i = 1 To UBound(Arr)
' append all named columns to the range
Set Rng = Application.Union(Rng,.Columns(Arr(i)))
Next i
Rng.Columns.EntireColumn.Hidden = Not Hide
End If
End With
ActiveWindow.ScrollIntoView Left:=0,Top:=0,Width:=100,Height:=200
Application.ScreenUpdating = True ' display the result
End Sub
该过程有 2 个参数,第二个是可选的。第一个参数指定如何处理所有列,隐藏它们 (=True) 或不隐藏它们 (=False)。因此,HideColumns True
将隐藏所有内容,而 HideColumns False
将显示所有内容。
第二个参数给出一个列列表。您可以使用单独的列 ID(如“AD”)或列范围(如“AD:AH”)、逗号分隔、任意数量的列来准备数组。这些专栏的命运将与第一个论点所说的相反。如果所有列都隐藏,则列出的列将是例外,反之亦然。
最后,工作表的第一个可见单元格被滚动到视图和显示中,首先在上面禁用,恢复。
您现在应该准备如下所示的小程序,每个程序响应您的一个按钮并使用不同(或缺失)的列数组调用相同的程序。
Private Sub Test_HideColumns()
Dim Clms() As String
Clms = Split("AU,BE:BG",",")
HideColumns False,Clms
End Sub