如何在excel中隐藏筛选列表中没有值的列?

如何在excel中隐藏筛选列表中没有值的列?,excel,vba,Excel,Vba,我有一个关于各种化学品及其规格的大型电子表格;然而,并不是每种化学物质都要求每列中都有一个值,所以有很多空白单元格。我想知道当我从下拉列表过滤器中选择某个列时,如果该列中没有值,是否可以做些什么来隐藏该列 例如,我单击下拉列表并选择“氢氧化钾”,我希望它隐藏列“湿度”,因为其中没有值 现在的样子: 我之前尝试过使用一些VBA代码,但似乎不知道如何将其合并到下拉列表过滤器中 不幸的是,对于正在应用/更改以触发宏的筛选器,没有事件。但是,您可以操纵事件,工作表_计算,以获得所需的结果,因为修改过滤

我有一个关于各种化学品及其规格的大型电子表格;然而,并不是每种化学物质都要求每列中都有一个值,所以有很多空白单元格。我想知道当我从下拉列表过滤器中选择某个列时,如果该列中没有值,是否可以做些什么来隐藏该列

例如,我单击下拉列表并选择“氢氧化钾”,我希望它隐藏列“湿度”,因为其中没有值

现在的样子:


我之前尝试过使用一些VBA代码,但似乎不知道如何将其合并到下拉列表过滤器中

不幸的是,对于正在应用/更改以触发宏的筛选器,没有
事件。但是,您可以操纵
事件
工作表_计算
,以获得所需的结果,因为修改过滤器会计算工作表。即,每次工作表计算时,都会触发宏


所以现在我们需要将一个过滤器链接到一个计算。任何方程都可以,所以我只是在我的示例中设置
K1
=
L1
。理想情况下,这将是一个看不见的地方(理想情况下是在上次使用的列标题旁边,以避免隐藏未使用的列)


宏仅通过计算可见行的非空单元格实例来使用
聚合
函数。应用筛选器时,只有1个可见单元格的任何列都将被隐藏。我们使用
1
作为基线,因为由于标题的原因,所有列将至少有一个可见单元格

将以下代码以VBE格式粘贴到工作表
规格
。这在模块或工作簿模板中不起作用

Option Explicit

Private Sub Worksheet_Calculate()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Specifications")
Dim LCol As Long: LCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

On Error GoTo SafeExit

Dim HeaderCell As Range

Application.ScreenUpdating = False
    Columns.EntireColumn.Hidden = False
    Rows.EntireRow.Hidden = False

    For Each HeaderCell In ws.Range(ws.Cells(1, 1), ws.Cells(1, LCol))
        If Application.WorksheetFunction.Aggregate(3, 7, HeaderCell.EntireColumn) = 1 Then
            HeaderCell.EntireColumn.Hidden = True
        End If
    Next HeaderCell

SafeExit:
Application.ScreenUpdating = True

End Sub

太长,读不下去了 确保工作表中至少有一个方程式。应用/修改过滤器时,将强制计算。强制计算时,将触发宏。触发宏时,将隐藏只有一个可见单元格(即标题)的所有列


如果运行缓慢,则可以将范围添加到列的
联合中,并在循环完成后隐藏
联合(所有符合条件的列)

在@urderboy这一行中,我的观点如下

  • 将以下公式放在第1行的任意单元格中:

    =SUBTOTAL(3,A:A)
    
  • 然后将以下代码放在“规格”表代码窗格中:

    Private Sub Worksheet_Calculate()
        Dim col As Range
        With Me.UsedRange
            For Each col In .Offset(, 1).Resize(, .Columns.Count - 1).Columns
                col.EntireColumn.Hidden = Application.WorksheetFunction.Subtotal(103, col) = 1
            Next
        End With
    End Sub
    
  • 正如您可能注意到的,由于同一种化学物质可能在A列中出现多个(例如:“氨基磺酸”),因此只有当其所有可见单元格都为空时,列才会隐藏起来。

    请尝试以下代码:

    For i = 1 To 500
    If Application.WorksheetFunction.Count(Columns(i)) = 1 Then
    ActiveSheet.Columns(i).Hidden = True
    End If
    Next
    

    你有多少列?你的工作簿上有没有公式?这将需要VBAI有超过100列,并且在我的工作簿中没有任何公式-它只是所有用户输入的值。我对VBA解决方案持开放态度。现在最后一列是CZ,但如果我需要添加新的规范,这可能会改变。表格的名称是“规范”,我现在有三张表格,可能有4张,但只有第一张名为“规范”的表格是相关的。我有表格公式和初始解,首先要聚合。我想我应该把它还给你。谢谢@qharra提醒一下,你应该至少简要解释一下你的答案,以及它将如何帮助提问者实现他们的目标:)