- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:
我已经申请过很多次AutoFilter
从来没有真正问过自己为什么有时会这样。使用过滤数据的结果有时可能会令人困惑,特别是当 SpecialCells
发挥作用时。
让我详细说明以下场景:
<小时/>测试数据:
| Header1 | Header2 |
|---------|---------|
| 50 | |
| 10 | |
| 30 | |
| 40 | |
| 20 | |
<小时/>
代码 1 - 普通自动过滤
:
With Sheets("Sheet1").Range("A1:B6")
.AutoFilter 1, ">50"
.Columns(2).Value = "Check"
.AutoFilter
End With
这将起作用(即使不使用 SpecialCells(12)
),但会填充 B1
。
代码 2 - 使用 .Offset
:
为了防止上述行为,我们可以像这样实现 Offset
:
With Sheets("Sheet1").Range("A1:B6")
.AutoFilter 1, ">50"
.Columns(2).Offset(1).Value = "Check"
.AutoFilter
End With
但是,这现在将填充我们的数据下方的行,单元格 B7
。
代码 3 - 使用 .Resize
:
为了防止 .Offset
填充 B7
,我们现在必须包含 .Resize
:
With Sheets("Sheet1").Range("A1:B6")
.AutoFilter 1, ">50"
.Columns(2).Offset(1).Resize(5, 1).Value = "Check"
.AutoFilter
End With
尽管现在我们都阻止了 B1
和 B7
的填充,但我们还是填充了 B2:B6
,AutoFilter
> 机制似乎“损坏”。我尝试用下面的屏幕截图来展示它。中间的是按 ">30"
过滤时的结果,右边的是按 ">50"
过滤时的结果。在我看来,这与引用范围现在由零个可见单元格组成这一事实有关。
代码 4 - 使用 .SpecialCells
:
我在这里做的正常事情是首先计数
可见单元格(包括范围内的标题以防止错误1004
)。
With Sheets("Sheet1").Range("A1:B6")
.AutoFilter 1, ">50"
If .SpecialCells(12).Count > 2 Then .Columns(2).Offset(1).Resize(5, 1).Value = "Check"
.AutoFilter
End With
<小时/>
问题:
如您所见,我从 .Columns(2).Value = "Check"
一直到 If .SpecialCells(12).Count > 2 Then .Columns( 2).Offset(1).Resize(5, 1).Value = "Check"
,只是为了防止B1
被覆盖。
显然,AutoFilter
机制在第一个场景中确实可以很好地检测可见行本身,但为了防止 header 被覆盖,我必须实现:
我是不是把事情搞得太复杂了,还有更短的路线吗?另外,为什么一旦没有可见的单元格就会填充整个范围的不可见单元格。当确实有一些数据被过滤时,它会很好地工作。这是什么机制(参见代码 3)?
我想出的不太优雅(IMO)的选项是重写 B1
:
With Sheets("Sheet1").Range("A1:B6")
.AutoFilter 1, ">50"
Var = .Cells(1, 2): .Columns(2).Value = "Check": .Cells(1, 2) = Var
.AutoFilter
End With
最佳答案
每当 Excel 在工作表上创建筛选列表时,它都会在名称管理器的后台创建一个隐藏的命名范围。如果您调用名称管理器,此范围通常不可见。使用以下代码使隐藏的命名范围在名称管理器中可见(在使用它之前,在范围上设置过滤器):
Dim nvar As Name
For Each n In ActiveWorkbook.Names
n.Visible = True
Next
在英文版 Excel 中,隐藏的筛选范围称为 _FilterDatabase
。我的解决方案使用此隐藏范围与 SpeciallCells(12) 结合来解决问题。
更新我的最终答案不使用隐藏的命名范围,但我保留该信息,因为它是发现过程的一部分......
Sub test1()
Dim var As Range
Dim i As Long, ans As Long
With Sheets("Sheet1").Range("A1:C1")
.Range("B2:B6").Clear
.AutoFilter
.AutoFilter 1, ">50"
Set var = Sheet1.AutoFilter.Range
Set var = Intersect(var.SpecialCells(12), var.Offset(1, 0))
If Not (var Is Nothing) Then
For i = 1 To var.Areas.Count
var.Areas(i).Offset(0, 1).Resize(var.Areas(i).Rows.Count, 1).Value = "Check"
Next i
End If
.AutoFilter
End With
End Sub
我用 >30 和 >50 对其进行了测试。它的性能符合预期。
关于excel - 自动筛选 - SpecialCells 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58889516/
我正在研究这个领域以获得实时对象检测。 视频示例: http://www.youtube.com/watch?v=Bm5qUG-06V8 http://www.youtube.com/watch?v=
问题 我正在为 C 语言的项目寻找一种数据结构来存储列表列表。我需要能够访问仅给定 n 的第 n 个列表(这些术语将被乱序访问)。各个列表将包含 1 到 M 之间的整数(为了具体起见,假设 M = 2
我有一个List (Maybe a),我想过滤出Nothing的实例。我大概已经做到了,但是对所需的代码量却不满意: removeNothingFromList : List (Maybe a) ->
我对 Blazor 有基本的输入 当我输入我认为无效的字符(例如“/”或“:/\\""|?* ]"; Search = Regex.Replace(args.Value.ToSt
我有一个主应用程序,允许用户编辑所有数据(大约 20 个字段)。更新后,我将其添加到服务总线主题中,系统的其他区域也订阅了该主题。 其中一个订阅仅关心单个字段(电话号码)是否更新。我想知道处理这个问题
我是ElasticSearch的新手,需要帮助解决以下问题: 我有一组包含多个产品的文档。我想通过“Apple”过滤产品属性product_brand并获取与过滤器匹配的产品数量。但是,结果应按文档I
我想过滤查询集中特定范围内的项目。这就是我的模型的样子 class modelEmployee(models.Model): user = models.ForeignKey(User, on
尽管数组 a 的大小不断增加,但我无法找到 8 位素数。它适用于较小的数字: #include #include int main() { int n,a[100000],i,m,k;
我不希望能够使用代码隐藏来搜索我的 gridview 结果。 我有一个按钮和一个 GridView :
我想使用 sift/surf 进行模板匹配。图像可以有 1...n 个目标。使用 surf/sift 只能提取一个目标。一种想法是将图像分割成多个片段,然后寻找筛选/冲浪匹配。它有效,但显然由于速度和
这是使用 Xodus API 限制实体查询的方法: final EntityIterable allUsers = txn.getAll(storeName).skip(skip).take(limi
我有 2 个 excel 文件:IDList.csv 和 Database.csv。 IDList 包含我要从数据库中过滤掉的 300 个 ID 号的列表,其中包含 2000 个条目(在数据库中留下
过滤 Treeview 节点的最佳/有效方法是什么? 例如:我输入“abc”,只有包含“abc”的节点可见。然后我输入 “abcd”,我应该会看到唯一包含 “abcd” 文本的节点。依此类推,所以每次
我有两个关于报告的 tablix,以及一个用于向 tablix 提供数据的数据集。我在报告中有一个多选参数,我需要根据该参数中的值过滤结果。 有什么区别,如果有,什么是更好的解决方案: 直接在数据集或
我对 flex 搜索/ NEST还是很陌生,需要一些帮助才能查询/过滤我的数据。 我有一个产品 list 。而且这些产品可以具有任意数量的选项,并具有与之相关的值。而且我需要能够按选项名称及其值来过滤
我正在使用过滤条件从原始表创建一个表,其中我的过滤值来自 SELECTEDVALUE 表格没有根据 SELECTEDVALUE 进行过滤,如果我用一个真实的值替换它就可以了。 代码(不起作用) Tra
我正在设置一个 MSBuild 项目来运行一些 NUnit 测试,使用 MSBuild Community Tasks Project 。 通过这些设置,我将能够运行 NUnit 测试:
我正在使用过滤条件从原始表创建一个表,其中我的过滤值来自 SELECTEDVALUE 表格没有根据 SELECTEDVALUE 进行过滤,如果我用一个真实的值替换它就可以了。 代码(不起作用) Tra
例如,我们有一个列表,我们想用特定的谓词将其分成两部分。 首先,我们可以使用filter和filterNot。 val trueList = list.filter(predicate) val fa
我尝试为 [Start] 使用某种范围: var calendar = outlookApplication.GetNamespace("MAPI").GetDefaultFolder(OlDefau
我是一名优秀的程序员,十分优秀!