【问题标题】:In Excel 2010, how to delete a portion of a string within a cell using a Macro?在 Excel 2010 中,如何使用宏删除单元格中的部分字符串?
【发布时间】:2012-10-11 17:28:01
【问题描述】:

我正在尝试为一个 Excel 文件创建一个宏,该文件有一列(我们称之为 A 列)单元格,每个单元格包含 4 到 5 个项目可交付成果和工作产品,以逗号分隔,并由可交付成果标签为“DEL”,工作产品标签为“WKP”。

我希望通过宏来完成以下任务:

  1. 我想保持 A 列不变。
  2. 为 Deliverables 创建 B 列,需要从 Col A 的单元格中提取该列
  3. 同样,为工作产品创建一个 C 列,该列需要从 A 列的单元格中提取

我举个例子:

假设单元格 A1 包含

DEL1:DEL 1 项目流程,DEL2:DEL 2 项目进度表,WKP1:WKP 1 工作产品文档

这是我希望单元格 B1 的样子:

DEL1:DEL 1 项目流程,DEL2:DEL 2 项目进度表

单元格 C1 看起来像这样:

WKP1:WKP1 工作产品文档

请注意,并非 Col A 中的所有单元格的字符长度都与 Cell A1 完全相同。但它们将包含 DEL 和 WKP。

鉴于可交付成果和工作产品的名称长度不同,我不能简单地复制 Col A 并运行 TextToColumn 来拆分它。

到目前为止,我想出的方法是将 Col A 复制到 Col B,保留可交付成果并尝试删除工作产品。

如您所见,这需要删除字符串中以“WKP”前面的逗号 (",") 和空格 (" ") 开头并以相关工作产品的最后一个字符结尾的部分(在这种情况下,这将是整个字符串本身的最后一个字符,因为似乎在 DEL 之后就提到了 WKP)。

虽然我可以编写一个宏,可以在每个单元格范围内找到文本“WKP”并将其删除,但我无法删除紧随其后的内容。换句话说,我只能为 Cell B1 制作这个:

DEL1:DEL 1 项目流程,DEL2:DEL 2 项目进度表,1:1 工作产品文档

有人可以帮我编写宏来做到这一点吗?如果还解释了语法,我将不胜感激。

谢谢!

【问题讨论】:

  • 尝试使用 A 列上的“文本到列”功能来拆分逗号处的内容。然后你就可以使用 5 个单独的列,这应该会容易得多。

标签: string excel split excel-2010 vba


【解决方案1】:

如果数据的布局使得DEL(可交付成果)始终列在WKP(工作产品)之前,则不需要VBA。

这里是非 vba 的解决方案:

假设数据是A列,把这个公式放在B1

=LEFT(A1,FIND(", WKP1",A1)-1)

这在 C1 中

=RIGHT(A1,LEN(A1)-FIND(", WKP1",A1)-1)

然后向下拖动。

【讨论】:

  • 感谢 Scott,我会在尝试 VBA 之前尝试一下。是的,DEL 总是列在 WKP 之前。两个函数中的“-1”是什么意思?
  • 还有一个问题,如果 Col A 中的一个单元格没有 WKP 而只有 DEL,该怎么办。当我尝试 LEFT(A1,FIND(..) 时,我收到“#VALUE”错误。然后,我尝试在其中创建一个带有 FIND 的 IF 语句,但它不起作用。
  • @user1738868 -1 -> 只是从, WKP 开始的地方减去1,以免留下任何悬空spacescommas。您可以将“,WKP1”更改为“WKP1”并删除我认为的-1,或类似的东西。 Re: Errors-> 如果您使用的是 XL2007 或更高版本,则可以将公式包装在 IFERROR 语句中。如果在 2003 年你可以写 =IF(ISERROR(formula,"",formula)
【解决方案2】:

这应该可以完成工作。在 B1 中使用 =WKP_DEL(A1,"DEL") 和在 C1 中使用 =WKP_DEL(A1,"WKP") 调用它。

Function WKP_DEL(str As String, DelOrWkp As String) As String

Dim V() As String
Dim SubStr As Variant
Dim WKPs As String
Dim DELs As String
    WKP_DEL = ""
    ' Split the string into an array
    V = Split(str, ",")
    ' Loop through the array adding WKPs to the WKPs string and DELs to the DELs string
    For Each SubStr In V
        If InStr(SubStr, "WKP") > 0 Then
            WKPs = WKPs & Trim(SubStr) & ", "
        End If
        If InStr(SubStr, "DEL") > 0 Then
            DELs = DELs & Trim(SubStr) & ", "
        End If
    Next
    ' Remove the trailing ", " and return the required string
    If DelOrWkp = "DEL" Then WKP_DEL = Left(DELs, Len(DELs) - 2)
    If DelOrWkp = "WKP" Then WKP_DEL = Left(WKPs, Len(WKPs) - 2)
End Function

【讨论】:

  • 嗨,杰米,我非常感谢你。通过实际查看此代码并对其进行修改以提取原始单元格中的其他项目,我学到了很多东西。您知道如何在函数本身中添加函数和参数描述吗?我知道如果我创建一个单独的子文件有办法做到这一点,但我更喜欢将它放在函数本身中。
  • 我不确定我理解你所说的函​​数和参数描述是什么意思。你能澄清一下吗?
猜你喜欢
  • 1970-01-01
  • 2013-07-13
  • 2016-09-09
  • 2017-03-08
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多