vba 根据单元格的值在Excel中隐藏多列

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27477872/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-12 05:31:37  来源:igfitidea点击:

Hiding multiple columns in Excel based on the value of a cell

excelvbaexcel-vba

提问by luna2000

I am trying to get columns to hide in a worksheet based on the value in a certain cell. This value could range from 1 to 30, and different columns are hidden for each possible option. I have the following code, but it doesn't seem to work all the time, and then sometimes it only hides some of the columns in the range, but not all (like if 5 was in cell AA1, then sometimes AN:AR will hide and AS:FC will not be hidden). If anyone has any ideas, I would appreciate the help. Thanks!

我试图根据某个单元格中的值将列隐藏在工作表中。该值的范围可以从 1 到 30,并且每个可能的选项都隐藏了不同的列。我有以下代码,但它似乎并没有一直工作,然后有时它只隐藏范围内的一些列,但不是全部(就像 5 在单元格 AA1 中,那么有时 AN:AR 会隐藏并且 AS:FC 不会被隐藏)。如果有人有任何想法,我将不胜感激。谢谢!

I have a sample workbook at: https://drive.google.com/file/d/0B8qPItN2DU0BZ3B0LW1XUS1BMFk/view?usp=sharing

我有一个示例工作簿:https: //drive.google.com/file/d/0B8qPItN2DU0BZ3B0LW1XUS1BMFk/view?usp=sharing

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("AA1").Value = 1 Then
    Columns("O:FC").EntireColumn.Hidden = True
Else
    Columns("O:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 2 Then
    Columns("T:FC").EntireColumn.Hidden = True
Else
    Columns("T:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 3 Then
    Columns("Y:FC").EntireColumn.Hidden = True
Else
    Columns("Y:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 4 Then
    Columns("AD:FC").EntireColumn.Hidden = True
Else
    Columns("AD:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 5 Then
    Columns("AI:FC").EntireColumn.Hidden = True
Else
    Columns("AI:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 6 Then
    Columns("AN:FC").EntireColumn.Hidden = True
Else
    Columns("AN:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 7 Then
    Columns("AS:FC").EntireColumn.Hidden = True
Else
    Columns("AS:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 8 Then
    Columns("AX:FC").EntireColumn.Hidden = True
Else
    Columns("AX:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 9 Then
    Columns("BC:FC").EntireColumn.Hidden = True
Else
    Columns("BC:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 10 Then
    Columns("BH:FC").EntireColumn.Hidden = True
Else
    Columns("BH:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 11 Then
    Columns("BM:FC").EntireColumn.Hidden = True
Else
    Columns("BM:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 12 Then
    Columns("BR:FC").EntireColumn.Hidden = True
Else
    Columns("BR:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 13 Then
    Columns("BW:FC").EntireColumn.Hidden = True
Else
    Columns("BW:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 14 Then
    Columns("CB:FC").EntireColumn.Hidden = True
Else
    Columns("CB:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 15 Then
    Columns("CG:FC").EntireColumn.Hidden = True
Else
    Columns("CG:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 16 Then
    Columns("CL:FC").EntireColumn.Hidden = True
Else
    Columns("CL:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 17 Then
    Columns("CQ:FC").EntireColumn.Hidden = True
Else
    Columns("CQ:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 18 Then
    Columns("CV:FC").EntireColumn.Hidden = True
Else
    Columns("CV:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 19 Then
    Columns("DA:FC").EntireColumn.Hidden = True
Else
    Columns("DA:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 20 Then
    Columns("DF:FC").EntireColumn.Hidden = True
Else
    Columns("DF:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 21 Then
    Columns("DK:FC").EntireColumn.Hidden = True
Else
    Columns("DK:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 22 Then
    Columns("DP:FC").EntireColumn.Hidden = True
Else
    Columns("DP:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 23 Then
    Columns("DU:FC").EntireColumn.Hidden = True
Else
    Columns("DU:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 24 Then
    Columns("DZ:FC").EntireColumn.Hidden = True
Else
    Columns("DZ:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 25 Then
    Columns("EE:FC").EntireColumn.Hidden = True
Else
    Columns("EE:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 26 Then
    Columns("EJ:FC").EntireColumn.Hidden = True
Else
    Columns("EJ:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 27 Then
    Columns("EO:FC").EntireColumn.Hidden = True
Else
    Columns("EO:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 28 Then
    Columns("ET:FC").EntireColumn.Hidden = True
Else
    Columns("ET:FC").EntireColumn.Hidden = False
End If

If Range("AA1").Value = 29 Then
    Columns("EY:FC").EntireColumn.Hidden = True
Else
    Columns("EY:FC").EntireColumn.Hidden = False
End If

End Sub

采纳答案by Tim Williams

Seems like there's a pattern of 5 columns per integer increase in the value in AA1, so:

似乎 AA1 中的值每增加一个整数就有 5 列的模式,所以:

Dim v, sht

Set sht = ActiveSheet
v = sht.Range("AA1").Value

sht.Columns("O:FC").EntireColumn.Hidden = False

If v >= 1 And v <= 30 Then
    sht.Range(sht.Cells(1, 10+(5*v)), _
              sht.Range("FC1")).EntireColumn.Hidden = True
End If

Although it's not particularly clear from the question exactly what the logic for hiding/showing is.

尽管从问题中并不清楚隐藏/显示的逻辑到底是什么。

回答by Greg the Incredulous

You are hiding a range of columns, and as your code is executed you are hiding, then re-displaying a lot of the columns.

您正在隐藏一系列列,当您执行代码时,您正在隐藏,然后重新显示许多列。

You would be better to firstly display all columns in the largest range (O:FC) in your example, and then only hide the ones that match your value. So you could change the if else constructs to be a select case like this:

您最好首先在示例中显示最大范围 (O:FC) 中的所有列,然后仅隐藏与您的值匹配的列。因此,您可以将 if else 构造更改为这样的选择案例:

Columns("O:FC").EntireColumn.Hidden = False

select case Range("AA1").Value
    case 1:
      Columns("O:FC").EntireColumn.Hidden = True
    case 2:
      Columns("T:FC").EntireColumn.Hidden = True
    ' Add extra cases for each possible value
end select