使用Mid和Excel中的Find(VBA)提取子字符串并更改单元格值

使用Mid和Excel中的Find(VBA)提取子字符串并更改单元格值,vba,excel,Vba,Excel,我想循环遍历一列并在每个单元格中提取一个子字符串(在我的示例中,是“代码:”) 我想循环遍历每个单元格,并在适当的位置运行公式。基本上删除列的每个单元格中的所有内容,除了代码 我知道如何使用以下公式将字符串提取到另一列B中: =中间(A2,查找(“代码:”,A2,1),23) …但我想在同一个单元格中执行此操作。我在vba中尝试了此代码,但不知道我做错了什么: 范围内每个单元格的(“A:A”) 单元格.Value=Mid(.Value,InStr(1,.Value,“Code:”),23) 接

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

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

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

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

范围内每个单元格的
(“A:A”)
单元格.Value=Mid(.Value,InStr(1,.Value,“Code:”),23)

接下来,代码中有两个主要错误:

  • 使用
    .Value
    而不使用
    With
    块来定义它是哪个对象的
    值(正如彼得在评论中指出的),以及
  • 尝试处理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

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

另外,如果您甚至不希望“代码:”留在最终结果中,您可以将Mid语句更改为:

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

为什么是23个字符而不是14个字符?除非在
for
循环的
之外使用
块,否则一个可能的问题是
.Value
引用没有到达您认为它们要去的地方。尝试
cell.Value=Mid(cell.Value,InStr(1,cell.Value,“code:”),23)
列A中的每个单元格中是否都存在“code:”
Instr
如果不存在将返回0(我不敢相信您真的有1048576个单元格,其中包含字符串“code:”),并且从字符位置0开始的
Mid
将失败。(加上皮特说的!)啊,我明白了!!不,大约100后有空白单元格。。如何在非空白单元格上运行此公式?我将其更改为“cell.value”,但仍然不起作用。mybe仪器返回0是问题所在…谢谢!这太棒了!对于23个问题,我不确定!这是反复试验。我还以为是20块呢。但它只对23人有效!我也不想有“代码”,你的解决方案工作得很好!!