提取字符之间的数字并对它们进行排序

时间:2016-12-12 14:55:57

标签: excel excel-vba excel-formula vba

嘿,我正在考虑解决几个小时的问题。我也搜索过网络,并且能够找到一些方法但是没有一个方法可以解决我的问题。

我有一个包含如下数据的单元格:

(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])

问题是,这个字符串不一致。它也可能看起来像这样:

(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])

字符串的结构是

  • 您有一周中的某一天,然后是“@”
  • at(@)之后,您的号码可以介于0到999之间
  • 之后你在括号[]
  • 中有一天的时间
  • 一天内最多可以有6个不同的时间范围(不多于,但更少)
  • 每个时间帧簇被分开;并在正常括号内()

所以这是我的首发位置。我想要的是提取@和%之间的数字并按时间顺序列出它们(周一到周日,一天中的几个小时)。

我能够使用此公式

提取一周中每一天的@和%之间的数字
=MID(B3;SEARCH("Monday@";B3)+7;SEARCH("%";B3)-SEARCH("Monday@";B3)-7)

但这仅适用于每周的每一天只提及的情况。

我不知道如何在每天有更多的时间框架时让它工作。感谢任何帮助。

谢谢,

Ramon的

3 个答案:

答案 0 :(得分:2)

尝试一组迭代搜索,其中下一个搜索从找到的上一个结果的位置开始。即:

单元格B6中的

=SEARCH("]",$B$3,B5+1)

单元格C6中的

=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中的

=MID($B$3,SEARCH("@",$B$3,B5+1)+1,SEARCH("%",$B$3,B5+1)-SEARCH("@",$B$3,B5+1)-1)

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

然后,您可以根据需要填写每个学期。如果它们出现故障,那么您可以在D列然后是C(当天的时间)订购。

答案 1 :(得分:2)

这可能会让你开始。

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. 假设您的字符串位于A1
  2. row 3
  3. 开始,在A,B和C列中打印数据

答案 2 :(得分:1)

您可以使用excel的文本到列功能,并使用import java.sql.*; import java.io.*; import java.util.*; public class test1 { public static void main(String[] argv) throws Exception { try { Connection con = DriverManager.getConnection( "jdbc:postgresql://localhost:5432/old","user","pass"); Connection con1 = DriverManager.getConnection( "jdbc:postgresql://localhost:5432/new","user","pass"); String sql = "INSERT INTO users("+ "name,"+ "active,"+ "login,"+ "password)"+ "VALUES(?,?,?,?)"; Statement statement = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); PreparedStatement pstmt = con1.prepareStatement(sql); ResultSet rs = statement.executeQuery("SELECT * FROM users"); while ( rs.next() ) { String nm = rs.getString(2); Boolean ac = rs.getBoolean(3); String log = rs.getString(4); String pass = rs.getString(5); pstmt.setString(1, nm); pstmt.setBoolean(2, ac); pstmt.setString(3, log); pstmt.setString(4, pass); pstmt.executeUpdate(); } con.close(); con1.close(); } catch (SQLException e) { System.out.println("could not get JDBC connection: " +e); } } } 作为分隔符。然后将列转换为行以获得如下内容:

)

然后应用公式。

修改:

只使用(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即可实现此目的: enter image description here

find和mid背后的想法总是一样的。
防爆。查找Mid的内容为( 防爆。用于提取=FIND("(";[Text])的是Day