问题:我有一个列,其中每个单元格具有不同的长度和不同的句子结构。如果任何单元格的长度超过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
希望我提供了大量有关我正在尝试的信息。
答案 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}
"}