2016-04-10 2 views
0

Итак, я пытаюсь создать программу, которая займет блок текста и отредактирует его, чтобы включать только до 50 символов в строке, но также сохраняя слова вместе (поэтому заменяя последнее место в строке текста длиной 50 символов для символа прерывания строки), но я продолжаю получать ошибку значения в качестве моего вывода!Ошибка значения значения в Excel для кода прерывания VBA

Вот код до сих пор:

Option Explicit 

Public Function LnBrk50(selection) As String 

    Dim bookmark As Long 
    Dim step As Byte 
    Dim length As Byte 

'finds the last instance number of a space character in the text block within 50 characters 
    length = 50 - Len(WorksheetFunction.Substitute(Left(selection, 50), " ", "")) 
'replaces the last instance of a space character with a line break character 
     selection = WorksheetFunction.IfError(WorksheetFunction.Substitute(selection, " ", vbNewLine, length), selection) 
'character number of the last line break in the text block 
    bookmark = WorksheetFunction.Find(vbNewLine, selection) 

    step = 0 
    Do Until step = 9 
'finds the last instance number of a space character in the text block within the 50 characters after the last line break 
     length = 50 + bookmark - Len(WorksheetFunction.Substitute(Left(selection, 50 + bookmark), " ", "")) 
'replaces the space character found in last line with a line break character 
     selection = WorksheetFunction.IfError(WorksheetFunction.Substitute(selection, " ", vbNewLine, length), selection) 
'adds character number of the last line break 
     bookmark = WorksheetFunction.Find(vbNewLine, selection, bookmark + 1) 
     step = step + 1 
    Loop 

End Function 

Так что, если кто-то может найти то, что ошибки я мог бы сделать, что бы произвести #VALUE! ошибка при использовании в одной ссылочной текстовой ячейке, было бы очень полезно!

+0

Несколько комментариев по поводу вашего кода: Старайтесь не использовать функции листа, когда функции обработки текста VBA будут работать лучше; Вы используете функцию, но не возвращаете значение; Функция, вызванная из листа, должна предоставлять значение, которое отображается в вызываемой ячейке, - не следует пытаться модифицировать другие ячейки. – OldUgly

+0

А, вот, я думал, что программа отобразит окончательный вывод цикла Do в ячейке, в которой я использую эту функцию. Поскольку я новичок в VBA, я не видел, что мне нужно было установить функцию, равную выходу. Спасибо за ваш отзыв! – RDub549

ответ

0

Этот снимок экрана показывает очень длинную текстовую строку в ячейке A1. Ячейка A2 содержит

=LnBrk50(A1) 

enter image description here

Следующий код, что находится позади LnBrk50.

Option Explicit 

Public Function LnBrk50(ByRef selection As Variant) As String 

    Dim tempStr As String 
    Dim iLoc As Long, iEnd As Long 

    tempStr = selection.Value 
    If Len(tempStr) > 50 Then 
     iLoc = 0 
     Do While Len(tempStr) - iLoc > 50 
      iEnd = iLoc + 50 
      If Len(tempStr) < iEnd Then iEnd = Len(tempStr) 
      If Not InStrRev(tempStr, " ", iEnd) > 0 Then 
       iLoc = iLoc + 1 
      Else 
       iLoc = InStrRev(tempStr, " ", iEnd) 
       tempStr = Left(tempStr, iLoc - 1) & vbNewLine & Right(tempStr, Len(tempStr) - iLoc) 
      End If 
     Loop 
    End If 
    LnBrk50 = tempStr 

End Function 

Если вы хотели бы изменить A1 вместо перемещения измененного текста B1, я бы рекомендовал использовать подпрограмму и прикрепив ее к кнопке вместо того, чтобы использовать функцию.

+0

Удивительный! Мне нравится цикл Do, который вы использовали для проверки пробелов, а не для использования функций листа! И переместить его в следующий столбец отлично, потому что мне нужно иметь возможность ссылаться на ByRef с другого листа! – RDub549

0

вы могли бы попробовать это

Option Explicit 

Function LnBrk50(rng As Range, maxChar As Long) As String 

Dim strng2 As String, subStrng As String 
Dim arr As Variant 
Dim i As Long 

arr = Split(rng)  
i = 0 
Do While i < UBound(arr) 
    subStrng = arr(i) 
    Do While Len(subStrng) + 1 + Len(arr(i + 1)) <= maxChar 
     subStrng = subStrng + " " + arr(i + 1) 
     i = i + 1 
     If i = UBound(arr) Then Exit Do 
    Loop 
    strng2 = strng2 & subStrng & IIf(i < UBound(arr), vbCrLf, "") 
    i = i + 1 
Loop  
LnBrk50 = strng2 

End Function 

, где ваша функция будет называться

=LnBrk50(A1,50) 

может быть интересным, который является самым быстрым ...

Смежные вопросы