【问题标题】:Extract substring and change cell value using Mid and Find in Excel (VBA)在 Excel (VBA) 中使用 Mid 和 Find 提取子字符串并更改单元格值
【发布时间】:2017-03-04 20:28:04
【问题描述】:

我想遍历一列并在每个单元格中提取一个子字符串(在我的示例中为“代码:”)

我想遍历每个单元格并在适当的位置运行公式。基本上删除列的每个单元格中的所有内容,除了代码。

我知道如何使用以下公式将字符串提取到另一列 B 中: =MID(A2,FIND("代码:",A2,1),23)

...但我想在同一个单元格中执行此操作。我在 vba 中尝试了此代码,但不知道我做错了什么:

For Each cell In Range("A:A") cell.Value = Mid(.Value, InStr(1, .Value, "Code:"), 23) Next

【问题讨论】:

  • 为什么是 23 个字符而不是 14 ??
  • 除非您在for 循环之外使用With 块,否则一个可能的问题是您的.Value 引用没有到达您认为它们要去的地方。试试cell.Value = Mid(cell.Value, InStr(1, cell.Value, "Code:"), 23)
  • A 列的 EVERY 单元格中是否存在“代码:”? Instr 将返回 0 如果它不存在(我不敢相信你真的有 1048576 个单元格,其中包含字符串“代码:”)并且从字符位置 0 开始的 Mid 将失败。 (加上 PeterT 所说的!)
  • 啊,我明白了! A100 左右之后没有空白单元格.. 如何仅在非空白单元格上运行此公式?
  • 我把它改成了“cell.value”,还是不行。 mybe InStr 返回 0 是问题...

标签: vba excel


【解决方案1】:

您的代码中有两个主要错误:

  • 使用不带With 块的.Value 来定义它是哪个对象的Value(正如PeterT 在评论中指出的那样),并且
  • 试图处理 A 列中的每个单元格,其中许多(大多数?)根本不包含任何值,而且绝对不是您要查找的字符串。

重构代码:

Dim CodeExists As Long
'Only run the loop across cells that contain data:
For Each cell In Range("A1", Cells(Rows.Count, "A").End(xlUp))
    With cell
        CodeExists = InStr(1, .Value, "Code:")
        'Check that "Code:" exists
        If CodeExists > 0
            .Value = Mid(.Value, CodeExists, 23)
        End If
    End With
Next

而且,正如 Gary 的学生所问,您为什么使用 23? “代码:xxxx-xxxx-xxxx”的长度是 20 个字符,而不是 23 个,所以你抓取的字符比我想象的要多 3 个。

附:如果您甚至不想在最终结果中留下“代码:”,您可以将 Mid 语句更改为:

            .Value = Mid(.Value, CodeExists + 6, 14)

【讨论】:

  • 谢谢!这很好用!对于第 23 个问题,我不确定!这是反复试验。我也以为是20。但它只适用于 23!我也确实不想有“代码”,而您的解决方案效果很好!
猜你喜欢
  • 2015-12-31
  • 1970-01-01
  • 2019-01-15
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多