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