excel - 如何隐藏过滤器列表中没有值的excel中的列?
问题描述
我有一个包含各种化学品及其规格的大型电子表格;但是,并非每种化学品都需要每列中的值,因此有很多空白单元格。我想知道当我从下拉列表过滤器中选择列时,如果列中没有值,我是否可以做些什么来隐藏它?
例如,我单击下拉列表并选择“氢氧化钾”,我希望它隐藏“水分”列,因为其中没有值。
现在的样子:
我之前尝试过使用一些 VBA 代码,但我似乎不知道如何将其合并到下拉列表过滤器中。
解决方案
不幸的是,没有Event
应用/更改过滤器来触发宏。但是,您可以操纵Event
, Worksheet_Calculate
, 来获得所需的结果,因为修改过滤器会计算工作表。IE每次工作表计算,都会触发宏!
所以现在我们需要将过滤器链接到计算。任何方程都可以做到这一点,所以我只是在我的例子中设置K1
= 。L1
理想情况下,这将是看不见的地方(理想情况下,在您上次使用的列标题旁边,以避免隐藏未使用的列)
该宏通过仅计算可见行Aggregate
的非空单元格实例来利用该函数。应用过滤器时,任何只有 1 个可见单元格的列都将被隐藏。我们将其用作基线,因为由于标题,所有列都至少有 1 个可见单元格。 1
将以下代码粘贴到工作表上的 VBE 中Specifications
。这在模块或工作簿模板中不起作用。
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
TLDR
确保 Sheet 至少有 1 个方程。当您应用/修改过滤器时,您会强制进行计算。当您强制计算时,您会触发宏。当您触发宏时,您会隐藏所有只有 1 个可见单元格的列(这将是标题)。
如果这运行缓慢,您可以将您的范围添加到Union
列中,并在Union
循环完成后隐藏(所有符合您条件的列)。
推荐阅读
- json - 与其演示页面相比,Google Vision 文本检测 API 给出了不同的结果
- python - 在 Python 中获取文件的完整路径会省略一个目录
- .net-core - HttpClient 注入单例
- vim - 在不应用 foldlevel 的情况下重新计算 vim 中的折叠
- javascript - 如何通过历史推送重定向到全新的路线?
- c# - 检测游戏对象上的触摸
- python-3.x - For 循环 3 个矩阵
- r - R Studio中的“索引匹配”(多列,跨行)
- javascript - createError.js:16 Uncaught (in promise) 错误:请求失败,状态码为 400
- xamarin.forms - 如何在 ViewModel 中设置按钮的图标?