2016-09-19 2 views
1

Я использовал vba для правильного случая в Excel, но мне нужно добавить правило исключения, чтобы сохранить много ручного редактирования. Мне нужна первая буква после «-», также как и «Заглавная», например: «Майкл-Йордан» становится «Майклом-Йорданом», когда я запускаю свой сценарий. Мне нужно «майкл-иордан», чтобы стать «Майклом-Иорданией».Правильный случай с дополнительными правилами в Excel

Это мой код: У меня также есть исключение для «von», «af» и «de» в моем коде.

Sub ProperCase() 

Dim rng As Range 

'Use special cells so as not to overwrite formula. 
For Each rng In Selection.SpecialCells(xlCellTypeConstants, xlTextValues).Cells 
    Select Case rng.Value 
     Case "von", "af", "de" 
      rng.Value = StrConv(rng.Value, vbLowerCase) 
     Case Else 
      'StrConv is the VBA version of Proper. 
      rng.Value = StrConv(rng.Value, vbProperCase) 
    End Select 
Next rng 

End Sub 

ответ

2

Вместо

rng.Value = StrConv(rng.Value, vbProperCase) 

использование

rng.Value = WorksheetFunction.Proper(rng.Value) 

Хотя это не рассматривают дела, как don't doesn't как упомянуто Томасом Inzina.

+1

Хорошее мышление! Элегантный! – Heresh

0

Есть ли причина для этого в VBA, когда это легко сделать на листе?

=PROPER("michael-jordan") 

возвращает Michael-Jordan в соответствии с требованиями

+0

Да, так как это только один шаг в серии шагов в этом процессе, и самое главное мне нужно исключения, и я dont хотите изменить или добавить столбцы в базу данных – Heresh

+0

Мне не нравится, потому что он неправильно обрабатывает апострофы. например 'WorksheetFunction.Proper (« не делает »)' outpts 'Do not Does not'. –

3

Вот копия моего ответа от этого Post. Он должен хорошо работать для вас.

Я использовал Rules for Capitalization in Titles of Articles в качестве ссылки для создания списка исключений капитализации.

Function TitleCase использует WorksheetFunction.ProperCase для предварительной печати текста. По этой причине я сделал исключение для сокращений, потому что WorksheetFunction.ProperCase неправильно их заглавные буквы.

Первое слово в каждом предложении и первое слово после двойного кавычки останется заглавной. Знаки пунктуации также обрабатываются должным образом.

Function TitleCase(text As String) As String 
    Dim doc 
    Dim sentence, word, w 
    Dim i As Long, j As Integer 
    Dim arrLowerCaseWords 

    arrLowerCaseWords = Array("a", "an", "and", "as", "at", "but", "by", "for", "in", "of", "on", "or", "the", "to", "up", "nor", "it", "am", "is") 

    text = WorksheetFunction.Proper(text) 

    Set doc = CreateObject("Word.Document") 
    doc.Range.text = text 

    For Each sentence In doc.Sentences 
     For i = 2 To sentence.Words.Count 
      If sentence.Words.Item(i - 1) <> """" Then 
       Set w = sentence.Words.Item(i) 
       For Each word In arrLowerCaseWords 
        If LCase(Trim(w)) = word Then 
         w.text = LCase(w.text) 
        End If 

        j = InStr(w.text, "'") 

        If j Then w.text = Left(w.text, j) & LCase(Right(w.text, Len(w.text) - j)) 

       Next 
      End If 
     Next 
    Next 

    TitleCase = doc.Range.text 

    doc.Close False 
    Set doc = Nothing 
End Function 
1

Вот немного VBA Функция с помощью Split Wich должны сделать нужную работу:

Function properCase(str As String) As String 

Dim splitStr() As String 

splitStr = Split(str, "-") 

Dim i As Integer 

For i = LBound(splitStr) To UBound(splitStr) Step 1 

    splitStr(i) = UCase(Left(splitStr(i), 1)) & Right(splitStr(i), Len(splitStr(i)) - 1) 
Next i 

properCase = Join(splitStr, "-") 
End Function 
Смежные вопросы