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
根据接收到的指令进行操作。