【问题标题】:Remove specific strings only if the names begin with them仅当名称以它们开头时才删除特定字符串
【发布时间】:2013-08-21 21:37:16
【问题描述】:

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

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

Al
Al-
EL
El-

但事实是,我希望仅当单词以该字符开头时才替换它们。例如:

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

而且,只有匹配的单词超过4个字符才会替换这个字符。

【问题讨论】:

  • 发布您的尝试或取得的成果。 SO 并不适合像这样的开放式问题。
  • 告诉我们你到目前为止做了什么。此外,请不要在问题标题中包含标签。标题必须简要说明您的问题或疑虑,我建议您在下一个问题中为您的问题提供更好的标题。
  • 似乎是一个合理的问题;当然含糊不清,没有任何尝试自己编写代码,但除了我看不到问题的形式之外?

标签: string excel excel-formula vba


【解决方案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 个单词作为示例及其派生公式输出。

【讨论】:

    【解决方案2】:

    怎么样:

    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
    

    【讨论】:

    • 它对我不起作用它不会改变任何东西:( ibrahim el-ketoob(例如没有改变),我完全按照运行微的步骤。希望得到你的帮助
    【解决方案3】:

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

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

    EDIT 修改为替换搜索字符串,即使它们出现在 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 被替换。

    我希望你能从这里找出如何改变事情来满足你的需要。

    【讨论】:

    • 它对我不起作用它不会改变任何东西:( ibrahim el-ketoob(例如没有改变),我完全按照运行微的步骤。希望得到你的帮助
    • 我看到了问题 - 正如所写的那样,这只检查单元格中文本的开头,而不是每个单词的开头。将在今天晚些时候更新。
    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 2019-08-09
    • 2019-11-18
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多