提取字符之间的数字并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]
然后应用公式。
编辑:
只需使用Find
和Mid
即可实现此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
笔记:
- 假设你的string在
A1
- 从
row 3
开始,将数据打印在列A,B和C中