在Excel 2010中,如何使用宏删除单元格中的字符串的一部分?

时间:2012-10-11 17:28:02

标签: string excel-vba split excel-2010 vba

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

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

  1. 我想保留A栏原样。
  2. 为Deliverables创建一个B列,需要从Col A中的单元格中提取
  3. 同样,为工作产品创建一个C列,需要从Col A中的单元格中提取
  4. 让我举个例子:

    假设单元格A1包含

    DEL1: DEL 1 Project Process, DEL2: DEL 2 Project Schedule, WKP1: WKP 1 Work Product Document

    这就是我想要Cell B1的样子:

    DEL1: DEL 1 Project Process, DEL2: DEL 2 Project Schedule

    Cell C1看起来像这样:

    WKP1: WKP1 Work Product Document

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

    鉴于Deliverables和Work Products的名称长度不同,我不能简单地复制Col A并运行TextToColumn以便拆分它。

    到目前为止,我提出的方法是将Col A复制到Col B,保留Deliverables并尝试删除Work Products。

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

    虽然我能够写一个宏,但是可以在每个单元格范围内找到文本“WKP”并删除它,我无法删除它之后的内容。换句话说,我只能为Cell B1产生这个:

    DEL1: DEL 1 Project Process, DEL2: DEL 2 Project Schedule, 1: 1 Work Product Document

    有人可以帮我写宏来做这件事吗?如果语法也被解释,我将不胜感激。

    谢谢!

2 个答案:

答案 0 :(得分:1)

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

这是非vba解决方案:

假设数据是A列,请将此公式放在B1

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

这在C1

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

然后向下拖。

答案 1 :(得分:0)

这应该可以胜任。使用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