0

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

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

Al
Al-
EL
El-

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

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

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

4

3 回答 3

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

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这个特定单元格的数组中的其他字符串进行比较;我们完成了,转到下一个单元格”),所以只有第一个匹配项是替换(并且只有一个匹配项 - soalfred al-hamsy会变成alfred hamsy因为al-之前处理过al,然后停止。如果删除Exit For(在它前面添加撇号'将其变成评论),它会变成fred hamsy,但alfred alhamsy会变成intofred alhamsy因为只有第一个al被替换。

我希望你能从这里弄清楚如何改变事情以满足你的需要。

于 2013-08-20T03:19:49.470 回答
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 个单词作为示例及其派生公式输出。

在此处输入图像描述

于 2013-08-20T00:34:57.310 回答
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
于 2013-08-20T00:35:14.653 回答