根据变量字符串长度删除可变字符位置右侧的所有文本

时间:2018-03-07 01:07:49

标签: string excel-vba replace string-length vba

问题:我有一个列,其中每个单元格具有不同的长度和不同的句子结构。如果任何单元格的长度超过1000个字符,则在字符串中找到第998个字符的右侧的第一个出现的[句点],[逗号],[分号],[冒号]并用[3个句点]替换该字符(替代省略号的应用程序)。最后截断3个句点后的所有剩余文本。

实施例 -

当前数据: [[900以前的字符]]。 Visual Basic for Applications支持通过动态链接库(DLL)构建用户定义的函数(UDF),自动化流程以及访问Windows API和其他低级功能。

预期产出: [[900以前的字符]]。 Visual Basic for Applications支持构建用户定义的函数(UDF)......

在'当前数据'中,长度= 1098个字符。第998个字符是第二个字符'在"过程 S "。右边所需的标点符号之一的第一次出现是(逗号)之后的(逗号)。用[3个句点]代替,然后删除字符串的其余部分。

目前这就是我所拥有的。我还没想出如何在3个时期之后包含各种条件来查找或如何截断文本。此外,可能有一种更清洁的方法来完成所有这些。

For i = 2 To LR


If Len(Cells(i, 2).Value) > 1000 Then

    Cells(i, 2).Value = Left(Cells(i, 2), 998)
    Cells(i, 2).Value = StrReverse(Replace(StrReverse(Cells(i, 2).Value), StrReverse("."), StrReverse("..."), Count:=1))


End If
Next i

希望我提供了大量有关我正在尝试的信息。

3 个答案:

答案 0 :(得分:2)

可以使用InStrRev找到最左边1000个字符中最后一个符合条件的标点符号的位置。

dim str as string, p as long
for i=2 to lr
    str = cells(i, "B").value2
    if len(str) > 1000 then
        p = application.max(instrrev(str, chr(44), 998), _
                            instrrev(str, chr(46), 998), _
                            instrrev(str, chr(58), 998), _
                            instrrev(str, chr(59), 998))
        cells(i, "B") = left(str, p-1) & string(3, chr(46))
    end if
next i

答案 1 :(得分:2)

请尝试检查998个字符后第一次出现的标点符号. , ; :

Dim teststring As String, firstcut As String, extension As String

teststring = String$(1000, "a") & _
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " & _
    "In malesuada non enim nec posuere. Praesent placerat nulla enim, " & _
    "at porta justo pharetra ac."

If Len(teststring) > 999 Then
    firstcut = Left$(teststring, 998)

    extension = Right(teststring, Len(teststring) - 998)
    extension = Replace(Replace(Replace(extension, ",", "."), ";", "."), ":", ".")
    extension = Left$(extension, InStr(1, extension, ".") - 1) & "..."

    Debug.Print extension
End If

答案 2 :(得分:1)

试试这个演示(可能会帮到你)

Sub Demo2()
Dim a As Variant
Dim s As String
Dim p As Integer
Dim p1 As Integer
Dim p2 As Integer
Dim p3 As Integer

s = "ab:cde,fghij Hello ; world, thanks. a lot , for everything and "

p1 = InStr(10, s, ",")
p2 = InStr(10, s, ";")
p3 = InStr(10, s, ".")

a = Array(p1, p2, p3)
p = Evaluate("MIN(IF({" & Join(a, ";") & "}>0,{" & Join(a, ";") & "}))")
Debug.Print p

s = Mid(s, 1, p - 1) & "..."
Debug.Print s
End Sub

另一个演示如果您将处理更多选项(逗号/句号/分号)

production.ERROR: Command "test" is not defined.

Did you mean this?
    make:test {"exception":"[object] (Symfony\\Component\\Console\\Exception\\CommandNotFoundException(code: 0): Command \"test\" is not defined.

Did you mean this?
    make:test at {root}/vendor/symfony/console/Application.php:618)
[stacktrace]
#0 {root}/vendor/symfony/console/Application.php(229): Symfony\\Component\\Console\\Application->find('test')
#1 {root}/vendor/symfony/console/Application.php(148): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#2 {root}/vendor/laravel/framework/src/Illuminate/Console/Application.php(88): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#3 {root}/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(121): Illuminate\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#4 {root}/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#5 {main}
"}