ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8299|回复: 14

提取单元格中的中文(分享写递代公式的心得)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-1-18 22:02 | 显示全部楼层 |阅读模式

Y1YFrkMD.rar (1.81 KB, 下载次数: 143)

附件中只有三个单元格,一个是源数据单元格A1,一个公共的一个辅助单元格,用作循环变量B1,另一个自然是结果单元格C1,功能就是提取A1单元格中的中文字符。

在工具-选项-重新计算中设置重新计算次数适当大(大于A列最大字符数的两倍)可以用公式=max(len(data))计算出最大的字符串长度N,其中data=offset($a$1,,,counta(a:a)).是名称定义。

A1:提取单元格中的中文zifu,把*&等符号去出

B1:=IF(B1>MAX(LEN(data))-1,0,B1+1),B1的值就在[0,N]之间变换,递增,然后到N时再变成0。数组公式,ctrl+shift+enter

C1:=IF(B1=0,IF(LEN(C1)<>SUM(--(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>4000)),A1,C1),IF(CODE(MID(A1,MIN(LEN(A1),B1),1))<5000,SUBSTITUTE(C1,MID(A1,MIN(LEN(A1),B1),1),""),C1))

这个有点复杂.

先用自然语言表述一下:

B1单元格一直在循环变化[0,N],递增。

如果B1为0(相当于初始态,或者阶段性初始态)

          那么再判断C1单元格是否完成了对A1单元格的中文字符提取,

                  如果完成了,那么C1单元格保持不变;

                  如果没有完成(这个情况可能是A1单元格又被修改了,或者确实刚开始处理),那么把C1再初始化为A1;这里很重要的一点就是把A1传递到C1的实现。

如果B1不为0

          那么判断A1单元格的第B1位的字符是否不是中文字符

                  如果不是中文字符,那么把该字符在C1单元格中替换掉,替换为空

                  如果是中文字符,那么保持当前的C1.这样在一个完整的B1从0-N循环中确保了C1中只剩下了A1中的中文字符。而这个时候即使B1又变成了0,由于C1已经完成了提取的任务将保持不变。

======================================================================

写递代公式开始会有点无从下手的感觉,不过多写几次就会习惯的,而且比较简单。只要把自然逻辑变成公式就行了。

首先需要一个循环变量,这个可以用一个单元格从[0,n]自循环实现,差不多都是:=IF(B1>N-1,0,B1+1)的样子.

很重要的一个功能是要实现传递功能,因为递代的实现特点是对自身单元格的引用,所以要把待处理的单元格先传递到公式单元格,作为一个初始态。

第二个部分就是核心公式,核心公式其实就是一个重复操作的一个完整的中间片段,这里调用的单元格是自身,从而完成递代。

最后一个环节就是保持阶段,当公式单元格满足最终目标要求的时候就应该保持。

好好体会这几点,然后多尝试一下,我想他能成为一种旁门利器,呵呵。对不会VBA的同学是个福音。

===============================================================================

所以可以套用这个模式,一个是自循环单元格B1,一个主公式:IF(B1=0(初始态),if(判断是否递代完成,保持功能,传递功能),一个重复运算的中间一个完整循环片段)

================================================================================

关于循环的引用的另一个主题帖推荐一下,呵呵

        

                 

[此贴子已经被作者于2008-1-19 10:41:09编辑过]

Rz0vsDCs.rar

1.67 KB, 下载次数: 64

提取单元格中的中文(使用了两个辅助列)

rSKqq7oQ.rar

1.7 KB, 下载次数: 43

提取单元格中的中文(使用了两个辅助列)

TA的精华主题

TA的得分主题

发表于 2008-1-18 22:24 | 显示全部楼层

我也是越想越头痛,不过你还是用到了辅助列.

如果在函数中也使用一个"临时变量",哈哈,就可以不用VBA罗!!

谢谢你的讨论与分享!

[em10]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-1-19 08:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用nevinslee在2008-1-18 22:24:24的发言:

我也是越想越头痛,不过你还是用到了辅助列.

如果在函数中也使用一个"临时变量",哈哈,就可以不用VBA罗!!

谢谢你的讨论与分享!

[em10]

呵呵,我想对一个单元格需要不确定次数的重复操作要么用VBA,要么用递代。就是需要一个循环体,如果用递代,我现在就是利用了个辅助单元格来递增处理。我想应该没有什么其他办法。这相当于代码中的 i吧,呵呵。

不过,我觉得只要一个 辅助单元格就行了,不用一个列的。呵呵

TA的精华主题

TA的得分主题

发表于 2008-1-19 09:30 | 显示全部楼层

这是JSSY版主的公式:

=MID(A1,MATCH(255,CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)))+1,100),数组!

不过汉字中间有数字就还是不行,呵呵!

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-1-19 10:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
QUOTE:
以下是引用nevinslee在2008-1-19 9:30:56的发言:

这是JSSY版主的公式:

=MID(A1,MATCH(255,CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)))+1,100),数组!

不过汉字中间有数字就还是不行,呵呵!

版主就是厉害呀,呵呵

好像不对,好像对中间有其他字符的就不对,没深纠,但好像是提取了某位以后的字符,对这以后的字符是否中文没有判断。我想单个公式,不用递代应该是不行的。吐吐舌头,呵呵

[此贴子已经被作者于2008-1-19 10:18:11编辑过]

TA的精华主题

TA的得分主题

发表于 2008-1-19 10:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

学习了!

你的公式有很大的优点!!谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-1-19 10:19 | 显示全部楼层
QUOTE:
以下是引用nevinslee在2008-1-19 10:17:00的发言:

学习了!

你的公式有很大的优点!!谢谢

呵呵,其实就是在单元格之间写程序,你说呢,呵呵

TA的精华主题

TA的得分主题

发表于 2008-1-19 10:36 | 显示全部楼层

这样说,写VBA或写函数都是写"程序"!

呵呵!要是EXCEL函数有"临时变量"多好!

TA的精华主题

TA的得分主题

发表于 2008-1-19 10:44 | 显示全部楼层

不过胡兄上面的汉字编码要改成:1601.

啊 1601 阿 1602 吖 6325 嗄 6436 腌 7571 锕 7925

)>4000

)<5000

这两处!

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-1-19 10:44 | 显示全部楼层
QUOTE:
以下是引用nevinslee在2008-1-19 10:36:32的发言:

这样说,写VBA或写函数都是写"程序"!

呵呵!要是EXCEL函数有"临时变量"多好!

其实就是有临时变量呀,在递代中临时变量就是当前公式运算前一刻当前单元格的值呀。

当然我知道你说的是在单元格内直接使用另一个特殊的变量,这样可以去除那个公用的循环变量单元格。

我想主要EXCEL中会VBA的可以用自定义函数么,所以最好还是自定义函数来处理。我们的方式很特别,特别的有些不伦不类吧,哈哈

汉字编码,呵呵,这个应该改吧,呵呵。我也是昨天用CODE试探了一下,呵呵。这个在符号中有写是不是呀,呵呵。

[此贴子已经被作者于2008-1-19 10:47:52编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-5 06:18 , Processed in 0.035705 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表