String 在Excel中提取字符串的一部分

String 在Excel中提取字符串的一部分,string,excel,vba,shift,ctrl,enter,String,Excel,Vba,Shift,Ctrl,Enter,我有一根这样的绳子 东京5号的汽车将于33:53:03抵达。13:56:39 来自奥地利的汽车将于33:53:07抵达。13:56:43 来自印度的汽车将于33:53:03抵达。13:56:39 在excel的同一单元格中 我需要在13:56:39在13:56:43 13:56:39在单独的单元格中显示字符串的这些部分 请帮助如果您的数据是在一列中,我认为使用变量数组的Regexp是有意义的 但作为一个更灵活的选项,您可以使用以下UDF作为数组输入的公式来拆分字符串 如果您的字符串是A1,并且您

我有一根这样的绳子

东京5号的汽车将于33:53:03抵达。13:56:39 来自奥地利的汽车将于33:53:07抵达。13:56:43 来自印度的汽车将于33:53:03抵达。13:56:39

在excel的同一单元格中

我需要在13:56:39在13:56:43 13:56:39在单独的单元格中显示字符串的这些部分


请帮助

如果您的数据是在一列中,我认为使用变量数组的Regexp是有意义的

但作为一个更灵活的选项,您可以使用以下UDF作为数组输入的公式来拆分字符串

如果您的字符串是A1,并且您希望最多有5个匹配项

选择B1:F1 在公式栏中添加=1 挤在一起 额外的非匹配项将不适用

代码

更新以处理单个匹配


如果您的数据是在一列中,我认为带有变量数组的Regexp是有意义的

但作为一个更灵活的选项,您可以使用以下UDF作为数组输入的公式来拆分字符串

如果您的字符串是A1,并且您希望最多有5个匹配项

选择B1:F1 在公式栏中添加=1 挤在一起 额外的非匹配项将不适用

代码

更新以处理单个匹配


我将采用不同的方法,使用公式:

B列使用以下公式:

B1=IFERROR(SEARCH("at ??:??:??",A$1,1),"")
B2=IFERROR(SEARCH("at ??:??:??",A$1,B1+11),"")
C1=IFERROR(PART(A$1,B1,11),"")
C列使用以下公式:

B1=IFERROR(SEARCH("at ??:??:??",A$1,1),"")
B2=IFERROR(SEARCH("at ??:??:??",A$1,B1+11),"")
C1=IFERROR(PART(A$1,B1,11),"")

这些方法适用于大量事件。

我会采用不同的方法,使用以下公式:

B列使用以下公式:

B1=IFERROR(SEARCH("at ??:??:??",A$1,1),"")
B2=IFERROR(SEARCH("at ??:??:??",A$1,B1+11),"")
C1=IFERROR(PART(A$1,B1,11),"")
C列使用以下公式:

B1=IFERROR(SEARCH("at ??:??:??",A$1,1),"")
B2=IFERROR(SEARCH("at ??:??:??",A$1,B1+11),"")
C1=IFERROR(PART(A$1,B1,11),"")

这些方法适用于大量发生的情况。

向下和脏字符串操作:

Option Explicit

Sub Test()
    Dim cellValue As String
    Dim newCellArray() As String
    Dim valueYouWant As String
    Dim cellCounter As Integer
    Dim x As Integer
    Dim myRange As Range
    Const SEPERATOR_VALUE = "at "
    Const ASCII_A = 65

    For cellCounter = 1 To 10 '10 represents the last row...there are ways to set this dynamically if needed

        cellValue = Sheet1.Range("A" & cellCounter)
        newCellArray = Split(cellValue, "at ")

        'Array is zero-based, but we want to start at first split value
        For x = 1 To UBound(newCellArray)
            valueYouWant = Trim$(Left$(newCellArray(x), InStr(1, newCellArray(x), " "))) 'You could prefix this with "at " if you really needed it
            Sheet1.Range(Chr$(ASCII_A + x) & cellCounter).Value = valueYouWant
        Next x
    Next cellCounter

End Sub

向下和脏字符串操作:

Option Explicit

Sub Test()
    Dim cellValue As String
    Dim newCellArray() As String
    Dim valueYouWant As String
    Dim cellCounter As Integer
    Dim x As Integer
    Dim myRange As Range
    Const SEPERATOR_VALUE = "at "
    Const ASCII_A = 65

    For cellCounter = 1 To 10 '10 represents the last row...there are ways to set this dynamically if needed

        cellValue = Sheet1.Range("A" & cellCounter)
        newCellArray = Split(cellValue, "at ")

        'Array is zero-based, but we want to start at first split value
        For x = 1 To UBound(newCellArray)
            valueYouWant = Trim$(Left$(newCellArray(x), InStr(1, newCellArray(x), " "))) 'You could prefix this with "at " if you really needed it
            Sheet1.Range(Chr$(ASCII_A + x) & cellCounter).Value = valueYouWant
        Next x
    Next cellCounter

End Sub

整个字符串是否在单个单元格中?或者有三个单元格,每个单元格都有以汽车开头的文本?不,整个文本都在同一个单元格中,我需要每个单元格中的时间。时间周围的文本总是相同的,还是不同?如果它变化,以哪种方式?每个单元格中总是有三次吗?还有更多吗?是否可以减少?它保持不变,对于时间的每个实例,都有一个at/b/b表示空间,就像在C中一样,在单个单元格中的整个字符串之前?或者有三个单元格,每个单元格都有以汽车开头的文本?不,整个文本都在同一个单元格中,我需要每个单元格中的时间。时间周围的文本总是相同的,还是不同?如果它变化,以哪种方式?每个单元格中总是有三次吗?还有更多吗?可以少一些吗?它保持不变,对于时间的每个实例,都有一个at/b/b表示空间,就像前面的C一样