- 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/
我真的很困惑和好奇,为什么相同的编码,只是数据量不同,输出会完全不同? With Sheets("control deck").Range("A2:A5000").SpecialCells(xlCel
我构建了一个脚本来创建发送给不同人的电子邮件,其中包含单独的附件。我有从这个母脚本调用的不同子例程。 在调用子程序 Distribution 之前它一直有效。它停在 For Each cell In
基于 on another question在这个网站上,我开始想知道删除具有特定条件的所有行的最快方法。 上面提到的问题有各种解决方案: (1)循环遍历工作表上的所有行(向后),将所有满足条件的行一
这又是一个奇怪的事情。 我有这段代码,它使用过滤器从一张工作表中获取数据,并使用 Range.SpecialCells() 方法来查找要复制和粘贴的适当行。但是,如果我使用 Rows().Specia
我知道我可以通过迭代第一个范围来完成此任务,但我很好奇是否可以使用 SpecialCells 属性来完成此任务。 假设我有一列名称,中间有空单元格: A B C Jon Jim Sal
背景: 我已经申请过很多次AutoFilter从来没有真正问过自己为什么有时会这样。使用过滤数据的结果有时可能会令人困惑,特别是当 SpecialCells 发挥作用时。 让我详细说明以下场景: 测试
我目前正在尝试将过滤后的列复制到数组中以填充 Powerpoint 演示文稿中的 ComboBox。 我用来执行此操作的代码行是: ar = tbl.ListColumns(ColNumber).Ra
Excel SpecialCells(xlCellTypeBlank) 包括合并区域中的所有单元格,无论它们是否为空白。我认为这是一个错误,我迫切需要一个解决方法。复制步骤: (1) 创建一个工作表,
当使用Range.SpecialCells时如果范围不包含与条件匹配的单元格,则会抛出错误,指出未找到单元格。 此问题最常见的解决方案是让它发生并使用错误处理程序来处理它。 这是解决该问题的最有名的方
我在 Excel 2010 中有一个工作表,它被设置为伪表单(我没有创建它,我只是想修复它),因此格式设置表明用户只能在某些单元格中输入。根据某些功能,这些区域需要重置,即清除,但需要保留公式和标准/
使用 Selection.SpecialCells(xlCellTypeVisible).Count 时要计算单列过滤数据,它适用于多行结果。但是当只显示 1 行时,它会给我一个溢出错误或者我得到 c
当我选择一个包含三个单元格的范围时,例如 B3:B5,该方法按预期运行,并显示三个带有“3”、“4”和“5”的消息。 Sub visTest() Dim c As Range For
恐怕我误解了 VBA for excel 的文档,我有这行似乎是一个错误: Range a = Selection.SpecialCells(xlCellTypeConstants, 23) 但这一个
我正在尝试删除 B 列中包含空白的任何内容。 A1:A10 = {3,1,10,1,1,10,2,2,2,10}。当我运行我的代码时,我在删除行行出现错误。这是“运行时 1004 错误,未找到单元格”
Range.SpecialCells method可用于返回满足特定条件的 Range 对象。标准的类型是使用 xlCellType 常量指定的。 其中一个常量 (xlCellTypeBlanks)
我编写了一个宏,使用 Excel 范围对象的 SpecialCells 方法从某个范围中查找空白单元格。当我尝试执行以下代码时,出现“未找到单元格”的异常。 Sub test() Debug.Prin
我有一个 Excel VBA 宏,每周运行一次。我有一段代码可以过滤出不同的数据,然后将剩余的单元格复制到不同的工作表中 以下是受影响的代码部分: dim data as worksheet dim
我正在尝试自动化一份包含 5 个不同信息源的报告。我尝试使用 ListObjects 将不同表的 UNION 合并为一个表,除了复制第一个 ListObject 的第一列时,一切都工作正常。复制第一列
基于question由 @Chips Ahoy 提出,我决定创建一个 UDF 来查找某个范围内可见单元格的 PercentRank。 虽然 @Chips 似乎对我的语法修正感到满意,但实际上我无法让我
我有一段 Excel VBA 代码,如果工作表未 protected 则可以正常工作,但在 protected 时则不能。我已经阅读了之前的类似查询,但认为它们不适用于这种情况 - 建议的修复不适用或
我是一名优秀的程序员,十分优秀!