只有当名字以他们开头的时候才能删除特定的字符
我有包含全名的单元格值。
我想从整个Excel工作表中replace/删除以下字符:
Al Al- EL El-
但事实是,我只希望他们被replace,如果单词开始与该字符。 例如:
Alorfze – (移除“al”)arALfzi – (不移除“al”)Ibrahim El-ketoob(移除“el-”)
而且,如果匹配的单词超过4个字符,它只会replace这个字符。
replace工作簿的所有单元格中的文本意味着使用VBA代码。 将下面的代码放到一个模块中(用Alt-F11打开VBA编辑器,然后在Insert – > Module中添加一个模块,然后复制/粘贴下面的文本;回到工作表,select“Macros”,运行replaceStuff
并观看魔术,需要注意的几点:
- 使用
Option Explicit
:总是一个好主意,防止错别字等 -
Option Compare Text
:意味着“al”=“AL” – 换句话说,从比较中删除区分大小写(通常是你想要的) - 要检查的string数组是一个variables:可以很容易地更改要编辑的内容
- 通过在macros开始处设置
Application.ScreenUpdating = False
,并在最后设置True
,可以加快执行速度并在执行过程中保存一些闪烁的电子表格 - 使用
Mid()
函数只有两个参数意味着“直到string结束” – 比使用“一个大数字”或类似len(c.Text) - l
更短,更健壮
编辑修改,以取代searchstring,即使它们出现在WORD的开始,而不是CELL的开始
Option Explicit Option Compare Text Sub replaceStuff() Dim getRidOf getRidOf = Array("AL-", "AL", "EL-", "EL") Dim c As Range Dim s, sp Dim f As Integer Dim flag As Boolean Application.ScreenUpdating = False For Each c In ActiveSheet.UsedRange.Cells c.Select If Len(c.Text) >= 4 Then For Each s In getRidOf flag = False f = InStr(1, c.Text, s) If f > 0 Then ' check that it's part of a four letter word or more sp = InStr(f, c.Text, " ") If sp > f + 3 Or (sp = 0 And f <= Len(c.Text) - 3) Then If f = 1 Then flag = True Else If Mid(c.Text, f - 1, 1) = " " Then ' it is at the start of a word flag = True End If ' at start of word End If ' f = 1 End If ' four letter word End If ' f > 0 If flag Then c.Value = Replace(c.Value, s, "") Exit For End If Next s End If Next c Application.ScreenUpdating = True End Sub
testing:
ibrahim el-ketoob ibrahim ketoob ibrahimel-ketoob ibrahimel-ketoob abel abel aleb eb al bob al bob belbo belbo bol al bel bol al bel el al el al allele lele alele ele elalle alle alelle elle
注 – 我添加了string“EL-”作为另一个searchstring,所以el-ketoob
将变成ketoob
而不是-ketoob
。
还要注意 – 事情按顺序处理。 现在在第一个string被replace之后有一个Exit For
语句(这意味着:“不要与getRidOf
数组中的其他string比较这个特定的单元格;我们完成了,转到下一个单元格”),所以只有第一场比赛被取代(只有一场比赛 – 所以alfred al-hamsy
会变成alfred hamsy
因为在al
之前处理过,然后停止。如果你删除Exit For
(在它前面添加一个撇号'
把它变成一个评论),它会变成fred hamsy
,但alfred alhamsy
会变成fred alhamsy
因为只有第一个人被取代。
我希望你能从这里弄清楚如何改变事情以适应你的需求。
您希望删除以字符“al”,“el”,“al-”或“el-”开头的前两个字母,这些字必须大于4个字符。
我会假设你有一列A列下的名称,许多行作为观察(A1,A2,A3等)。
这个例子将适用于单元格A2。 然后,只需将公式拖动到其他单元格即可:
将名称转换为小写。 inputB2:
=LOWER(A2)&" "
获取第一个名字(单词),如果它有多个单词。 C2:
=TRIM(LEFT(B2,FIND(" ",B2)))
第一个字中的字符数。 D2:
=LEN(C2)
前两个字母在第一个字。 E2:
=IF(D2>4,(LEFT(C2,2)),"")
输出1. F2:
=SUBSTITUTE(IF(E2="al",SUBSTITUTE(C2,"al","",1),IF(E2="el",SUBSTITUTE(C2,"el","",1),C2)),"-","")
检索第二个单词/名称。 G2:
=TRIM(MID(B2,FIND(" ",B2),100))
第二个字中的字符数。 H2:
=LEN(G2)
前两个字母在第二个字。 I2:
=IF(H2>4,(LEFT(G2,2)),"")
输出2. J2:
=SUBSTITUTE(IF(I2="al",SUBSTITUTE(G2,"al","",1),IF(I2="el",SUBSTITUTE(G2,"el","",1),G2)),"-","")
最终产品(完整名称清单,修剪后)。 K2
=IF(J2="",PROPER(F2),PROPER(F2&" "&J2))
这里有8个单词作为例子和他们派生的公式输出。
怎么样:
Sub dural() s = "Al-" t = "Al" u = "EL" For Each r In ActiveSheet.UsedRange If Len(r.Text) > 4 Then If Left(r.Text, 3) = s Then r.Value = Mid(r.Text, 4, 9999) GoTo skipit End If If Left(r.Text, 2) = t Or Left(r.Text, 2) = u Then r.Value = Mid(r.Text, 3, 9999) End If End If skipit: Next End Sub