将相关数据从Excel中的无序数据提取到相关列

我在excel的A列(单元格A2,A3,A4)中有以下方式的数据,

  1. 苹果223 12袋32胡萝卜4231 2321甜甜圈5231 232 1321大象6232
  2. 苹果3123213袋412321 3213胡萝卜411甜甜圈621 3213大象71 2321
  3. 苹果212324胡萝卜52312袋42313大象512312甜甜圈621 32132

我需要把这个数据拉到相关的列A,B,C,D,E。到现在已经能够拿出下面的解决scheme了。

  • 在第一行插入列标题A,B,C,D,E,Dummy(即B1,C1,D1,E1,F1,G1)
  • 将下面的公式放入行2,3,4上的相应单元格中

    =MID($A2,FIND(E$1,$A2)+LEN(E$1),IFERROR(FIND(F$1,$A2),LEN($A2)+1)-FIND(E$1,$A2)-LEN(E$1)) 

这适用于数据集1,2,其中数据是有序的,即A然后B然后C等等

但它不适用于数据集3,其中数据是无序的,即A然后C然后B然后E然后D ..如下所示。 任何build议表示赞赏 – 也开放给VBA解决scheme。 谢谢。

TexttoCols

我认为你的公式太复杂,因为你解决的问题…

在这里输入图像说明

单元格B2包含(填充和跨越)…

 =IF(ISERROR(FIND(B$1,$A2)),"",MID($A2,FIND(B$1,$A2)+2, 1)) 

这个解决scheme依赖于数字部分只有一个字符长的事实。

更新了修改的要求

在B2中使用这个公式(填满和跨越)…

 =IF(ISERROR(FIND(B$1,$A2)),"",MID($A2,FIND(B$1,$A2)+2, IF(ISERROR(FIND(" ",$A2,FIND(B$1,$A2)+2)-(FIND(B$1,$A2)+2)),LEN($A2),FIND(" ",$A2,FIND(B$1,$A2)+2)-(FIND(B$1,$A2)+2)))) 

…为了这个结果…

在这里输入图像说明

这个解决scheme依赖于列名(A,B等)和数字之间有空格,列名是单个字符。

更新了修改的要求

在B2中使用这个公式(填满和跨越)…

 =IF(ISERROR(FIND(B$1,$A2)),"",MID($A2,FIND(B$1,$A2)+LEN(B$1)+1, IF(ISERROR(FIND(" ",$A2,FIND(B$1,$A2)+LEN(B$1)+1)-(FIND(B$1,$A2)+LEN(B$1)+1)),LEN($A2),FIND(" ",$A2,FIND(B$1,$A2)+LEN(B$1)+1)-(FIND(B$1,$A2)+LEN(B$1)+1)))) 

为了这个结果…

在这里输入图像说明

更新了修改的要求

用户定义的function对于这个问题要简单得多。

以下VBA用户定义函数(UDF)…

 Function FindData(DataString As String, SearchString As String, AllSearchStrings As Range) As String Dim iLoop As Long, iTemp As Long, iStart As Long, iEnd As Long Dim oCell As Range ' Initialize FindData = "" If DataString = "" Then GoTo Done If SearchString = "" Then GoTo Done If AllSearchStrings.Cells.Count = 0 Then GoTo Done ' find where in the data string the data starts On Error Resume Next iStart = WorksheetFunction.Find(SearchString, DataString, 1) + Len(SearchString) + 1 On Error GoTo 0 If IsError(iStart) Or iStart = 0 Then GoTo Done ' find where in the data string the data ends iEnd = Len(DataString) + 1 For Each oCell In AllSearchStrings On Error Resume Next iTemp = WorksheetFunction.Find(oCell.Value, DataString, 1) On Error GoTo 0 If IsError(iTemp) Then iTemp = Len(DataString) + 1 Else If iTemp < iStart Then iTemp = Len(DataString) + 1 If iTemp < iEnd Then iEnd = iTemp End If Next oCell ' extract the string FindData = Trim(Mid(DataString, iStart, iEnd - iStart)) Done: End Function 

…在单元格B2中调用(填满整个)…

 =FindData($A2,B$1,$B$1:$G$1) 

…并得到这个结果…

在这里输入图像说明