2013-08-19 35 views
0

我有包含全名的单元格值。仅当名称以它们开头时才删除特定的字符串

我想从整个Excel工作表中替换/删除以下字符:

Al 
Al- 
EL 
El- 

但事实是,我想他们如果字与字开始只能更换。例如:

Alorfze - (删除 “AL”) arALfzi - (不删除 “AL”) 易卜拉欣埃尔 - ketoob(删除 “EL-”)

此外,将如果匹配的单词超过4个字符,则仅替换此字符。

+0

发布您尝试过的或您已获得多少。所以这不是真正的开放式问题。 – Taylor

+0

告诉我们你到目前为止做了什么。另外,请不要在问题标题中加入标签。标题必须简要解释您的问题或担忧,我建议您提出下一个问题,以便为您的问题提供更好的标题。 –

+2

似乎是一个合理的问题;肯定含糊不清,并且没有任何企图自己编写代码的尝试,但除了形式之外,我看不出问题所在? – whytheq

回答

1

要删除以字符“al”,“el”,“al-”或“el-”开头的前两个字母,且这些字必须大于4个字符。

我会假设你有一列A列下的名称,许多行作为观察值(A1,A2,A3等)。

这个例子适用于单元格A2。然后,您需要做的就是将公式拖到其他单元格中:

将名称转换为小写。输入B2:

=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个单词作为示例及其派生的公式输出。

enter image description here

+1

非常感谢你安德烈 – user2698113

0

如何:

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 
+0

它不会为我工作,它不会改变任何东西:( ibrahim el-ketoob(例如没有改变),我遵循微妙的运行的步骤。希望得到你的帮助 – user2698113

3

在工作簿中的所有细胞替换文本意味着使用VBA代码。将以下代码放入模块中(使用Alt-F11打开VBA编辑器,然后选择插入 - >模块添加模块,然后复制/粘贴以下文本;返回工作表,选择“宏”,运行replaceStuff并观看魔术有几件事情需要注意:

  1. 使用的Option Explicit:总是一个好主意,对错别字等
  2. Option Compare Text后卫:意思是“人” =“AL” - 换句话说,从比较中删除大小写敏感(通常是您想要的)
  3. 要检查的字符串数组是一个变量:可以很容易地更改要编辑的内容
  4. 通过在宏的开始设置Application.ScreenUpdating = False,并在年底将其设置True,你加快执行和保存电子表格的一些闪烁执行期间
  5. 只有两个参数使用Mid()功能的装置“,直到的结束字符串” - 短,更强劲,比任何使用‘大数字’或类似的东西len(c.Text) - l

编辑修改,即使它们出现在单词的开头来代替搜索字符串,但不启动的细胞

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 

测试:

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 

注 - 我添加字符串“EL-”作为另一个搜索字符串所以el-ketoob会变成ketoob,而不是-ketoob

还要注意 - 事情按“顺序”进行处理。现在有一个Exit For声明后第一个字符串被替换(这意味着:“不要与getRidOf阵列中的其他字符串比较这个特定的单元格;我们完成了,去下一个单元格”),所以只有第一个匹配被替换(只有一个匹配 - 因此alfred al-hamsy将变成alfred hamsy,因为al-al之前得到处理,然后停止。如果删除Exit For(在其前面添加一个撇号'以将其变成注释),它会成为fred hamsy,但alfred alhamsy会变成fred alhamsy因为只有第一al被替换。

我希望你可以从这里找出如何改变的东西,以适应ÿ我们的需求。

+0

它不会对我工作,它不会改变任何东西:( ibrahim el-ketoob(例如没有改变),我按照微步准确运行。希望得到你的帮助 – user2698113

+0

我看到问题 - 正如所写,这只会检查单元格中文本的开始,而不是每个单词的开始。将于今天晚些时候更新。 – Floris

+0

感谢您的回复,我将等待您:D – user2698113

相关问题