2015-09-06 100 views
0

我在每行的第一個單元格中有文本內容。它基本上是一個段落。我想把這個段落分成不同的單元格,在同一行。如何從單元格中提取文本字符串

定義:光合作用是植物和其他生物體用來將光能(通常是從太陽)轉換成化學能的一種過程,後來可以釋放出來用於燃燒生物體的活動。工作:在光合細菌中,收集光合作用的蛋白質被嵌入細胞膜中。在最簡單的形式中,這涉及圍繞細胞本身的膜。進化:早期的光合系統,例如那些來自綠色和紫色硫以及綠色和紫色無硫細菌的系統,被認爲是無氧的,使用各種分子作爲電子供體。

此內容存在於單元格a1中。我想把它分成3個細胞

單元格A2

「的定義:光合作用是使用植物和其他生物從太陽光能轉換,通常是一個過程,轉化爲化學能,可後來被釋放到爲生物體活動提供燃料。「

單元格A3

「工作:在光合細菌,該收集光進行光合作用的蛋白包埋在細胞膜中。在其最簡單的形式中,這涉及周圍細胞本身的膜」

細胞A4

「進化:早期光合系統,如那些從綠色和紫色硫和綠色和紫色非硫細菌,被認爲已經不產氧,使用各種分子作爲電子供體」

第一個單元格從文本繼續定義:----工作:(這包括文本「定義:」,不包括「工作:」) 第二個單元格從工作:------ - Evolution:(包括文字「Working:」,不包括「Evolution:」) Evolution的第三個單元格:------- endof string。

+0

只需添加到Siddarth的回答,您可以使用find()方法將返回您所使用的文本分隔關鍵字的位置。 –

+0

只是要注意搜索和查找之間的區別是,查找是區分大小寫的,這可能會或可能不會幫助... –

回答

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. 
2

使用FIND()MID()你應該能夠解析這個。

免責聲明:下面的解決方案假定你將永遠字符串「定義」,「工作」和「進化」要解析每個段落。

FIND返回基於從指定位置開始的字符的位置1

的數,在這種情況下,第一個字符,在A2使用以下公式:

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

這將搜索「工作:」並返回其位置。在這種情況下,字符編號爲206.由於它是#206字符,-1省略了返回工作中的「W」。我們希望以「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()函數中。 Exampple:=TRIM(MID(A1,FIND("Working:",A1,1),FIND("Evolution:",A1,1)-FIND("Working:",A1,1)))

Result of Parse

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打開或關閉,你可以砍掉一些代碼,但我認爲最好給你在碼。

+0

完美的工作。如果有更多的陣列,並且沒有特定的排列順序,我需要做出什麼樣的改變。 – Ahmed

+1

在這種情況下,我會將所有可能性放入DefNames數組中,並在分割字符串時循環使用,您可以循環lbound(DefNames)到ubound(DefNames)檢查每個字符串,這會給你正確的一個不分位置。如果您遇到困難,請回郵,我會爲您提供幫助。 –

+0

Split(MyString,「:」)我猜這就是因爲這裏唯一的分隔符是DefNames本身。 這個變得越來越複雜。 – Ahmed

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