仅当名称以它们开头时才删除特定字符串

时间:2013-08-19 23:48:27

标签: string excel excel-vba excel-formula vba

我的单元格值包含全名。

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

Al
Al-
EL
El-

但事实是,我希望只有在单词以字符开头时才能替换它们。例如:

  

Alorfze - (删除“al”)   arALfzi - (不要删除“al”)   Ibrahim El-ketoob(删除“el - ”)

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

3 个答案:

答案 0 :(得分:3)

替换工作簿的所有单元格中的文本意味着使用VBA代码。将以下代码放入模块中(使用Alt-F11打开VBA编辑器,然后使用Insert - > Module添加模块,然后复制/粘贴以下文本;返回工作表,选择“宏”,运行replaceStuff并注意魔力。有几点需要注意:

  1. Option Explicit的使用:总是一个好主意,防止错别字
  2. Option Compare Text:表示“al”=“AL” - 换句话说,从比较中删除区分大小写(通常是您想要的)
  3. 要检查的字符串数组是一个变量:可以轻松更改要编辑的内容
  4. 通过在宏的开头设置Application.ScreenUpdating = False,并在结尾处设置True,可以加快执行速度并在执行期间保存电子表格的一些闪烁
  5. 仅使用两个参数的Mid()函数意味着“直到字符串结尾” - 比使用“大数字”或类似len(c.Text) - l 修改

    编辑以替换搜索字符串,即使它们出现在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
    

    测试:

    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

    我希望你能从这里弄清楚如何根据你的需要改变事物。

答案 1 :(得分: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

答案 2 :(得分: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