Функция Excel VBA ProperCase - PullRequest
       5

Функция Excel VBA ProperCase

1 голос
/ 22 февраля 2020

Я использую следующий код, чтобы поместить несколько ячеек в правильный регистр, и он работает просто отлично. Но есть ли способ изменить это так, чтобы это не изменило регистр букв, которые уже присутствуют? Примером будет оставить «Макдональд» или «Макдональд» в покое? Я не могу понять, как «настроить» только первую букву каждого из двух имен ячеек.

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"))

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 22 февраля 2020

Просто ради здравомыслия, если вы 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...