VBA函数来转换名称格式
我想以First Last格式取名,并将其改为Last,First。 我知道我可以用一个公式来做到这一点,但我想变得复杂。
请让我知道,如果你看到我的代码中的任何红旗,或改善build议。
Function LastFirst(Name_FL As String) 'This only works if there is a single space in the cell - Will Error If Spaces <> 1 Length = Len(Name_FL) 'Establishes Length of String Spaces = Length - Len(Application.WorksheetFunction.Substitute(Name_FL, " ", "")) 'Number of spaces If Spaces <> 1 Then LastFirst = "#SPACES!#" 'Error Message Else SpaceLocation = Application.WorksheetFunction.Find(" ", Name_FL, 1) 'Location of space Last = Right(Name_FL, Length - SpaceLocation) 'Establishes Last Name String First = Left(Name_FL, SpaceLocation) 'Establishes First Name String LastFirst = Application.WorksheetFunction.Proper(Last & ", " & First) 'Puts it together End If End Function 'Ta-da
你可以简化为:
Function LastFirst(Name_FL As String) As String If (Len(Name_FL) - Len(Replace(Name_FL, " ", ""))) > 1 Then LastFirst = "#SPACES#" Else LastFirst = StrConv(Split(Name_FL, " ")(1) & ", " & Split(Name_FL, " ")(0), vbProperCase) End If End Function
这里的逻辑是:
- 如果有多个空格,则返回错误string
#SPACES#
- 如果有1个空格,则用
" "
分隔string作为分隔符。 - 使用拆分数组的第二个索引,添加
", "
并使用拆分数组的第一个索引。 - 使用
StrConv()
将其全部转换为适当的大小写。
您可能还想添加另一个不含空格的检查:
If InStr(Name_FL, " ") > 0 Then '// There is a space in the string Else '// There is no space in the string End If
这也可以通过稍微改变上面例子的逻辑来testing:
Function LastFirst(Name_FL As String) As String If (Len(Name_FL) - Len(Replace(Name_FL, " ", ""))) = 1 Then LastFirst = StrConv(Split(Name_FL, " ")(1) & ", " & Split(Name_FL, " ")(0), vbProperCase) Else LastFirst = "#SPACES#" End If End Function
进一步阐述function:
你可以看到我在这里使用了一些VBA函数来代替你的WorksheetFunction
方法。
-
Len()
返回string的长度 。 -
Replace()
做它所说的锡 – 用另一个replace给定的string。 -
StrConv()
转换为相应的情况(例如vbProperCase
)。 -
Split()
通过在给定分隔符处分割string,从string中创build一个基于零的单维数组。
最后 – 不要忘记在函数头中指定一个返回值:
Function LastFirst(Name_FL As String)
As String
<~~ return type