String VBA按空格分割字符串

String VBA按空格分割字符串,string,excel,vba,split,String,Excel,Vba,Split,我想要excel中的一个函数,我可以调用它并将单元格传递给它。输入: Firstname Lastname email@mail.com Firstname midname Lastname email@mail.com 中间的空格数是随机的。输出应该只是一个数组。数组可以有任何长度,因为我不知道字符串是什么样子。输出应为: Firstname, Lastname, email@mail.com Firstna

我想要excel中的一个函数,我可以调用它并将单元格传递给它。输入:

Firstname          Lastname      email@mail.com       
Firstname      midname     Lastname      email@mail.com
中间的空格数是随机的。输出应该只是一个数组。数组可以有任何长度,因为我不知道字符串是什么样子。输出应为:

Firstname, Lastname, email@mail.com       
Firstname, midname, Lastname, email@mail.com
我将从一个单元格调用该函数,如
=MySplitFunction(A1)
,这应该将Firstname放在A1中,Lastname放在B1中,然后email@mail.com在C1中。我创建了一个新模块,并尝试了以下代码:

Function MySplitFunction(s As String) As String()
    MySplitFunction = Split(s, " ")
End Function
这给了我输出

Firstname
如何让它返回整个数组?甚至可以在一个单元格中编写一个函数,将内容放在靠近它的单元格中吗

编辑:

  • 在A1中输入数据
  • 选择B1:D1范围
  • 输入您的公式
    =MySplitFunction(A1)
  • 按CTRL+SHIFT+ENTER键,而不是按ENTER键,使其成为数组公式
要删除多个空格,您可以这样修改代码(效率不高,但有效):


另一种解决办法是:

  • 使用正则表达式作为删除所有空格的第一步
  • 基于单个左空格的第一步分割结果
  • 此外,由于需要在不同的单元格中返回不同的文本元素,所以附加函数参数将解决这一问题 这是拟议的职能:

    Public Function MySplitFunction(sMark As String, nTh As Integer) As String
    
    On Error GoTo EH
        'regexp declaration
        Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
    
        Dim tmpTXT As String
        Dim tmpArr As Variant
        With objRegExp
            .Global = True
            .Pattern = "\s+"
    
            tmpTXT = .Replace(sMark, " ")
        End With
    
        tmpArr = Split(tmpTXT, " ")
        MySplitFunction = tmpArr(nTh - 1)
    
    Exit Function
    EH:
        MySplitFunction = ""
    
    End Function
    
    这是屏幕截图,展示了它的工作原理:


    重要在Excel中调用函数时,使用逗号分隔参数(由于我使用的是本地国家版本的Excel,因此不使用分号)。

    这种方法很有效,但是我没有去掉所有多余的空格。有什么想法吗?我想我想用一个空格替换所有的多个空格,然后在上面运行Split(s,“”)。想法?我确实让它工作了,但我必须在当前替换行下面添加`s=Replace(s,Chr(160),“”),因为它包含所谓的“非中断空间”。我编辑了答案,将其包括在内。非常感谢你的帮助!我输入的公式和你在B2中输入的完全一样,但我得到错误“你不能更改数组的一部分”。我在回答末尾的最后一句话中提到的逗号和分号呢?检查原始帖子的编辑。我想我不应该用逗号。我通常都用分号。你说得对,分号适合你。1.对错误…行进行临时注释,并给出我的反馈,哪一行是代码中的错误。2.回答您的其他问题(来自版本)-您可以改进此函数,使其成为数组函数,然后使用Ctrl+Shift+Enter in excel调用它。+1关于regexp的好主意。向模式中添加
    CHAR(160)
    组件也是一个好主意。
    Public Function MySplitFunction(sMark As String, nTh As Integer) As String
    
    On Error GoTo EH
        'regexp declaration
        Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
    
        Dim tmpTXT As String
        Dim tmpArr As Variant
        With objRegExp
            .Global = True
            .Pattern = "\s+"
    
            tmpTXT = .Replace(sMark, " ")
        End With
    
        tmpArr = Split(tmpTXT, " ")
        MySplitFunction = tmpArr(nTh - 1)
    
    Exit Function
    EH:
        MySplitFunction = ""
    
    End Function