Размещение пробела перед заглавной буквой в vba

#excel #vba

#excel #vba

Вопрос:

Я думал, что это будет просто, но мой приведенный ниже код не работает, какие-либо предложения, пожалуйста?

 Function AddSpaceBeforeUpper(Rg As Range) As Integer
Dim xStr As String
Dim I As Integer
Application.Volatile
On Error Resume Next
xStr = Trim(Rg.Value)
For I = 2 To Len(xStr)
    If (Asc(Mid(xStr, I, 1)) < 91) And (Asc(Mid(xStr, I, 1)) > 64) Then xStr = Replace(xStr, Mid(xStr, I, 1), " " amp; Mid(xStr, I, 1))
    If (Asc(Mid(xStr, I, 1)) < 91) And (Asc(Mid(xStr, I, 1)) > 64) Then I = I   1
Next
  

Функция завершения

Комментарии:

1. Избавьтесь от On Error Resume Next . Тогда непонятно, почему ваша функция возвращает an Integer .

2. будьте осторожны с полной заменой: Replace(xStr, Mid(xStr, I, 1), " " amp; Mid(xStr, I, 1)) если строка является aStrongSketch , она будет помещать два пробела перед обеими S буквами

3. Также остерегайтесь тратить 30 минут, как я только что сделал, пытаясь использовать параметр «start» Replace() , не прочитав сначала, что «Возвращаемое значение функции Replace представляет собой строку с выполненными заменами, которая начинается с позиции, указанной start, и заканчивается в конце строки выражения . Это не копия исходной строки от начала до конца »

Ответ №1:

Как указано, вы должны возвращать строку, а не целое число, плюс нет необходимости On Error Resume Next

Также просто добавьте символ или пробел и символ, если он прописной.

Кроме того, поскольку ваша функция не зависит от других диапазонов за пределами того, на который она указана, нет необходимости делать ее изменчивой.

 Function AddSpaceBeforeUpper(Rg As Range) As String
    Dim xStr As String
    Dim I As Integer
    xStr = Trim(Rg.Value)
    AddSpaceBeforeUpper = Left(xStr, 1)
    For I = 2 To Len(xStr)
        If UCase(Mid(xStr, I, 1)) = Mid(xStr, I, 1) Then
            AddSpaceBeforeUpper = AddSpaceBeforeUpper amp; " " amp; Mid(xStr, I, 1)
        Else
            AddSpaceBeforeUpper = AddSpaceBeforeUpper amp; Mid(xStr, I, 1)
        End If
    Next
End Function