我经常会找到需要与之合作的名字并协调他们的一些信息。这些名称通常有许多不同的格式。我目前使用的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),我会感到惊讶。
任何建议都将不胜感激!提前谢谢!
答案 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