首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从单元格中提取文本字符串

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

Stack Overflow用户
提问于 2015-09-07 02:43:36
回答 4查看 389关注 0票数 0

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

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

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

单元格a2

定义:光合作用是植物和其他有机体将通常来自太阳的光能转化为化学能的过程,这些光能稍后可以释放出来,为生物体的活动提供动力。

单元格a3

工作:在光合作用的细菌中,为光合作用收集光线的蛋白质嵌入细胞膜。最简单的形式是围绕细胞本身的细胞膜。

单元格a4

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

第一个单元格来自文本定义:- Working:(这包括文本" Definition:“,不包括" Working:")第二个单元格来自Working:-演进:(这包括文本"Working:”,不包括“includes:”)第三个单元格,来自does:- endof字符串。

EN

回答 4

Stack Overflow用户

发布于 2015-09-07 05:55:05

使用FIND()MID(),您应该能够解析它。

免责声明:下面的解决方案假设您希望解析的每个段落中始终包含字符串"Definition“、"Working”和“”。

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

A2中使用以下公式:

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

这将搜索"Working:“并返回其位置。在这种情况下,字符号206。-1省略W中的"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)))

票数 2
EN

Stack Overflow用户

发布于 2015-09-07 06:25:02

因为您将其标记为Excel-vba,所以我想我应该为您发布一个VBA解决方案。这个UDF有望满足您的需求。

代码语言:javascript
复制
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

如果开始时不需要"Definition: ""Working: ""Evolution: ",可以将DefNamesOn = True更改为"Evolution: "

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-09-07 06:38:07

另一个VBA解决方案:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32427010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档