ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > 函数与公式 > 如何统一单位

如何统一单位

作者:绿色风 分类: 时间:2022-08-18 浏览:127
楼主
w83365040371
Q:如何统一单位?
    如下图所示,将A列中的游戏币转换,统一单位为(备注:1金=100银=100000铜)

图1.

 



A: 从图上我们可以看到单元格中都含有金银铜且它们在单元格中的排列顺序都一致. 对于这种比较规律的数据,可以用mid和find函数去求金、银、铜所对应的系数,公式如下

公式1.
  1. =SUM(MID(A4,FIND({"";"金";"银"},"@"&A4),MMULT(FIND({"","金";"金","银";"银","铜"},"@"&A4),{-1;1})-1)*10^{5;3;0})


优点:公式1.对金银铜所对应的系数是否为整数没有限制

      比如:单元格中的银币的系数可以为0.5, 结果见图2.

图2.

 


统一单位.zip



该帖已经同步到 w83365040371的微博





2楼
w83365040371
然而公式1.在实际应用中可能碰到很多问题,比如单元格中的"金"、"银"、"铜"排列顺序不一致,或者某个单元格中只含有"金"等

案例2:
如下图所示,案例数据中的,金银铜顺序不一致或者仅有银存在等,但是其系数为整数

图3.

 

由于数据源中的单位只有整数,那么可以用countif()和通配符"*",来求其系数,公式如下,结果见图4.

公式2.
  1. =SUM(COUNTIF(A8,"*"&ROW($1:$10002)&{"金","银","铜"}&"*")*LEFT(ROW($1:$10002))*10^(LEN(ROW($1:$10002))-1)*{100000,1000,1})

图4.

 




以案例2.A8单元格中的"10银124铜2金"为例,使用简化过的公式countif(a8,"*"&row($1:$200)&"铜*),以便对结果的讨论,结果见图5.

图5.


 


从图表上我们可以知道,满足结果为1的行标为4,24,124. 而铜的系数为124=4+20+100,即所得行标的首位的数字相连,这就是公式LEFT(ROW($1:$200))*10^(LEN(ROW($1:$200))-1)的由来

问题:

公式2.对系数有着比较严格的要求,系数不能超过65536或不能为小数,见图11.
备注:其实如果系数是小数,也能一定限度的使用公式2. 比如 已知系数是小数且不大于655.36

图11.

 



3楼
w83365040371


如上图所示,数据中金银铜的系数不全为整数,且单元格中金银铜不是完全存在
对于这类问题可以用公式3.,结果见图7.
  1. =SUM(TEXT(RIGHT(TEXT(RIGHT(LEFT(SUBSTITUTE("@"&A12,{"金","银","铜"},REPT(" ",50)),50),ROW($1:$53)),),ROW($1:$53)-1),"[>];;0;!0")*{100000,1000,1})
图7.

 


以案例3.中的A13单元格,"3金2.5铜1银"为例,使用函数
LEFT(SUBSTITUTE("@"&A12,{"金","银","铜"},REPT(" ",50)),50)
可以得到每个单位对应的,由其系数和文字的混合的字符串结果见图8.


图8.

 


获得字符串后,从右开始截取,所能得到的最大数字,即为每个单位真实的系数,(利用经典的混和文字求数字和的思路),也就是线面公式的由来...


TEXT(RIGHT(TEXT(RIGHT(LEFT(SUBSTITUTE("@"&A12,{"金","银","铜"},REPT(" ",50)),50),ROW($1:$53)),),ROW($1:$53)-1),"[>];;0;!0")


公式3.在实际使用中也有限制
对于米、分米、厘米,这种单位"分米"包含单位"米"的数据,公式3.会出错,见图9


图9.

 

如上图红色标记所示, 数据"2厘米1米", 利用公式得到"米"的系数是"2厘",而不是其真实的系数"1",造成了结果错误


对于这些字符长度=1的单位,我们可以用字母评分的公式去求值
公式4.
  1. =SUM(TEXT(MID(A4,ROW($1:$102),COLUMN(A:J)-1),"[>];;0;!0")*ISERR(-(0&MID(A4,ROW($1:$102)-1,1)))*LOOKUP(RIGHT(TEXT(0&MID(A4,ROW($1:$102)+COLUMN(A:J)-1,1),";;;@")),{"",0;"金",100000;"铜",1;"银",1000}))

公式5.
  1. =SUM(TEXT(MID(A4,ROW($1:$102),COLUMN(A:J)-1),"[>];;0;!0")*ISERR(-(0&MID(A4,ROW($1:$102)-1,1)))*SUMIF(H:H,MID(A4,ROW($1:$102)+COLUMN(A:J)-1,1),I:I))
公式的详解见http://www.exceltip.net/thread-29286-1-1.html
, 结果见图10.

图10.

 




由于是用公式SUMIF(H:H,MID(A4,ROW($1:$102)+COLUMN(A:J)-1,1),I:I)获得单位的兑换系数,
所以公式4.和公式5.对数据的单位有要求:要求对单位截取相同的长度时,能够彼此区分比如:数据源中同时含有长度单位,,使用公式5.就无从下手,此时用公式3.是更好的选择



本帖简单的介绍了在统一单位过程中碰到的一些问题及其解法,每个公式各有优劣,要根据实际情况取合适的公式处理...
同时对于上面所提到的一些案例, 也可以用宏表函数evaluate(详细步骤见楼下, 在此多谢天南), 由于此公式要不断地嵌套函数substitute, 所以当数据中的单位多而复杂时, 使用起来就比较麻烦.









4楼
天南地北
定义名称为number为
  1. =EVALUATE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A4,"金","*100000+"),"银","*1000+"),"铜","+")&0)
貌似能应对楼上说的各种情况,宏表函数从理解上来说更胜一筹,呵呵,个人之见

 
铜币数量.rar
5楼
w83365040371
嗯,用宏表函数基本上通杀...
6楼
200240
好东西
我正好可以用得着,谢谢

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap