只有当名字以他们开头的时候才能删除特定的字符

我有包含全名的单元格值。

我想从整个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并观看魔术,需要注意的几点:

  1. 使用Option Explicit :总是一个好主意,防止错别字等
  2. Option Compare Text :意味着“al”=“AL” – 换句话说,从比较中删除区分大小写(通常是你想要的)
  3. 要检查的string数组是一个variables:可以很容易地更改要编辑的内容
  4. 通过在macros开始处设置Application.ScreenUpdating = False ,并在最后设置True ,可以加快执行速度并在执行过程中保存一些闪烁的电子表格
  5. 使用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