Excel VBA属性函数

Excel VBA属性函数,excel,text,case,Excel,Text,Case,我使用下面的代码将几个单元格放入适当的大小写中,效果很好。但是有没有办法修改它,这样就不会改变已经存在的字母的大小写呢?例如,把“麦当劳”或“麦当劳”单独留下?我不知道如何“调整”单元格中两个名称的第一个字母 Range("A6") = Application.WorksheetFunction.Proper(Range("A6")) Range("A8") = Application.WorksheetFunction.Proper(Range("A8")) Range("A10") = Ap

我使用下面的代码将几个单元格放入适当的大小写中,效果很好。但是有没有办法修改它,这样就不会改变已经存在的字母的大小写呢?例如,把“麦当劳”或“麦当劳”单独留下?我不知道如何“调整”单元格中两个名称的第一个字母

Range("A6") = Application.WorksheetFunction.Proper(Range("A6"))
Range("A8") = Application.WorksheetFunction.Proper(Range("A8"))
Range("A10") = Application.WorksheetFunction.Proper(Range("A10"))
Range("A11") = Application.WorksheetFunction.Proper(Range("A11"))
Range("A12") = Application.WorksheetFunction.Proper(Range("A12"))
Range("A13") = Application.WorksheetFunction.Proper(Range("A13"))
Range("A14") = Application.WorksheetFunction.Proper(Range("A14"))
Range("A15") = Application.WorksheetFunction.Proper(Range("A15"))
Range("A16") = Application.WorksheetFunction.Proper(Range("A16"))
Range("A17") = Application.WorksheetFunction.Proper(Range("A17"))
Range("A18") = Application.WorksheetFunction.Proper(Range("A18"))
Range("A20") = Application.WorksheetFunction.Proper(Range("A20"))
Range("A21") = Application.WorksheetFunction.Proper(Range("A21"))
Range("A22") = Application.WorksheetFunction.Proper(Range("A22"))

任何帮助都将不胜感激

为了理智起见,如果您使用
工作表function.property
,或者在任何
范围内进行迭代,则首先初始化并迭代,如:

Dim rng As Range: Set rng = Range("A6,A8,A10:A18,A20:A22")
For Each cl In rng
    cl.Value = Application.Proper(cl.Value)
Next
然而,
VBA
拥有自己的变体,名为
StrConv

Dim rng As Range: Set rng = Range("A6,A8,A10:A18,A20:A22")
For Each cl In rng
    cl.Value = StrConv(cl.Value, vbProperCase)
Next

现在,为了回答您的问题,两个选项都将而不是忽略准备就绪的内容。在这种情况下,将一些
Left
UCase
Mid
组合在一起,就可以开始了:

Dim rng As Range: Set rng = Range("A6,A8,A10:A18,A20:A22")
For Each cl In rng
    cl.value = UCase(Left(cl.value, 1)) & Mid(cl.value, 2)
Next

提示:确保使用显式工作表引用,因为
rng
现在引用隐式
ActiveSheet

如果一个字符串中有多个单词,您可能希望拆分该字符串,迭代数组中的每个单词,然后将它们重新连接在一起。例如:

Dim rng As Range: Set rng = Range("A6,A8,A10:A18,A20:A22")
For Each cl In rng
    tmp = Split(cl.Value, " ")
    For x = LBound(tmp) To UBound(tmp)
        tmp(x) = UCase(Left(tmp(x), 1)) & Mid(tmp(x), 2)
    Next x
    cl.Value = Join(tmp, " ")
Next

出于理智的考虑,如果您使用
工作表function.property
,或者对任何
范围进行迭代,则首先初始化它并对其进行迭代,如:

Dim rng As Range: Set rng = Range("A6,A8,A10:A18,A20:A22")
For Each cl In rng
    cl.Value = Application.Proper(cl.Value)
Next
然而,
VBA
拥有自己的变体,名为
StrConv

Dim rng As Range: Set rng = Range("A6,A8,A10:A18,A20:A22")
For Each cl In rng
    cl.Value = StrConv(cl.Value, vbProperCase)
Next

现在,为了回答您的问题,两个选项都将而不是忽略准备就绪的内容。在这种情况下,将一些
Left
UCase
Mid
组合在一起,就可以开始了:

Dim rng As Range: Set rng = Range("A6,A8,A10:A18,A20:A22")
For Each cl In rng
    cl.value = UCase(Left(cl.value, 1)) & Mid(cl.value, 2)
Next

提示:确保使用显式工作表引用,因为
rng
现在引用隐式
ActiveSheet

如果一个字符串中有多个单词,您可能希望拆分该字符串,迭代数组中的每个单词,然后将它们重新连接在一起。例如:

Dim rng As Range: Set rng = Range("A6,A8,A10:A18,A20:A22")
For Each cl In rng
    tmp = Split(cl.Value, " ")
    For x = LBound(tmp) To UBound(tmp)
        tmp(x) = UCase(Left(tmp(x), 1)) & Mid(tmp(x), 2)
    Next x
    cl.Value = Join(tmp, " ")
Next

好的,哇!你不仅回答了我问的问题,而且还回答了我不知道怎么问的问题。这两个都将使我的项目进行得更加顺利!非常感谢你!(我投了赞成票,并检查了你是否回答了。)这是对Proper的一个苍白的模仿。@JvdV
Proper
将字符串中的所有单词大写(以及小写的后续字母,这是OPs的问题),并将单词标识为由非字母字符分隔。您的答案只检查字符串的第一个字符-一个非常不同的算法。如果这是OP想要的,那么很好,但是把它作为
的变体来冒充是不诚实的。好吧,哇!你不仅回答了我问的问题,而且还回答了我不知道怎么问的问题。这两个都将使我的项目进行得更加顺利!非常感谢你!(我投了赞成票,并检查了你是否回答了。)这是对Proper的一个苍白的模仿。@JvdV
Proper
将字符串中的所有单词大写(以及小写的后续字母,这是OPs的问题),并将单词标识为由非字母字符分隔。您的答案只检查字符串的第一个字符-一个非常不同的算法。如果这是OP想要的,那就好了,但把它当作
property
的变体充其量是不诚实的。