Excel 按钮单击-隐藏中间的列会导致问题
早上好 事实上,这是一件容易的事情,但也带来了问题 我有两种情况Excel 按钮单击-隐藏中间的列会导致问题,excel,vba,hide,Excel,Vba,Hide,早上好 事实上,这是一件容易的事情,但也带来了问题 我有两种情况 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
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
场景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,然后单击默认按钮
谢谢你的帮助
PS
可能这会导致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
尝试更具冒险精神“-(1)你不需要选择任何东西来解决它。(2)你不需要滚动到某个地方来选择它。(3)一旦隐藏,列将保持隐藏状态,直到再次取消隐藏为止。因此,只有同时隐藏部分和取消隐藏部分时,切换才能起作用。因此,您应该考虑范围(隐藏/取消隐藏),而不是列。非常感谢!我理解得对吗,在循环中,我必须在代码集Rng=Application.Union(Rng,.columns(Arr(i))中添加我的范围)对于我来说?我是否理解您提供的最后一个小代码实际上应该足够了?至少我会从这个开始。是的,
Test\u HideColumns
就足够了,您可以在这里指定要隐藏或显示的列。过程HideColumns
不应该被触摸。所有从调用者处执行指令,HideColumns
根据接收到的指令进行操作。