关于 range.autofilter 和 VBA的 filter

article/2025/11/9 4:04:14

 

1 range().autofilter容易出错的地方

1.1 range().autofilter的返回值

  • range().autofilter 
  • 返回值总是 true
  • 返回值并不是对象,而是执行一个筛选的操作
  • 所以
Sub test1_filter5()
'Dim rng1 As Range
'Set rng1 = Range("b1:b20").AutoFilter(field:=1, Criteria1:=5)
'Debug.Print rng1.AddressDebug.Print Range("b1:b20").AutoFilter(field:=1, Criteria1:=5)
Debug.Print Range("b1:b20").AutoFilter(field:=1, Criteria1:=55555)End Sub

 

1.2 因此,调用 range().autofilter() 写法一般都不带括号

  • 如上面的例子

  • range().autofilter() 也可以带参数+括号,但是返回值的意义不大

  • 所以一般,都不带括号,因为也不需要调用其返回值
Sub test001()
Range("a:a").AutoFilter field:=1, Criteria1:="10002"
End Sub

 

1.3 range().autofilter() 容易笔误出错的地方

  • 语法
  • 表达式.AutoFilter(Field, Criteria1,Operator, Criteria2, VisibleDropDown)

容易出错的例子

  • 容易出错的地方
  • Range("a:a").AutoFilter field:=1, Criteria1:="10002"
  • 注意 Criteria1:="10002" 不是 Criterial:="10002" 是1 不是l 而且,中间也不能有间隔 Criteria1
  • 你要理解 Criteria1 是要查找的内容,而且有2个参数,所以是 Criteria1 和 Criteria2,不是L

 

2 range().autofilter的 功能学习

2.1 基础语法

  • 表达式.AutoFilter(Field, Criteria1,Operator, Criteria2, VisibleDropDown)
  • Field,类vlookup 一样,默认左边第1列为1,右边的列为2,3,4。。。。
  • criteria1
  • criteria2
  • operator   控制2个标准之间的逻辑关系
  • visibleDropDown   控制下拉框

 

2.2 range().autofilter 什么参数都不带,那就只是打开 此区域相关区域的筛选

  • 就是把 range() 区域相连接的区域,全部实现筛选
  • 如果运行多次,开一次,关一次

2.2.1 运行两次,1次开1次关(不知道原理?)

  • 运行第1次,开启筛选
  • 运行第2次,关闭筛选
Sub test1_filter30()Range("a1").AutoFilterEnd Sub
  • 有问题的地方
  • 如果多加了一句: Debug.Print Range("a1").AutoFilter,结果筛选完全打不开了?
Sub test1_filter31()
Debug.Print Range("a1").AutoFilter
Range("a1").AutoFilter
End Sub

 

2.3 多个 range().autofilter,会多次执行,按最后一次的执行,而且可能有问题

暂时原因不明

  • 如果同时执行了多个 range().autofilter,感觉会执行多次
  • 一般是按最后一次的   range().autofilter (交互次序会发现筛选结果不同)
  • 但有时候啥也不执行,也不筛选了

 

  • 安全的做法
  • 一次只做1次筛选,把筛选区域写合适。
Sub test1_filter40()
Range("a1").AutoFilter
Range("b1").AutoFilter
End SubSub test1_filter41()
Range("a1:a20").AutoFilter field:=1, Criteria1:=115
Range("b1").AutoFilter
End Sub'前2个例子都是有问题的Sub test1_filter42()
Range("a1:b1").AutoFilter
End Sub

 

2.4 range() 选 标题头,列头就行了?

2.4.1 无参数时,下面两种写法是无差别的

Sub test1_filter50()
Range("a1:b1").AutoFilter
End SubSub test1_filter51()
Range("a1:b20").AutoFilter
End Sub

 

2.4.2 即使有参数,下面两种写法也差不多,range("a1:b10") 相当于 range("a1:b1") 也相当于 range("a:b")

Sub test1_filter50()
Range("a1:b1").AutoFilter field:=2, Criteria1:=">=10"
End SubSub test1_filter51()
Range("a1:b20").AutoFilter field:=1, Criteria1:="999"
End Sub

 

2.5 报错处理

  • 不能超过range()本身的范围
  • 下面的报错,因为field:=3,因为range() 本身才2列

 

3  range().autofilter的返回值 ----replace() 也一样?

  • range().autofilter 
  • 返回值总是 true
  • 返回值并不是对象,而是执行一个筛选的操作
  • 所以
Sub test1_filter5()
'Dim rng1 As Range
'Set rng1 = Range("b1:b20").AutoFilter(field:=1, Criteria1:=5)
'Debug.Print rng1.AddressDebug.Print Range("b1:b20").AutoFilter(field:=1, Criteria1:=5)
Debug.Print Range("b1:b20").AutoFilter(field:=1, Criteria1:=55555)End Sub

 

 

参考文章

https://www.jianshu.com/p/0ab092d1de52

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/Kh8LX1CW.shtml

相关文章

Opencv学习之角点检测

Opencv学习之角点检测 角点检测 在图像处理和计算机视觉领域,兴趣点(interest points),也被称作关键点(key points)、特征点(feture points)。它被大量用于解决物体识别、图像识别…

VBA-Range.AutoFilter 方法浅析

VBA-Range.AutoFilter 方法的一些“坑” 学到筛选的时候遇到一些小小的“坑”,记录下。 录制出来的宏是这样的, Sub 宏1()宏1 宏Rows("1:1").SelectSelection.AutoFilterActiveSheet.Range("$A$1:$F$1048").AutoFilter field:4, …

Hibernate查询Query By Criterial

提供的检索方式:(1)导航对象图检索方式 (2)OID检索方式(3)HQL检索方式(4)QBC检索方式[query by Criteria(标准)](5)本地SQL检索方式 1、简介 1.…

SLUB和SLAB的区别

转载:http://www.cnblogs.com/tolimit/ 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于嵌入式系统。慢…

[linux kernel]slub内存管理分析(7) MEMCG的影响与绕过

文章目录 背景前情回顾描述方法约定 MEMCG总览省流总结简介 slub 相关 memcg机制kernel 5.9 版本之前结构体初始化具体实现 kernel 5.9-5.14kernel 5.14 之后 突破slab限制方法cross cache attackpage 堆风水 总结 背景 前情回顾 关于slab几个结构体的关系和初始化和内存分配…

linux slub分配器,Vi Linux内存 之 Slub分配器(六)

再来看内置式对象,如下图所示。指针位于对象的头部,与对象共用存储空间。这是因为对象被分配出去之前,其存储空间是空闲的可用状态,可用于存放空闲对象指针。对象被分配出去后,也不再需要这个指针了,可以被…

一文给你解决linux内存源码分析- SLUB分配器概述(超详细)

SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于嵌入式系统。慢慢的slab分配器或许会被slub取代&…

Linux内存管理(2):SLAB/SLUB系统(基于线性映射)

一、概述 伙伴系统最大限度地解决了内存管理地外碎片问题,但是对于内碎片问题却无能为力。但内核实际使用内存的时候,却大多是小于一个页的单位。为了解决内核自身使用小块内存的碎片问题,Linux引入了基于对象的内存管理(或者叫内存区管理,Memory Area Management),就是SL…

slub分配器学习系列之linux5.10

前言 前一篇文章对 linux5.10 的 slab 分配器底层实现进行了探究与学习。进一步地,本篇文章将对 linux5.10 的 slub 分配器进行探究,对比看看两者的实现有何不同,做了哪些"必要的"改进。 slub 分配器 关于 slub 分配器的基本原理…

linux内核虚拟内存之slub分配器

上一章主要讲述以页为最小单位进行内存分配的伙伴管理算法,较大程度上避免了内存碎片问题。而实际上对内存的申请却不是每次都申请一个页面的(比如文件节点,任务描述符等结构体内存),通常是远小于一个内存页面的大小&a…

4.19内核SLUB内存分配器

初始化 内核的大部分管理数据结构都是通过kmalloc分配内存的,那么slab本身结构的内存管理就出现了一个鸡与蛋的问题,slab数据结构所需内存远小于一整页的内存块,这些最适合kmalloc分配,而kmalloc只有在slab初始化完之后才能使用。…

SLUB内存管理之slub初始化

在讲slub内存管理涉及的四个函数之前,先从slub内存分配算法的初始化开始。系统启动时,会进行slub内存分配算法的初始化,函数流程是:start_kernel() -> mm_init()->kmem_cache_init()。在start_kernel()函数中的setup_arch()…

SLUB DEBUG原理

1. 前言 在工作中,经常会遇到由于越界导致的各种奇怪的问题。为什么越界访问导致的问题很奇怪呢?在工作差不多半年的时间里我就遇到了很多越界访问导致的问题(不得不吐槽下IC厂商提供的driver,总是隐藏着bug)。比如说…

slub allocator工作原理

前言 在Linux中,伙伴系统(buddy system)是以页(1page等于4K)为单位管理和分配内存。对于小内存的分配,如果还是使用伙伴系统进行内存分配,就会导致严重浪费内存。此时,slab分配器就应…

SLUB缓存管理

注:本文分析基于linux-4.18.0-193.14.2.el8_2内核版本,即CentOS 8.2 1、关于SLUB 目前大多数系统都不使用slab作为缓存的管理模式,转而使用slub,比如CentOS 7和8默认都是使用slub管理器。slub是基于slab的进一步优化改进&#x…

slub debug(linux4.16.1)

在命令行选项中添加slub_debugUFPZ,以使能相关检测功能,其含义如下: (1)U:跟踪该slab内存的相关属性,如其创建时所属的cpu、进程、时间 (2)F:开启sanity检查功…

linux内核内存管理slub

一、概述 linux内存管理核心是伙伴系统,slab,slub,slob是基于伙伴系统之上提供api,用于内核内存分配释放管理,适用于小内存(小于1页)分配与释放,当然大于1页…

内存管理 slub算法

内核管理页面使用了2个算法:伙伴算法和slub算法,伙伴算法以页为单位管理内存,但在大多数情况下,程序需要的并不是一整页,而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理,这就是s…

linux slub分配器,slub分配器

原标题:slub分配器 概述: Linux的物理内存管理采用了以页为单位的buddy system(伙伴系统),但是很多情况下,内核仅仅需要一个较小的对象空间,而且这些小块的空间对于不同对象又是变化的、不可预测的,所以需要…

Linux内存管理(八): slub分配器和kmalloc

kernel: 5.10 Arch: aarch64 上文 介绍过, 伙伴系统在分配内存时是以物理页为单位的,但在很多场景下,内存需要分配的大小是以字节为单位的,达不到一个物理页的大小。如果继续使用伙伴系统进行内存分配, 那么就会出现严…