Как я могу усечь до определенных символов в Excel VBA? - PullRequest
0 голосов
/ 28 января 2019

У меня есть лист Excel с несколькими строками описаний в одном столбце, я стремлюсь получить vba, который будет проходить через все эти ряды описаний, и обрезать его до определенного предела, например 30 символов, и еслиусечение останавливается на 30 символов в середине слова, затем я хочу полное слово (в этом случае может превышать 30 символов).

Я пытался сделать это с кодом VBA ниже, но я не могучтобы получить то, что я ищу.

Function foo(r As Range)
Dim sentence As Variant
Dim w As Integer
Dim ret As String

' assign this cell's value to an array called "sentence"
sentence = Split(r.Value, " ")

' iterate each word in the sentence
For w = LBound(sentence) To UBound(sentence)
    ' trim to 6 characters:
    sentence(w) = Left(sentence(w), 6)
Next

' Join the array back to a string/sentence
ret = Join(sentence, " ")

'Make sure the sentence is max 20 chars:
ret = Left(ret, 20)


'return the value to your function expression:
foo = ret
End Function

Я ожидаю, что код пройдет через все строки определенного столбца и урежет его до 30 символов, и если усечение останавливается в середине слова, тооно должно держать это слово.

Ответы [ 5 ]

0 голосов
/ 28 января 2019

Петли строк из листа 1, столбец A, начиная со строки 1:

Option Explicit

Sub test()

    Dim Lastrow As Long, i As Long

    With ThisWorkbook.Worksheets("Sheet1")
        Lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row

        For i = 1 To Lastrow
        'Insert Code

        Next i

    End With

End Sub
0 голосов
/ 28 января 2019
Public Function foo(r As Range, length As Integer) As String
    If Len(r.Value) <= length Then
        foo = r.Value
    Else
        foo = Left(r.Value, 1 + length)
        foo = RTrim(Left(foo, InStrRev(foo, " ")))
    End If
End Function

Полагаю, вы захотите запустить это, передав 20 в качестве второго параметра

0 голосов
/ 28 января 2019

Я думаю, вы ищете функцию instr().Это может дать вам первый пробел после позиции 30.

Вы получите следующее:

Dim SpacePosition as Integer

'return the position for the first space-character after position 29
SpacePosition = Instr(30, r.value," ")

if SpacePosition <> 0 then

    'fill ret with the substring up to the first space after position 29
    ret = left(r.value, SpacePosition - 1)

else

    'if there is no space-character (after position 29) then take the whole string
    ret = r.value

end if

Надеюсь, что поможет.

0 голосов
/ 28 января 2019

Лучшее и блестящее решение от @scott Craner.Тем не менее, в своем коде VBA вы можете изменить следующее, чтобы получить требуемый результат

'Join the array back to a string/sentence
'ret = Join(sentence, " ")
ret = ""
For w = LBound(sentence) To UBound(sentence)
    ' trim to 6 characters:
    sentence(w) = Left(sentence(w), 6)
ret = ret & IIf(Len(ret) > 0, " ", "") & sentence(w)
If Len(ret) >= 30 Then Exit For
Next w

'Make sure the sentence is max 20 chars:
' ret = Left(ret, 20)
0 голосов
/ 28 января 2019

Поскольку вы пометили его для формулы

=LEFT(A1,FIND(" ",A1,30)-1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...