Vba 如何将Excel公式转换为自定义项?

Vba 如何将Excel公式转换为自定义项?,vba,excel,user-defined-functions,udf,Vba,Excel,User Defined Functions,Udf,我有一个公式,可以在格式为“Smith,John”的单元格中交换姓氏和名字 我创建了一个函数来利用这个功能,一开始它似乎可以工作。功能是: 函数SwapNames(文本作为字符串)作为字符串 SwapNames=Mid(text&&&text,(Find(“,text)-1,(Len(text)-1)) 结束功能 我将工作簿转换为外接程序文件类型,以便全局使用它,现在它显示“查找”函数未定义。我在这里做错了什么?正如@Nathan_Sav所说-使用split,或者使用可选参数来标识分隔符 因此=

我有一个公式,可以在格式为“Smith,John”的单元格中交换姓氏和名字

我创建了一个函数来利用这个功能,一开始它似乎可以工作。功能是:

函数SwapNames(文本作为字符串)作为字符串
SwapNames=Mid(text&&&text,(Find(“,text)-1,(Len(text)-1))
结束功能


我将工作簿转换为外接程序文件类型,以便全局使用它,现在它显示“查找”函数未定义。我在这里做错了什么?

正如@Nathan_Sav所说-使用split,或者使用可选参数来标识分隔符

因此
=swapnames(“Bartrup-Cook-Darren”)
返回“Darren-Bartrup-Cook”和
=swapnames(“Bartrup-Cook-Darren”,“-”)
返回“Cook-Darren-Bartrup”如果字符串中不存在分隔符,将返回一个
\REF!
错误

Function SwapNames(text As String, Optional Delimiter As String = " ") As Variant

    Dim SplitAt As Long
    Dim NamePart As Variant

    SplitAt = InStr(text, Delimiter)

    If SplitAt = 0 Then
        SwapNames = CVErr(xlErrRef)
    Else
        NamePart = Split(text, Delimiter)

        SwapNames = NamePart(1) & " " & NamePart(0)
    End If

End Function

正如@Nathan_Sav所说的-使用split,也许还有一个可选参数来标识分隔符

因此
=swapnames(“Bartrup-Cook-Darren”)
返回“Darren-Bartrup-Cook”和
=swapnames(“Bartrup-Cook-Darren”,“-”)
返回“Cook-Darren-Bartrup”如果字符串中不存在分隔符,将返回一个
\REF!
错误

Function SwapNames(text As String, Optional Delimiter As String = " ") As Variant

    Dim SplitAt As Long
    Dim NamePart As Variant

    SplitAt = InStr(text, Delimiter)

    If SplitAt = 0 Then
        SwapNames = CVErr(xlErrRef)
    Else
        NamePart = Split(text, Delimiter)

        SwapNames = NamePart(1) & " " & NamePart(0)
    End If

End Function
这就是如何使用函数和交换名称

Function SwapNames(text As String) As String
    SwapNames = Trim(Split(text, ",")(1)) & " " & Trim(Split(text, ",")(0))
End Function
因此,它会将
Smith,John
更改为
John Smith
Smith,John J
更改为
John J Smith
,这就是使用函数和交换名称的方法

Function SwapNames(text As String) As String
    SwapNames = Trim(Split(text, ",")(1)) & " " & Trim(Split(text, ",")(0))
End Function

因此,它会将
Smith,John
更改为
John Smith
并将
Smith,John J
更改为
John J Smith

此外,我尝试将Find部分转换为一个范围,它只返回“#VALUE”--
函数SwapLNFN(文本作为范围)作为字符串”=MID(A4&“(Find(“,A4)+1),(LEN(A4)-1))SwapLNFN=MID(text&&&text,Range(text)。Find(“,text)-1,(Len(text)-1)End函数
use
WorksheetFunction.Find
。您需要使用instr,但也可以使用split()实现maybeal。因此,我尝试将Find部分转换为Range,它只返回“#VALUE”--
函数SwapLNFN(text As Range)作为字符串”=MID(A4&“”&A4,(FIND(“,A4)+1,(LEN(A4)-1))SwapLNFN=Mid(text&“”&text,Range(text)。FIND(“,text)-1,(LEN(text)-1))结束函数
use
WorksheetFunction.FIND
。您需要使用instr,但也可以使用split()来实现可能只是为了确保我理解代码,真正的工作是使用split(text,Delimiter)它在找到分隔符并将其放入数组时分隔字符串。如果分隔符未显示在字符串中,则SplitAt似乎可用于错误处理。是否正确?Split()何时删除分隔符?当我将
分隔符更改为string=“”
要使用逗号作为分隔符,逗号将被删除。谢谢!是的,
SplitAt
只是在尝试拆分文本之前检查文本中是否存在分隔符。当使用
split
时,分隔符两侧的文本将被放入数组的单独元素中,分隔符将被删除。我不知道但是,当这真的发生时——这都是同一个过程的一部分。为了确保我理解代码,真正的工作是使用Split(文本,分隔符)它在找到分隔符并将其放入数组时分隔字符串。如果分隔符未显示在字符串中,则SplitAt似乎可用于错误处理。是否正确?Split()何时删除分隔符?当我将
分隔符更改为string=“”
要使用逗号作为分隔符,逗号将被删除。谢谢!是的,
SplitAt
只是在尝试拆分文本之前检查文本中是否存在分隔符。当使用
split
时,分隔符两侧的文本将被放入数组的单独元素中,分隔符将被删除。我不知道然而,当这真的发生时——这都是同一个过程的一部分。