excel学习库

excel表格_excel函数公式大全_execl从入门到精通

Excel 公式/VBA 多种方法批量把k替换为“x1000”(1.6k——>1600)

本文于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公众号查看文件获取方式

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
      友情链接