
本文于2023年8月3日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!
内容提要
字符查找与替换
大家好,我是冷水泡茶,今天在知乎有一邀请贴:

他的需求可以这样表述:
把以k结尾的数字,去掉k,然后乘上1000,也就是把数字统一单位为元。
等我看到问题,准备回答的时候,前面已经有好几个人回答了,怎么办?我的回答不能跟别人相同啊,于是就避开别人已用过的函数,作了回答:

这个问题还是值得说一说的,我们一起来看一下吧:
问题分析
1、判断单元格数字里有没有k,如果没有k,则值不变。
2、如要有k,则把k去掉,再乘以1000。
解决方法
1、判断单元格值里有没有k,有以下方法:
(1)用RIGHT函数取最右边一个字符,看它是否等于k;
(2)用ISNUMBER函数判断单元格是不是数字,有k是不是数字;
(3)用FIND函数查找k;
(4)用LEN结合SUBSTITUTE函数,先用SUBSTITUTE函数替换k为空,计算其长度,与原长度相比,不相等的就有k;
(5)......
2、把k去掉的方法:
(1)最常见的用LEFT函数,结合LEN函数,截取总长减1位的字符。
(2)用SUBSTITUTE函数,把k替换为空。
3、最终的解决方法, 假设金额在A2单元格:
方法一,用RIGTH函数,结合LEN、LEFT
=IF(RIGHT(A2,1)="k",LEFT(A2,LEN(A2)-1)*1000,A2)
方法二,用ISNUMBER函数,结合LEN、LEFT
=IF(ISNUMBER(A2),A2,LEFT(A2,LEN(A2)-1)*1000)
方法三,用FIND函数(我的回答),结合ISERROR、SUBSTITUTE
=IF(ISERROR(FIND("k",A2)),A2,SUBSTITUTE(A2,"k","")*1000)
方法四,用SUBSTITUTE函数,结合LEN
=IF(LEN(A2)=LEN(SUBSTITUTE(A2,"k","")),A2,SUBSTITUTE(A2,"k","")*1000)
以上公式前半段与后半段,再组合,还可以衍生出几种来,我们不再列举。
方法五,VBA代码法,这种情况一般不建议用代码,一个公式搞定的事,不过如果数据量特别巨大,有个几万几十万条,用公式可能会使得表格变慢,那么这时候用VBA代码直接处理可能会更好一些。
我看到有个回答是用VBA代码的,但他是直接操作单元格,如果数据量很大的话,可能会影响性能,最好还是采用数组来处理。
(1)读写数组法,3万条记录,0.06秒。
Sub s1() Dim ws As Worksheet Dim lastRow As Long Dim arrData() t = Timer Set ws = Sheet3 ws.Activate lastRow = ws.UsedRange.Rows.Count arrData = ws.Range("A2:A" & lastRow).Value For i = 1 To UBound(arrData, 1) If InStr(arrData(i, 1), "k") Then arrData(i, 1) = Replace(arrData(i, 1), "k", "") * 1000 End If Next ws.Range("A2").Resize(UBound(arrData, 1), 1) = arrData MsgBox Timer - tEnd Sub
(2)直接读写单元格法,3万条记录,1.27秒。
Sub s2() Dim ws As Worksheet Dim lastRow As Long t = Timer Set ws = Sheet3 ws.Activate lastRow = ws.UsedRange.Rows.Count For i = 2 To lastRow If InStr(Cells(i, 1), "k") Then Cells(i, 1) = Replace(Cells(i, 1), "k", "") * 1000 End If Next MsgBox Timer - tEnd Sub
虽然绝对数相差1.2秒,但相对数是相差20倍!

即便在A列所有数字都没有k的情况下,相当于读一遍,第2种方法也比第一种慢。
总结
1、虽然这只是一个简单的问题,但我们从学习的角度来说,采用多种方法来解决问题,不失为一种好的学习方法。
2、VBA代码中,如果要处理大量数据,应尽量采用数组进行处理,减少直接读写单元格的操作。
喜欢就点个赞、点在看、留个言呗!需要示例文件的朋友请关注本人同名V公众号查看文件获取方式