Excel VBA - 隐藏/取消隐藏“na”列

时间:2015-03-14 09:11:38

标签: excel-vba hide multiple-columns na vba

首先,我想让你知道我对VBA非常新。我可以设法根据我的需要复制和粘贴某些数据并调整范围,但这就是全部。现在我的问题:

我有一行包含31列(E27:AI27)。此范围内的所有单元格都会从此范围之外的其他单元格中获取输入(1-31的数字),让我们从几个下拉列表中说出来。根据我如何对这些下拉列表进行调整,该特定范围内的数字序列(E27:AI27)可能如下所示:

替代。 01:1 2 3 4 5 ................................ 29 30 31(总共31个细胞)

替代。 02:2 3 4 5 6 ........................... 29 30 31 na(总共31个细胞)

替代。 03:3 4 5 6 7 ........................... 30 31 na na(总共31个细胞)

替代。 04:4 5 6 7 8 ...................... 30 31 na na na(总共31个细胞)

等等等。

替代。 30:30 30 na ...................... na na na na na(总共31个细胞)

替代。 31:31 na na ..................... na na na na na(总共31个细胞)

现在我要做的是暂时自动隐藏那些包含字符串" na"在他们里面。当我再次重新下载我的下拉列表时,我希望能够取消隐藏那些从" na"一个数字。例如,我希望能够在备选方案1和备选方案2之间切换(见上文),这取决于我如何改变我的下拉列表。在这两种选择之间转换意味着AI27会从显示,隐藏,显示,隐藏等等(虽然E27AH27会全部显示,因为它们都会在当时有1-30的数字。

最后但并非最不重要的是,有两个下拉列表控制单元格E27:AI27的值。名为month(C18)的下拉列表和名为day(D18)的下拉列表。前者(C18)设定一个月的日子。如果C18 = 2月那么将有28天,最后两列(AH:AI)将是" na"。除此之外,后一个下拉列表(D18)设置开始日,即序列中的第一个数字(在单元格E27中)。如果D18 = 21,那么2月份的替代方案将是:

21 22 23 24 25 26 27 28 na na na na na na na na na na na ....(含23 na)

有人可以帮我设置一个简单的VBA代码,如果可能的话吗?非常感谢

2 个答案:

答案 0 :(得分:0)

试试这个:

Private Sub Worksheet_Change(ByVal Target As Range)
    'change the "E23" with the cell with your dropdown
    If Not Intersect(Target, Range("E23")) Is Nothing Then
        Call UnhideHideColumns
    End If
End Sub

Sub UnhideHideColumns()

Dim bytColumnCheck As Byte
Dim blnNeedToUnhide As Boolean
Dim intFirstNAColumn As Integer

'check all columns and find out if they are already hidden
For bytColumnCheck = 5 To 35
    'if any of the columns is hidden, unhide all the columns to the right and exit loop
    If Cells(1, bytColumnCheck).EntireColumn.Hidden = True Then
        Range(Cells(1, bytColumnCheck), Cells(1, 35)).EntireColumn.Hidden = False
        Exit For
    End If
Next bytColumnCheck

'find first occurence of "na" in values, if any exists
If Not Cells.Find("na", LookIn:=xlValues, after:=Range("E27")) Is Nothing Then
    intFirstNAColumn = Cells.Find("na", LookIn:=xlValues).Column

    'now hide the columns to the right of the first "NA", including
    Range(Cells(1, intFirstNAColumn), Cells(1, 35)).EntireColumn.Hidden = True
End If

End Sub

请注意,每次带下拉列表的单元格发生变化时,都会调用Call UnhideHideColumns,即使从Set1到Set1,也可以从5到5,所以它可以经常触发宏。

答案 1 :(得分:0)

这对我有用:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim i As Integer
    For i = 9 To 40: Cells(28, i).EntireColumn.Hidden = Cells(28, i) = "na": Next

End Sub