VBA里的文本函数 find() search() substitute() replace() match() large() 在EXCEL工作表使用和VBA中使用差别的对比

 

1 find()

1.1 worksheetfunction.find()

  • 工作表函数
  • FIND(find_text, within_text, [start_num])
  • FINDB(find_text, within_text, [start_num])    中文字符等会识别为2位
  • 返回的是 要查找的内容在字符串内的位数。

 

  • 局限性
  • 区分大小写,不允许通配符 
  • 如果在VBA中使用,记得字符串,是需要"" 表达的
  • 也是模糊查询
Sub test501()Debug.Print WorksheetFunction.Find(a, Range("B3").Value)
Debug.Print WorksheetFunction.Find(Range("d5").Value, Range("B3").Value)
Debug.Print WorksheetFunction.Find("a", Range("B3").Value)
Debug.Print WorksheetFunction.Find(3, Range("B3").Value)End Sub

 

 

1.2  worksheetfunction.find()  使用注意点

  • 如果在EXCEL内使用
  • 如果查找的内容找不到,find() 不会报错,而是返回第1个字符串的位置,一般会返回1,其实已经是算报错了!
  • 另外,引用单元格的值,就相当于使用了变量,不需要特别加 字符串也不需要特别加 ""
  • 但如果是在公式里写字符串,也需要加""  

 

  • 如果在VBA中使用
  • 首先尽量不要再VBA中用工作表函数,因为一旦健壮性差,一旦查不到会报错,如下图
  • 字符串要加"",除非是引用单元格range的值。

 

1.3 application.find()     返回的是range

  • 在VBA中用工作表函数,尽量用 application.find() 而尽量不用 worksheetfunction.find(),这两者语法和功能类似。
  • application.find()  虽然有些情况只会返回 错误,但有些情况再VBA里也会 弹出报错
  • application.worksheetfunction.find() 更适合工作表
  • application.find() 更适合VBA
  • 虽然VBA可能自带一些函数,比如VBA.find() 就没有,但即使有,和application的功能一般都是不同的。
Sub test503()Debug.Print Application.Find(a, Range("B3").Value)
Debug.Print Application.Find(Range("d5").Value, Range("B3").Value)
Debug.Print Application.Find("a", Range("B3").Value)
Debug.Print Application.Find(3, Range("B3").Value)Debug.Print Application.Find("aaaa", Range("B3").Value)  '找不到会返回错误值,但不会跳出错误提示End Sub

 

1.4  application.find() 的问题----主要适合在一个字符串内查找!而且类型不匹配的话也会 跳出报错。

  • 首先,先弄清楚
  • application.find 和 application.worksheetfunction.find 都源于 工作表
  • 而在工作表中,多少情况下,都是查找一个单元格的内容----一般都是字符串
  • 而 application.find() 就是查找一个单元格里的元素 ,只能查找一个字符串的内容

 

  • 实测只适合字符串,不适合多个单元格的range,数组等
  • 如果,查找的范围是数组,或多个单元格的range,会报错,类型不匹配

 

  • application.find() 虽然可以有些情况下,可以返回 error 2015 
  • 但是一旦查找的内容,找不到,也可能会弹出报错,VBE编辑器好像不稳定,多次运行的结果不同

 

Sub test505()Debug.Print Application.Find(2, "a12345")
Debug.Print Application.Find(3, Range("b10"))
Debug.Print Application.Find("aaaa", Range("b10").Value)  '实测VBE不稳定,有时候也会弹出报错'查不到的内容也会报类型不匹配
'Debug.Print "Application.Find(9, ""a12345"") " & Application.Find(9, "a12345")
'Debug.Print "Application.Find(""aaa"", ""a12345"") " & Application.Find("aaa", "a12345")'下面会报错类型不匹配
'Debug.Print "Application.Find(1, Array(1, 2, 3))  " & Application.Find(1, Array(1, 2, 3))
'Debug.Print "Application.Find(2, Range(""B1: B2 "")) " & Application.Find(2, Range("B1:B2"))
End Sub

 

1.5 VBA.find()  和 find()  ,这两个函数并没有,不存在

 

1.6 object.find()

  • 语法
  • Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
  • find()一般是为了查询结果,返回的是找到的对象 range

 

  • 局限性
  • 是模糊查询
  • 只会返回查找到的第一个range()--单元格
Sub test502()
Dim a As Object   'find返回的应该是 range对象
Set a = ActiveWorkbook.ActiveSheet.UsedRange.Find(what:=2, LookIn:=xlValues)
Debug.Print a.Address'这句话语法上OK,但因为find() 本身的目的,不返回find()的值,这么写显得很奇怪
ActiveSheet.UsedRange.Find what:=2, LookIn:=xlValues
'ActiveSheet.UsedRange.Find(what:=2, LookIn:=xlValues) '这样会报错End Sub

详细了find()函数的说明,以后再学习

  • https://blog.csdn.net/threshold1980/article/details/84869665

 

1.7   Application.find() 和 obejct.find() 的区别,语法和返回值都不同。

  • 这两者的语法差别很大
  • application.find() 是工作表相关的,返回的是找到的字符串的位置
  • obejct.find() 是VBA相关的,返回的是range

 

 

2  search()  ----不区分大小写,可以加通配符,其他类似find()

2.1  worksheetfunction.search()

  • 语法
  • search(find_text, within_text, [start_num])
  • =SEARCH("n","printer")
  • =SEARCH("base","database")    会返回字符串首字母的位置
  • search()
  • searchB()  

 

  • 局限性
  • search() 是不区分大小写的
  • 也是模糊查询

 

2.2 application.search()

Sub test503()Debug.Print Application.Search(a, Range("B3").Value)
Debug.Print Application.Search(Range("d5").Value, Range("B3").Value)
Debug.Print Application.Search("a", Range("B3").Value)
Debug.Print Application.Search(3, Range("B3").Value)Debug.Print Application.Search("aaaa", Range("B3").Value)  '找不到会返回错误值,但不会跳出错误提示End Sub

 

2.3 object.search() 没有

 

2.4 search() 没有

 

2.5 VBA中取代search() 和 find() 的是  vba.instr()

 

2.6 VBA.instr() 语法,但是并没有object.instr()

  • InStr([start,]string1,string2[,compare])
  • Start - 一个可选参数。指定搜索的起始位置。搜索从第一个位置开始,从左到右。
  • String1 - 必需的参数。要搜索的字符串。
  • String2 - 必需的参数。要在String1中搜索的字符串。
  • Compare - 一个可选参数。指定要使用的字符串比较。它可以采取以下提到的值:
  • 0 = vbBinaryCompare - 执行二进制比较(默认)
  • 1 = vbTextCompare - 执行文本比较/
Sub test504()Debug.Print InStr(1, Range("B3").Value, Range("d5").Value)Dim a
a = InStr(1, Range("B3").Value, Range("d5").Value)
Debug.Print aEnd Sub

 

3 substitute

3.1 worksheetfunction.substitute() 基本语法

  • SUBSTITUTE(text,old_text,new_text,instance_num)
  • 可以实现
  • 可以实现替换第几个,这个比  worksheetfunction.find()好用
  • 局限性,不支持通配符

 

3.2  worksheetfunction.substitute()  和application.substitute()

  • worksheetfunction.substitute()  和application.substitute() 即使找不到合适的替换内容也不会报错
  • substitute 不一定需要返回值,所以可以采用 不加括号的单独句子写法
Sub test505()Application.WorksheetFunction.Substitute "abc123abc123abc", "abc", "AAA", 2
Debug.Print Application.WorksheetFunction.Substitute("abc123abc123abc", "abc", "AAA", 2)
Debug.Print Application.WorksheetFunction.Substitute("abc123abc123abc", "abcd", "AAA", 2)
Debug.PrintApplication.Substitute "abc123abc123abc", "abc", "AAA", 2
Debug.Print Application.Substitute("abc123abc123abc", "abc", "AAA", 2)
Debug.Print Application.Substitute("abc123abc123abc", "abcd", "AAA", 2)End Sub

 

3.3 VBA里好像没有 subsitute() 相关的函数

 

 

4 replace()  

4.1 worksheetfunction.replace()

  • 语法
  • REPLACE(old_text, start_num, num_chars, new_text)
  • 支持通配符
  • 和substitute() 完全不同,是按位数替换,而不是查找关键字式替换。

 

 

4.2 object.replace() 可以算是VBA中 replace()  和 substitute() 的替代功能

  • 语法
  • Selection.Replace What:="¥", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ReplaceFormat:=False
  • replace() 返回的是 bool,除了做if判断等,一般很少调用,做替换操作才行。
Sub test302()'ActiveSheet.UsedRange.Replace what:=6, replacemeent:=666
Range("a1:d10").Replace what:=6, replacement:=666
'这个是模糊查找,不是精确查找,所以替换可能不是想要的,比如66会变成666666'replace()也有返回值,是布尔值,除了做判断可能调用其返还值,一般执行操作就可以
a = Range("a1:d10").Replace(what:=6, replacement:=666)
Debug.Print aEnd Sub

 

4.3 支持通配符,但是其操作的对象,返回的缺不是对象,而返回bool

所以一般情况下, object.replace() 函数不用来返回值,只用来操作。

  • 操作成功,修改了单元格的值
  • 但是返回的只是bool,而没能返回结果
Sub test507()'ActiveSheet.UsedRange.Replace what:=6, replacemeent:=666
Range("b3").Replace what:=1 * 3, replacement:=666
'这个是模糊查找,不是精确查找,所以替换可能不是想要的,比如66会变成666666
'repalce()支持通配符
Debug.Printa = Range("b3").Replace(what:=1 * 3, replacement:=666)
Debug.Print a
'replace()也有返回值,是布尔值,除了做判断可能调用其返还值,一般执行操作就可以
'replace虽然是操作的对象,但其返回值却不是对象...,而是是否替换成功
'可能replace() 函数设计的目的主要还是为了操作,不是为了返回值吧End Sub

 

5 large()  和 small()

5.1 worksheetfunction.large()  和  worksheetfunction.small()

  • 好像没有对应的VBA函数
  • worksheetfunction.large()  如果指定不合适和报错
  • 在VBA中尽量使用 application.large()
Sub test508()Debug.Print WorksheetFunction.Large(Range("H1:H5"), 2)
a = Application.Large(Range("H1:H5"), 2)
Debug.Print a
Debug.Print'Debug.Print WorksheetFunction.Large(Range("H1:H5"), 10)  '这样会报错
a = Application.Large(Range("H1:H5"), 10)
Debug.Print a
Debug.Print'b = Large(Range("H1:H5"), 2)
'Debug.Print bEnd Sub

 

6 application.match()

  • worksheetfunction.match()
  • application.match()  随便有些情况只会返回错误,不会跳出报错,但有些情况下在VBA里也会跳出报错的

 

6.1 错误举例

  • 错误的思路:没有先考虑出错处理
  • application.match() 查不到会报错,无法取得 match 属性

 

6.2 正确代码

Sub aa31()
On Error Resume Next
in1 = Int(InputBox("请输入1个要查的数字"))
a = WorksheetFunction.Match(in1, Array(1, 2, 3, 4, 5), 0)If Err = 0 ThenDebug.Print a
ElseDebug.Print "没找到!"
End If
End Sub

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1382131.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Excel的查找和引用函数:VLOOKUP、OFFSET、MATCH、INDEX、INDIRECT

文章目录 一.函数清单二.详解函数1.VLOOKUP()2.OFFSET()3.MATCH()4.INDEX()5.INDIRECT()6.综合练习 一.函数清单 函数介绍VLOOKUP()垂直方向查找OFFSET()计算偏移量MATCH()查找位置INDEX()查找数据ROW()引用行的数据COLUMN()引用列的数据INDIRECT()文本字符串指定的引用HLOOKU…

Python-re中search()函数的用法-----查找ip(超详细)

1.首先来看一下search()和find()的区别 import re s1 "2221155" #search 字符串第一次出现的位置 print(re.search("1",s1)) print(s1.find("1"))它们的输出分别是: search()&#x…

index+match函数/一对多查找匹配,可以代替Vlookup函数的使用。

在表格的列的顺序混乱的时候,vlookup函数choose,vlookup函数match,vlookupcolumn函数并不好用,可以试一下indexmatch函数的组合。 . 首先介绍一下index函数, 语法INDEX(数组或区域, 行号, 列号)…

二分查找法(函数binary_search)

目录 定义 复杂度 解析 函数binary_search 代码实现 运行结果 总结 定义 二分查找也叫折半查找,是一种高效率的查找方法,但是折半查找方法要求顺序存储结构,按关键字大小有序排列。 复杂度 时间复杂度即是while循环的次数。 二分查找的…

数据结构:查找(Search)【详解】

友情链接:数据结构专栏 目录 查找【知识框架】 查找概论一、查找的基本概念 顺序表查找一、定义二、算法 有序表查找一、折半查找二、插值查找三、斐波那契查找 线性索引查找一、稠密索引二、分块索引三、倒排索引 二叉树排序与平衡二叉树一、二叉排序树1、定义2、…

一文搞懂VLOOKUP、INDEX、MATCH函数

最近,在学习数据分析方向的东西,众所周知,Excel是数据分析所不可或缺的工具,由于过往并没有对Excel进行过深入研究,因此当首次接触到Excel中的函数时,不可避免地被其中一些函数的逻辑绕得有些晕&#xff0c…

查找匹配函数FIND和SEARCH的基本用法

一、Excel中FIND函数和SEARCH函数的用法 FIND函数区分大小写,不支持通配符 **SEARCH ** 函数不区分大小写,支持通配符 有这样一个产品: 注:文本 “KitchenAId 和 Stockwell”内有空格 现在我们看这两个函数的用法: 1.FIND(find_text,within_text, [start_num]) 注意:…

Excel字符函数(3):字符查找函数Find、Search

工作中,有时候编号与时间、短信回复内容、评论内容等常有混在一起需要拆分的情况,还有一些从数据库Oracle、Mysql等导出的数据字段内容需要拆分,那么除了MID、LEN、SUBSTITUTE等字符函数外,用的最多的就是Find、Search函数了。 &a…

简单使用Search()函数

给出两个范围&#xff0c;返回一个ForwardIterator&#xff0c; 查找成功指向第一个范围内第一次出现子序列 (第二个范围)的位置&#xff0c;查找失败指向last1。重载版本使用自定义的比较操作。 std::vector<int> vec { 1,2,3,4,5,4,4,4,4,2,3 }; std::vector<int&…

Excel中SEARCH函数的使用方法

SEARCH函数是Excel中常用的文本查找函数&#xff0c;它可以返回查找指定的文本字符在某个字符串中的位置。它的语法结构是SEARCH(find_text,within_text,[start_num]) 如下图A列是随机生成的一些数值&#xff0c;现在想要查找出数值4在这些数值中的位置。 在C2单元格录入公式SE…

C++ search()函数用法详解(深入了解,一文学会)

find_end() 函数用于在序列 A 中查找序列 B 最后一次出现的位置。那么&#xff0c;如果想知道序列 B 在序列 A 中第一次出现的位置&#xff0c;该如何实现呢&#xff1f;可以借助 search() 函数。 search() 函数定义在<algorithm>头文件中&#xff0c;其功能恰好和 find…

如何让你的 Win10 任务栏全透明?

Windows7有系统自带的任务栏透明&#xff0c;但Windows10没有&#xff0c;怎么办呢&#xff1f;没关系&#xff0c;我们用下面这款软件就可以啦&#xff0c;就在微软商店里面&#xff0c;可以免费下载。 配合自动隐藏任务栏食用更佳 最后再关掉小娜&#xff0c;我们来看看效果…

win10 怎么把任务栏变透明

win10系统任务栏颜色重&#xff0c;看起来十分不舒服&#xff0c;那么怎样增加它的透明度呢&#xff1f;一起来看具体步骤&#xff1a; 1.进入设置—>个性化—>颜色&#xff0c;开启“透明效果”选项。 2.按win R&#xff0c;打开运行&#xff0c;输入“regedit”&…

Win10 任务栏透明工具-TranslucentTB

之前比较痴迷Win10系统的美化_||&#xff0c;也找到了好多很好用的小工具&#xff0c;对于Win10的任务栏&#xff0c;一直在尝试让他透明化&#xff0c;&#xff08;深色壁纸还好&#xff0c;浅色壁纸简直不能忍。。&#xff09;&#xff0c;也试过startisback等等软件&#xf…

win10 任务栏全透明,一键设置(translucentTB)

方式1&#xff1a; 通过系统个性化设置任务栏为透明&#xff0c;但此方法可能行不通&#xff0c;就算设置成功了也是只有50%的透明度 要使任务栏全透明&#xff0c;只能采用方式2&#xff0c;使用软件translucentTB 方式2 可以实现win10任务栏全透明的工具&#xff1a; 链接…

android设置透明状态栏

在写这篇文章之前也看过很多大牛的博客&#xff0c;但是大多数都写的比较深奥和跳跃 而且网上还有很多对于透明状态栏及沉浸式状态栏的争论&#xff0c;简直看的头晕眼花 在此我用专业菜鸟的术语给大家解释一下&#xff1a; 沉浸式状态栏&#xff1a;就是你看视频&#xff08…

Win10任务栏透明,3个超好用解决方法!

案例&#xff1a;win10任务栏透明怎么办&#xff1f; 【我的电脑不知道为什么任务栏突然就变透明了&#xff0c;现在不知道该如何解决&#xff0c;遇到这种情况应该怎么办呀&#xff1f;】 Win10任务栏是Windows 10操作系统的一部分&#xff0c;通常默认为不透明。然而&#…

win11更新后Translucent TB 任务栏透明失效

不废话直接步骤 1.下载ViVeTools 下载 2.选择ViVeTools.zip 解压 3.在解压目录下以管理员打开CMD 4.查询26008830 ID的状态 ViVeTool.exe /query关闭为 disabled 开启为 enabled (需要设置为关闭) 5.关闭命令 ViVeTool.exe /enable /id:26008830 /variant:26.重启

Windows11任务栏无法透明化解决办法

Windows11家庭版停止系统更新 你可以选择停或是不停&#xff0c;下次更新可能就把任务栏又给整不能透明了 修改注册表 对于运行Windows11家庭版的用户&#xff0c;没有组策略编辑器&#xff0c;但可以使用注册表停止自动更新。 注意&#xff1a;错误地修改注册表可能会对您…

win10如何使任务栏全透明

> 学习汇总&#xff08;持续更新&#xff09; > 从零搭建后端基础设施系列&#xff08;一&#xff09;-- 背景介绍 首先需要用到一款软件,名字是StartIsBack 附上百度云地址: 链接&#xff1a;http://pan.baidu.com/s/1hrTGFAk 密码&#xff1a;lr6e 安装过程很简单&…