【问题标题】:vba replace all in column within sections broken by "/"vba 替换由“/”分隔的部分中的所有列
【发布时间】:2016-03-31 04:23:41
【问题描述】:

所以我有一些代码通过名称列表(大多数是每行一个用户名)。一些行有多个名称,由“/”字符(John Doe / Smith Jr / Some Guy)分隔。我使用以下代码(按名称大小写重复)将所有名称修改为正确的 LDAP 名称。

Worksheets(2).Columns("B").Replace _
What:="*smith*", Replacement:="jsmith", _
SearchOrder:=xlByColumns, MatchCase:=False

Worksheets(2).Columns("B").Replace _
What:="*Doe*", Replacement:="jdoe", _
SearchOrder:=xlByColumns, MatchCase:=False

这适用于每个只有一个名称条目的字段。有没有办法指定使用通配符“*”字符删除 John Doe(某些字段可能拼写不正确等),但不修改“/”之后的任何内容。

示例数据

John Doe
Abraham Lincoln / john_doe
doe john
doe john / Obiwan
john doe / jsmith / mark mane
john smith / john doe
john does

预期输出

jdoe
Abraham Lincoln / jdoe 
jdoe
jdoe / Obiwan
jdoe / joe smith / mark mane
jsmith / jdoe
jdoe

我收到了什么

jdoe
jdoe
jdoe
jdoe
jdoe
jsmith
jdoe

【问题讨论】:

  • Hi Blue 抱歉,我不完全理解您的问题。目前,您在第 2 列中搜索“Doe”,并将其替换为“jdoe”。现在您要找到“John Doe”并将其删除?
  • @StormsEdge 我添加了一些示例数据,希望能更好地了解我想要完成的工作
  • 不,不是没有进行单元迭代。您的通配符正在使用整个字符串,John Doe / Smith Jr / Some Guy *Doe* 匹配,Range.Replace 方法将用指定的"jdoe" 字符串替换该匹配项。
  • @ScottHoltzman 如果 John Doe 是单元格中的第一个条目,则不起作用...
  • @DavidZemens 是的,但我总是可以在行中每个单元格的开头添加一个“/”,运行他给出的命令,然后删除第一个“/”

标签: vba excel


【解决方案1】:

试试这个:

What:="/*Doe*/", Replacement:="/jdoe/"

并在范围内的每个单元格中添加一个尾随 /,以便捕获像 some name / john doe 这样的条目

【讨论】:

  • 注意:还需要在Replacement值后面加上/作为前缀和后缀,还需要在范围内的每个单元格后面加上/,否则不会在Abraham Lincoln / John Doe 中赶上 John Doe
  • @DavidZemens - 谢谢。我打算建立一个更充实的答案,但 OP 似乎能够处理它。不过,可能值得为其他人更充分地充实。
  • @ScottHoltzman 我同意,我知道需要前缀和后缀“/”,但其他人在偶然发现这个问题时可能会错过它
【解决方案2】:

这也应该有效,并且不需要任何前缀/后缀。这会在大约 6 秒内处理 100K 个单元格(每次调用 foo 函数)。

Sub main()
' This is your main procedure and you can specify all _
  of your replacements here on their own line:

Call foo("*Doe*", "jdoe")
Call foo("*Ruth*", "bruth")
Call foo("*Washington*", "gwashington")
' etc...

End Sub

Sub foo(replace, replacement)
Dim rng As Range, cl As Range, vals

Set rng = Worksheets(2).Range("B1:B100000")  'Modify as needed
For Each cl In rng.Cells
    vals = Split(cl.Value, " / ")
    For i = LBound(vals) To UBound(vals)
        If vals(i) Like replace Then
            vals(i) = replacement
        End If
    Next
    cl.Value = Join(vals, " / ")
Next


End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 2016-08-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多