Excel|给某一列添加同一个字

本文介绍了一种在Excel中快速为特定列的城市名称添加统一后缀的方法,通过实例演示了如何仅用几秒钟就将'武汉'更新为'武汉市',并提供了删除重复字符的替代方案。

如图所示给新型冠状病毒肺炎数据中“武汉”这一列都加上“市”字:
在这里插入图片描述
先在D列打两行:“武汉市”、“孝感市”
然后在D3按Ctrl+E,即可全部填充
在这里插入图片描述
ps:如果删除某列同一个字的话用替换即可

<think>我们有一个Excel数据处理问题:需要提取某一列数据中的母前缀(例如物流单号中的母部分)。根据引用[1]中提到的Excel函数公式,我们可以考虑使用文本函数来实现这个目标。思路:母前缀通常出现在符串的开头,直到遇到第一个非符(如数)结束。我们可以通过以下步骤提取:1.遍历符串的每个符,直到遇到第一个非符。2.提取从开始位置到第一个非符之前的所有符(即连续的母序列)。在Excel中,我们可以使用以下函数组合:方案1(简单情况):如果母前缀的长度固定,可以直接使用LEFT函数。方案2(通用情况):母前缀长度不固定,我们需要找到第一个非符的位置。这里可以使用数组公式。具体步骤(通用情况):步骤1:找到第一个非符的位置。我们可以用MATCH函数查找第一个非符出现的位置。步骤2:利用LEFT函数根据位置提取前缀。但是,Excel没有直接判断母的函数。我们可以用CODE函数配合ROW(INDIRECT(...))来构建符数组,然后判断每个符是否为母(大写A-Z:65-90;小写a-z:97-122)。公式如下(数组公式,需要按Ctrl+Shift+Enter):=LEFT(A1,MATCH(1,(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122),0)-1)这个公式较为复杂,我们分解一下:1.ROW(INDIRECT("1:"&LEN(A1))):生成一个从1到符串长度的数组。2.MID(A1,上述数组,1):将符串拆分成单个符的数组。3.CODE(...)得到每个符的ASCII码。4.判断条件:如果符不是母(即ASCII不在[65,90]或[97,122]区间),则返回1,否则0。这里用了三个条件:条件1:<65(即非大写母且比A还小)条件2:在91到96之间(即大写母和小写母之间的符)条件3:>122(即超出小写母)用法合并,只要一个条件成立就为非母。5.MATCH(1,上述条件数组,0):查找第一个非母的位置(即第一个1出现的位置)。6.LEFT(A1,位置-1):提取该位置之前的子符串。但是,如果符串中没有非符(即整个符串都是母),那么我们应该返回整个符串。上面的公式在找不到非母时会返回错误,所以可以改进一下,用IFERROR函数处理。改进公式:=IFERROR(LEFT(A1,MATCH(1,(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122),0)-1),A1)注意:由于是数组公式,输入后按Ctrl+Shift+Enter。但是,这个公式很长,而且需要数组操作,对于大量数据可能效率不高。另外,我们也可以使用VBA自定义函数来解决。参考引用[1]中提到宏表函数,但我们不推荐使用。而引用[3]中提到了Pandas处理文本数据,但用户明确在Excel中处理。另外,如果我们能够确定母前缀后第一个符一定是数(在物流单号中通常如此),那么可以简化:我们只需要找第一个数的位置。简化公式(假设前缀之后是数):=LEFT(A1,MIN(IF(ISNUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),ROW(INDIRECT("1:"&LEN(A1)))))-1)这个公式是数组公式。它通过判断每个符是否是数,然后找到第一个数的位置,再提取这个位置之前的符串。步骤:1.同样生成位置数组。2.用MID提取每个符,然后用--尝试转为数(如果转换出错则不是数),再用ISNUMBER判断。3.MIN函数找到第一个数出现的位置(因为ROW返回的是位置数组,我们用IF返回满足条件的位置,取最小位置)。4.如果符串中没有数,则这个公式会出错。因此可以上错误处理:=IFERROR(LEFT(A1,MIN(IF(ISNUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),ROW(INDIRECT("1:"&LEN(A1)))))-1),A1)输入时按Ctrl+Shift+Enter。但注意,这个简化方案只适用于母前缀后紧跟数的情况。如果前缀后出现其他非符(比如空格、符号等)则无法处理。因此,我们可能需要更通用的方法,或者使用VBA。下面提供一个VBA自定义函数:按Alt+F11打开VBA编辑器,插入模块,输入以下代码:```vbFunctionExtractLetters(strAsString)AsStringDimiAsIntegerFori=1ToLen(str)DimcAsStringc=Mid(str,i,1)IfNot(c>="A"Andc<="Z"Orc>="a"Andc<="z")ThenExitForEndIfNextiIfi=1ThenExtractLetters=""ElseExtractLetters=Left(str,i-1)EndIfEndFunction```然后在Excel中使用:=ExtractLetters(A1)这个函数会从左边开始逐个检查符,直到遇到一个非符,返回前面的母部分。根据用户的需求,我们主要关心物流单号。物流单号的常见规则:母前缀+数,所以用简化公式可能就够用。如果考虑通用性,建议使用VBA。总结三种方法:1.复杂数组公式(适用于任意符串,但有错误处理)2.简化数组公式(适用于前缀后紧跟数的情况)3.VBA自定义函数(通用、简单)考虑到用户可能没有VBA权限,我们提供数组公式方法。实际操作建议:如果数据量不大,使用数组公式;如果经常需要处理,建议使用VBA。示例数据:A1:"AUD12345678"->提取结果"AUD"A2:"SF123456789"->"SF"A3:"ABC123"->"ABC"A4:"123ABC"->返回空(因为第一个符就是数,没有母前缀)对于A4的情况,用户可能需要调整,比如有些物流单号可能是纯数,所以需要处理这种情况。我们可以在公式中入判断:如果没有母前缀(即第一个符就不是母),则返回空符串。在简化公式中,我们使用了MIN函数,如果找不到数,就会返回整个符串(在错误处理中)。但这样对于纯符串会返回整个符串,符合要求;但对于第一个符就是非母,会返回空(因为MIN函数找不到数,但我们的公式中IFERROR会返回整个符串?不对,在简化公式中,如果符串中没有数,那么IFERROR会触发,返回整个符串。但符串第一个符不是母,整个符串可能也包含非母,所以并不符合要求。因此,我们需要更准确的逻辑:我们想要的是符串开头的连续母。所以,如果第一个符不是母,就应该返回空。修改简化公式(数组公式):我们可以在提取之前先判断第一个符是否为母,如果不是,直接返回空,否则继续。但这样公式会变得更长。使用复杂数组公式则可以处理。复杂数组公式中,如果第一个符就不是母,那么MATCH会找到1,然后LEFT(A1,0)为空符串。所以我们推荐复杂数组公式,虽然复杂但更通用。下面再次给出复杂数组公式(使用IFERROR处理整个符串都是母的情况,即MATCH找不到时返回整个符串)的完整版本:=IFERROR(LEFT(A1,MATCH(1,(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122),0)-1),A1)但注意:整个符串都是母时,条件数组都是0,MATCH会返回错误,此时IFERROR返回整个符串,正确。但是,如果符串中有0个符(空)?公式会出错,我们再一个空值判断:=IF(A1="","",IFERROR(LEFT(A1,MATCH(1,(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122),0)-1),A1))这个公式已经很长了。因此,对于不熟悉数组公式的用户,使用VBA更简洁。另外,在Excel365中,我们还可以使用新函数:SEQUENCE和LET来简化。如果用户使用的是Excel365,公式可以写为:=LET(chars,MID(A1,SEQUENCE(1,LEN(A1)),1),codes,CODE(chars),isNotLetter,(codes<65)+(codes>90)*(codes<97)+(codes>122),firstNotLetterPos,MATCH(1,isNotLetter,0),IF(ISNUMBER(firstNotLetterPos),LEFT(A1,firstNotLetterPos-1),A1))这个公式同样需要数组运算,但可读性更好。由于用户环境可能不同,我们重点提供通用方法。实际操作步骤:方法一(适用于任意Excel版本):使用数组公式1.在B1输入以下公式(假设数据在A列):=IF(A1="","",IFERROR(LEFT(A1,MATCH(1,(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)+(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122),0)-1),A1))2.按Ctrl+Shift+Enter,然后下拉填充。方法二:使用VBA1.按Alt+F11打开VBA编辑器2.插入模块3.粘贴提供的VBA函数4.回到Excel,在B1输入:=ExtractLetters(A1)方法三:如果母前缀长度固定,可以用LEFT例如,如果都是3个母,则:=LEFT(A1,3)根据用户物流单号的特点(如AAE、AUD、SF等)长度不固定,所以方法三可能不适合。最后,我们生成相关问题。</think> ### Excel提取母前缀的三种方法 #### 方法一:使用FIND+LEFT函数组合(推荐) 适用场景:母前缀和后续符有明确分隔符(如数、符号)时 ```excel =IFERROR(LEFT(A2, FIND("@", SUBSTITUTE(A2, "", "@", LEN(LEFT(A2, MATCH(1, INDEX(--ISERR(MID(A2, ROW($1:$99), 1)*1), 0), 0))))-1), A2) ``` **操作步骤**: 1. 在B2单元格输入公式 2. 按`Ctrl+Shift+Enter`(数组公式) 3. 向下拖拽填充 👉 *原理:通过MATCH定位第一个非母位置[^1]* #### 方法二:正则提取(Excel 365动态数组) 适用场景:处理复杂格式时 ```excel =TEXTAFTER(TEXTBEFORE(A2, CONCAT(IF(ISERROR(1*MID(A2, SEQUENCE(LEN(A2)), 1)), "", MID(A2, SEQUENCE(LEN(A2)), 1))), , 1), "") ``` **操作步骤**: 1. 仅支持Excel 365/2021 2. 自动溢出结果到相邻区域 👉 *原理:SEQUENCE分割符并识别数位置[^3]* #### 方法三:Power Query高级提取 适用场景:大数据量批量处理 1. **数据导入**: - 选择数据区域 → 数据选项卡 → 从表格/区域 - 勾选"表包含标题" 2. **添加自定义列**: ```powerquery = Text.Start([列名], List.PositionOfAny( Text.ToList([列名]), List.Transform({"0".."9"}, each Character.FromNumber(_)), 0 ) ) ``` 3. **结果输出**: - 主页 → 关闭并上载至新工作表 > ✅ 三种方法对比: > | 方法 | 版本要求 | 处理速度 | 适用场景 | > |---|---|---|---| > | FIND+LEFT | 所有版本 | 中等 | 常规单号分析 | > | 动态数组 | Excel 365 | 快速 | 复杂格式处理 | > | Power Query | 2016+ | 超快 | 大数据批处理 | ### 物流单号提取示例 | 原始单号 | 提取结果 | |---------|---------| | AUD12345678 | AUD | | SF123456789 | SF | | 123ABC456 | (空白) | | ABC-DEF123 | ABC | 📝 说明:当首符为数时返回空白,符合物流单号前缀逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

difizuhvovs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值