Excel 如何将单元格中每N个单词后的字符串拆分为行

Excel 如何将单元格中每N个单词后的字符串拆分为行,excel,vba,formula,user-defined-functions,Excel,Vba,Formula,User Defined Functions,你如何在每N个单词后拆分一个句子 大家好,, 在单元格B2中有一个长字符串,我想根据单元格D2中输入的可变字数将其拆分为行

你如何在每N个单词后拆分一个句子

大家好,, 在单元格B2中有一个长字符串,我想根据单元格D2中输入的可变字数将其拆分为行

<我的字符串在“B2”=“12345678910 111213141516171819……” "

我在“D2”中的变量是4

我第一行的结果是“一二三四”

到目前为止,我在“F3”中使用了这个公式:

第一行

我需要继续拆分字符串,以便最终结果为:

一二三四

五六七八

九一一一二

十三一四一五

161718

十九

上述结果行中的每一行

我不介意UDF或sub解决方案的类型。非常感谢您的帮助


在使用Davis的UDF后,这里有一个UDF可以为您完成这一任务

Public Function SplitOnNth(ByVal inputStr$, ByVal StartPos&, ByVal NumWords&) As String

    Dim arr() As String, i As Long, newArr() As String
    arr = Split(inputStr)
    ReDim newArr(NumWords - 1)

    'Arrays are zero-based, but your string isn't. Subtract 1
    For i = StartPos - 1 To StartPos + NumWords - 2
        If i > UBound(arr) Then Exit For    'Exit if you loop past the last word in string
        newArr(i - StartPos + 1) = arr(i)
    Next

    SplitOnNth = Join(newArr, " ")

End Function
这会将每个由空格分隔的单词放入一个单词数组中。它将在数组中循环以达到最大大小(
NumWords
参数),并输出字符串

此UDF需要3个参数:

  • inputStr
    (字符串):用于拆分的整个字符串
  • StartPos
    (Long):要以开头的第一个单词的编号。在您的情况下,
    1
    将以单词One
  • NumWords
    (Long):要包含在函数输出中的总字数,包括来自
    StartPos
    的字数
在示例中显示的第一行使用的公式如下所示:

=SplitOnNth($B$2, 1, 4)
-或-

这将导致以下输出:


这里有一个UDF,可以为您实现这一点

Public Function SplitOnNth(ByVal inputStr$, ByVal StartPos&, ByVal NumWords&) As String

    Dim arr() As String, i As Long, newArr() As String
    arr = Split(inputStr)
    ReDim newArr(NumWords - 1)

    'Arrays are zero-based, but your string isn't. Subtract 1
    For i = StartPos - 1 To StartPos + NumWords - 2
        If i > UBound(arr) Then Exit For    'Exit if you loop past the last word in string
        newArr(i - StartPos + 1) = arr(i)
    Next

    SplitOnNth = Join(newArr, " ")

End Function
这会将每个由空格分隔的单词放入一个单词数组中。它将在数组中循环以达到最大大小(
NumWords
参数),并输出字符串

此UDF需要3个参数:

  • inputStr
    (字符串):用于拆分的整个字符串
  • StartPos
    (Long):要以开头的第一个单词的编号。在您的情况下,
    1
    将以单词One
  • NumWords
    (Long):要包含在函数输出中的总字数,包括来自
    StartPos
    的字数
在示例中显示的第一行使用的公式如下所示:

=SplitOnNth($B$2, 1, 4)
-或-

这将导致以下输出:


非常感谢您的快速回复。UDF工作得很好,除了最后一行,剩下的用于拆分的总数少于4。我得到了价值!在我的第一篇博文之后,我对代码做了一些调整,而不是17个字,17个字是字符串中的最后一个字。你可能复制了旧的。您正在使用的文件是否包含行
,如果i>Ubound(arr),则退出以获取
?这条线就是为了这个目的而设计的。我的错误是我没有意识到这一变化。UDF运作完美。非常感谢,5星x2。使用相同的自定义项可以忽略括号之间的单词计数,但仍将它们打印在行中。所以如果我的字符串=“1234(1)5678910(2)111213141516171819(3)”;结果应与Davis的解决方案完全相同,每行/每行4个单词,如果有括号,则应将其作为额外内容包括在内。结果应该是:ROW1:1234 ROW2:(1)5678 ROW3:910(2)1112 --- ROW5:(3)十七(4),非常感谢您的快速响应。UDF工作得很好,除了最后一行,剩下的用于拆分的总数少于4。我得到了价值!在我的第一篇博文之后,我对代码做了一些调整,而不是17个字,17个字是字符串中的最后一个字。你可能复制了旧的。您正在使用的文件是否包含行
,如果i>Ubound(arr),则退出以获取
?这条线就是为了这个目的而设计的。我的错误是我没有意识到这一变化。UDF运作完美。非常感谢,5星x2。使用相同的自定义项可以忽略括号之间的单词计数,但仍将它们打印在行中。所以如果我的字符串=“1234(1)5678910(2)111213141516171819(3)”;结果应与Davis的解决方案完全相同,每行/每行4个单词,如果有括号,则应将其作为额外内容包括在内。结果应该是:ROW1:1234 ROW2:(1)5678 ROW3:910(2)1112 --- ROW5:(3)十七(4)