Просто ради здравомыслия, если вы go с WorksheetFunction.Proper
или итерируете по любому Range
по этому вопросу, то сначала инициализируйте его и итерируйте по нему, как:
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
, и вы готовы к go:
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