将名称转换为正确的格式

时间:2016-10-17 07:19:01

标签: excel vba

我经常会找到需要与之合作的名字并协调他们的一些信息。这些名称通常有许多不同的格式。我目前使用的VBA脚本如下:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Or Target.HasFormula Then Exit Sub
    On Error Resume Next
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        Application.EnableEvents = False
        Target.Value = StrConv(Target.Value, vbProperCase)
        Application.EnableEvents = True
    End If
On Error GoTo 0
End Sub

它可以将名称更改为正确的案例,但我也希望自动化前面有姓氏的大写名称,用逗号分隔(例如SMITH,JOHN)。

在研究中,我发现以下公式非常出色,但这不在VBA中 - 我需要它来自动转换同一个单元格:

=RIGHT(A1,LEN(A1)-LEN(LEFT(A1,FIND(",",A1)-1))-2) & " " & LEFT(A1,FIND(",",A1)-1)

如果我可以在VBA脚本中使用此公式,是否会有效?

最后,如果这个剧本可以识别专门的姓氏,特别是在符号之后将字母大写(例如Mary-Lee / O' Connor),我会感到惊讶。

任何建议都将不胜感激!提前谢谢!

2 个答案:

答案 0 :(得分:1)

我将您的工作表公式转换为VBA,您可以使用INSTR获得与FIND相同的结果,参数以相反的顺序传递给它,但除此之外相同。 (我创建了一个名为A1的字符串,以便更容易与您的示例进行比较)

    Dim A1 As String
    A1 = Target.Value

    If (InStr(A1, ",") > 0) Then
        Target.Value = Right(A1, Len(A1) - Len(Left(A1, InStr(A1, ",") - 1)) - 2) & " " & Left(A1, InStr(A1, ",") - 1)
    End If

这会在撇号后大写下一个字符,你可以编辑它来处理其他标点符号

Dim A1 As String
A1 = Target.Value

Dim i As Integer
i = InStr(A1, "'") 'position of the '

If (i > 0 And Len(A1) > i) Then 'check there is a ' present and there is a character after it
    Target.Value = Left(A1, i) & UCase(Mid(A1, i + 1, 1)) & Right(A1, Len(A1) - i - 1)
End If

答案 1 :(得分:1)

Application.EnableEvents = True行之前添加:

If InStr(Target.Value, ",") > 0 Then
    Target.Value = UCase(Left(Target.Value, InStr(Target.Value, ",") - 1)) & Mid(Target.Value, InStr(Target.Value, ","), Len(Target.Value))
End If

注意:添加With Target作为您的第一行代码,End With作为您的最后一行,并将所有Target.Value引用更改为.Value
https://msdn.microsoft.com/en-us/library/wc500chb.aspx