如何在VBA for Excel中保存所有隐藏列的范围

问题描述

在VBA for Excel中,我需要保存工作表中所有隐藏的列的范围,不幸的是,我没有设法找出解决方法。 为了提供更多的上下文,我的意图是将工作表的隐藏列的范围保存在一个临时变量中,然后取消隐藏列,保存工作簿并重新隐藏已保存的列,以便始终保存工作簿并显示所有列。 我被困在“将工作表的隐藏列的范围保存在临时变量中” 步骤。 谢谢您的帮助。

解决方法

这实际上是一个非常简单的过程。将来,您确实需要与我们分享您为解决问题所做的工作。

我认为您是vba的新手,请查看下面代码中的注释。

    Sub runme()
Dim HiddenColumns(),size As Integer
    'Using a seperate counter,loop through your range of data.
    'If you find a hidden column redim our hidden columns array and add that row's number to the array
    'then increase our seperate counter
    size = 0
    For i = 1 To 12 'Change this to your range
        If Columns(i).Hidden = True Then
            ReDim Preserve HiddenColumns(size) 'Redim and preserve the array to our "size" variable (which will always be one more than the current array size
            HiddenColumns(size) = i
            size = size + 1
        End If
    Next i

    'Now we want to loop through our array and flip all the columns that were hidden to shown
    'You can add this to the original array building loop to be more efficent I'm just breaking it up here
    'for demonstration purposes
    For i = 0 To size - 1
        Worksheets("Sheet1").Columns(HiddenColumns(i)).Hidden = False
    Next i

    'Call your workbook saving here
    ThisWorkbook.Save

    'Now loop through our array of columns once more to rehide them
    For i = 0 To size - 1
        Worksheets("sheet1").Columns(HiddenColumns(i)).Hidden = True
    Next i
End Sub
,

也许有一种更有效的方法来实现所需的目标,但是一种方法是遍历范围的列,如果该列是隐藏的,则可以使用Union将其添加到范围变量中。
例如,假设您要将所有隐藏列从变量mInitialRange存储到变量mHiddenColumns中。这会给你:

Dim mInitialRange As Range,mHiddenColumns As Range
For Each mcolumn In mInitialRange.Columns
    If mcolumn.Hidden Then
        If mHiddenColumns Is Nothing Then
            Set mHiddenColumns = mcolumn
        Else
            Set mHiddenColumns = Union(mHiddenColumns,mcolumn)
        End If
    End If
Next mcolumn

编辑:遵循@BigBen建议