提取字符之间的数字并sorting

嘿,我正在考虑解决我的问题几个小时了。 我也search了networking,并能够find一些方法,但没有一个为我的问题工作。

我有一个单元格,其数据如下所示:

(Monday@100%[00:00-24:00]);(Tuesday@100%[00:00-24:00]);(Wednesday@100%[00:00-24:00]);(Thursday@100%[00:00-24:00]);(Friday@100%[00:00-24:00]);(Saturday@100%[00:00-24:00]);(Sunday@100%[00:00-24:00]) 

问题是,这个string是不一致的。 它也可能是这样的:

 (Monday@125%[00:00-04:00]);(Monday@90%[04:00-08:00]);(Monday@90%[08:00-12:00]);(Monday@115%[12:00-16:00]);(Monday@120%[16:00-20:00]);(Monday@115%[20:00-24:00]);(Tuesday@125%[00:00-04:00]);(Tuesday@90%[04:00-08:00]);(Tuesday@90%[08:00-12:00]);(Tuesday@115%[12:00-16:00]);(Tuesday@120%[16:00-20:00]);(Tuesday@115%[20:00-24:00]);(Wednesday@125%[00:00-04:00]);(Wednesday@90%[04:00-08:00]);(Wednesday@90%[08:00-12:00]);(Wednesday@115%[12:00-16:00]);(Wednesday@120%[16:00-20:00]);(Wednesday@115%[20:00-24:00]);(Thursday@125%[00:00-04:00]);(Thursday@90%[04:00-08:00]);(Thursday@90%[08:00-12:00]);(Thursday@115%[12:00-16:00]);(Thursday@120%[16:00-20:00]);(Thursday@115%[20:00-24:00]);(Friday@125%[00:00-04:00]);(Friday@90%[04:00-08:00]);(Friday@90%[08:00-12:00]);(Friday@115%[12:00-16:00]);(Friday@120%[16:00-20:00]);(Friday@115%[20:00-24:00]);(Saturday@125%[00:00-04:00]);(Saturday@90%[04:00-08:00]);(Saturday@90%[08:00-12:00]);(Saturday@115%[12:00-16:00]);(Saturday@120%[16:00-20:00]);(Saturday@115%[20:00-24:00]);(Sunday@125%[00:00-04:00]);(Sunday@90%[04:00-08:00]);(Sunday@90%[08:00-12:00]);(Sunday@115%[12:00-16:00]);(Sunday@120%[16:00-20:00]);(Sunday@115%[20:00-24:00]) 

string的结构是

  • 你有一个星期的一天,然后是“@”
  • at (@)之后,你有一个可以在0到999之间的数字
  • 之后,你有一天的时间括号[]
  • 你可以有一天6个不同的时间框架(不多,但less一些)
  • 每个时间框架集群被隔开; 并在正常括号内()

所以这是我的起始位置。 我想要的是提取@和%之间的数字,并按时间顺序(星期一至星期日,一天中的几小时)列出它们。

我可以用这个公式提取一周中每一天的@和%之间的数字

 =MID(B3;SEARCH("Monday@";B3)+7;SEARCH("%";B3)-SEARCH("Monday@";B3)-7) 

但是这只有在每周的每一天都被提及的情况下才有效。

当我每天有更多的时间框架时,我不知道如何才能使它工作。 感谢任何帮助。

谢谢,

拉蒙

你可以使用excel的Text-to-Columnsfunction,以)作为分隔符。 比转置列成行来得到这样的东西:

 (Monday@125%[00:00-04:00] ;(Monday@90%[04:00-08:00] ;(Monday@90%[08:00-12:00] ;(Monday@115%[12:00-16:00] ;(Monday@120%[16:00-20:00] ... ;(Sunday@115%[20:00-24:00] 

然后应用公式。

编辑:

只需使用FindMid即可实现此function: 在这里输入图像说明

find和mid后面的想法总是一样的。
防爆。 find( is =FIND("(";[Text])
防爆。 =MID([Text];[@[Pos(]]+1;[@[Pos'@]]-[@[Pos(]]-1)

尝试一组迭代search,其中下一个search从前一个结果find的位置开始。 即:

在单元格B6中put =SEARCH("]",$B$3,B5+1)

单元格C6 put =MID($B$3,SEARCH("(",$B$3,B5+1)+1,SEARCH("@",$B$3,B5+1)-SEARCH("(",$B$3,B5+1)-1)

在单元格D6中=MID($B$3,SEARCH("[",$B$3,B5+1)+1,SEARCH("]",$B$3,B5+1)-SEARCH("[",$B$3,B5+1)-1)

在单元格E6中put =MID($B$3,SEARCH("@",$B$3,B5+1)+1,SEARCH("%",$B$3,B5+1)-SEARCH("@",$B$3,B5+1)-1)

(请注意,B5需要为空(或0)才能正确启动)

然后,您可以尽可能地填写每个学期。 如果他们没有秩序,那么你可以在D列订购,然后C(当天的时间)。

这可能会让你开始。

 Sub Extractor() Dim data() As String, i As Integer, rw As Integer rw = 3 data = Split(Range("A1"), ";") For i = 0 To UBound(data) Range("A" & rw) = VBA.Mid$(data(i), 2, InStr(1, data(i), "@") - 2) 'Day Range("B" & rw) = VBA.Mid$(data(i), InStr(1, data(i), "@") + 1, InStr(1, data(i), "%") - InStr(1, data(i), "@") - 1) '% number Range("C" & rw) = VBA.Mid$(data(i), InStr(1, data(i), "[") + 1, InStr(1, data(i), "]") - InStr(1, data(i), "[") - 1) 'Time rw = rw + 1 Next i End Sub 

笔记:

  1. 假设你的string在A1
  2. row 3开始,将数据打印在列A,B和C中