如何从单元格中提取文本字符串

时间:2015-09-06 18:43:36

标签: excel-vba excel-formula vba excel

我在每行的第一个单元格中有文本内容。它基本上是一个段落。我想将此段拆分为同一行中的不同单元格。

定义:光合作用是植物和其他生物用来将光能(通常来自太阳)转化为化学能的过程,化学能可以在以后释放,为生物活动提供能量。工作:在光合细菌中,聚光用于光合作用的蛋白质嵌入细胞膜中。在其最简单的形式中,这涉及围绕细胞本身的膜。进化:早期的光合系统,例如来自绿色和紫色硫磺以及绿色和紫色非硫细菌的系统被认为是无氧的,使用各种分子作为电子供体。

此内容存在于单元格a1中。我想把它分成3个单元格

细胞a2

"定义:光合作用是植物和其他生物用来将光能(通常来自太阳)转化为化学能的过程,化学能可以在以后释放,为生物活动提供燃料。"

细胞a3

"工作:在光合细菌中,聚光用于光合作用的蛋白质嵌入细胞膜中。在其最简单的形式中,这涉及围绕细胞本身的膜。"

细胞a4

"进化:早期的光合作用系统,例如来自绿色和紫色硫磺以及绿色和紫色非硫细菌的系统被认为是无氧的,使用各种分子作为电子供体。"

第一个单元格从文本继续定义:----工作:(这包括文本"定义:"并且不包括"工作:") 第二个细胞继续工作:-------进化:(这包括文字"工作:"并且不包括"进化:") 来自Evolution的第三个单元:------- endof string。

4 个答案:

答案 0 :(得分:2)

使用FIND()MID(),你应该可以解析它。

免责声明:下面的解决方案假设您总是拥有字符串"定义","工作"和& #34;演进"在你要解析的每个段落中。

FIND根据从指定位置开始的角色位置返回一个数字,在本例中为第一个字符,1。

A2中使用此公式:

=LEFT(A1,FIND("Working:",A1,1)−1)

这会搜索"工作:"并返回其位置。在这种情况下,字符编号为206.-1省略了" W"因为它是角色#206而被归还。我们希望在" W"。

之前结束角色

A3中使用此公式:

=MID(A1,FIND("Working:",A1,1),FIND("Evolution:",A1,1)-FIND("Working:",A1,1))

现在我们正在寻找一个开始和结束角色的位置。我们必须使用减法来获得字符串长度。

A4中使用此公式:

=MID(A1,FIND("Evolution:",A1,1),FIND("Working:",A1,1))

中间需要一个开始和结束字符位置。

奖励:要消除开头或结尾处的任何额外空白,请将公式包装在TRIM()函数中。例如:=TRIM(MID(A1,FIND("Working:",A1,1),FIND("Evolution:",A1,1)-FIND("Working:",A1,1)))

Result of Parse

答案 1 :(得分:2)

由于您将此标记为Excel-vba,我还以为我会为您发布VBA解决方案。这个UDF有望满足您的需求。

Function SplitString(MyString As String, PartNum As Long)
Dim MyNewString As String, DefNames As Variant, DefNamesOn As Boolean
DefNamesOn = True
DefNames = Array("Definition: ", "Working: ", "Evolution: ")
MyNewString = Split(MyString, ":")(PartNum)
If DefNamesOn Then
    SplitString = DefNames(PartNum - 1)
Else
    SplitString = ""
End If
If Right(UCase(MyNewString), 8) = " WORKING" Then
    SplitString = SplitString & Trim(Left(MyNewString, Len(MyNewString) - 8))
ElseIf Right(UCase(MyNewString), 10) = " EVOLUTION" Then
    SplitString = SplitString & Trim(Left(MyNewString, Len(MyNewString) - 10))
Else
    SplitString = SplitString & Trim(MyNewString)
End If
End Function

如果您不想在开始时DefNamesOn = TrueFalse"Definition: ",则可以将"Working: "更改为"Evolution: "

像任何其他公式一样使用它:= SplitString(A1,1)其中A1包含您的字符串,1是您想要的部分编号(1,2或3)

如果你总是想要打开或关闭DefNames,你可以从代码中删掉一点但是我认为最好在代码中给你选项。

答案 2 :(得分:2)

另一个VBA解决方案:

Option Explicit

Public Sub extractPara()
    Dim lRow As Long, ur As Variant, arr As Variant
    Dim i As Long, j As Long, x2 As Long, x3 As Long

    With ActiveSheet
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row: j = 1
        ur = .Range("A1:A" & lRow).Value2
        arr = .Range("A1:A" & lRow * 4).Value2
        For i = 1 To lRow
            x2 = InStr(1, ur(i, 1), "Working:", vbBinaryCompare)
            x3 = InStr(1, ur(i, 1), "Evolution:", vbBinaryCompare)
            arr(j + 0, 1) = ur(i, 1)
            arr(j + 1, 1) = Left(ur(i, 1), x2)
            arr(j + 2, 1) = Mid(ur(i, 1), x2, x3)
            arr(j + 3, 1) = Mid(ur(i, 1), x3)
            j = j + 4
        Next
        .Range("A1:A" & lRow * 4) = arr
    End With
End Sub

答案 3 :(得分:0)

谷歌搜索了很多关于这一点。 有一些对我有用的东西。

=MID(A1,SEARCH("Definition:",A1),SEARCH("Working:",A1)-SEARCH("Definition:",A1))

这让我得到了细胞a2的结果

Working: In photosynthetic bacteria, the proteins that gather light for photosynthesis are embedded in cell membranes. In its simplest form, this involves the membrane surrounding the cell itself.