Я подумал, что это была интересная задача кодирования, ниже приведены две мои попытки написать более эффективную функцию, которая "подрезает" большую строку на
Обе функции возвращают массив путем разбиения окончательного текста, который я затем возвратил в виде одной строки, используя Join
в моей основной подпрограмме.
Код
Sub Test()
Dim strIn As String
Dim lngChks As Long
strIn = Application.Rept("The quick fox jumped over the lazy dog", 2)
lngChks = 2
MsgBox Join(TruncateRegex(strIn, lngChks), vbNewLine)
MsgBox Join(TruncateMid(strIn, lngChks), vbNewLine)
End Sub
1 - регулярное выражение
Function TruncateRegex(ByVal strIn, ByVal lngChks)
Dim objRegex As Object
Dim objRegMC As Object
Dim objRegM As Object
Dim strOut As String
Dim lngCnt As Long
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Pattern = "[^\s]{1," & lngChks - 1 & "}(\s+|$)|[^\s]{" & lngChks & "}"
.Global = True
'test to avoid nulls
If .Test(strIn) Then
Set objRegMC = .Execute(strIn)
For Each objRegM In objRegMC
'concatenate long string with (short string & short string)
strOut = strOut & (objRegM & vbNewLine)
Next
End If
End With
TruncateRegex = Split(strOut, vbNewLine)
End Function
2 струна
Function TruncateMid(ByVal strIn, ByVal lngChks)
Dim arrVar
Dim strOut As String
Dim lngCnt As Long
Dim lngCnt2 As Long
'use spaces to delimit string array
arrVar = Split(strIn, Chr(32))
For lngCnt = LBound(arrVar) To UBound(arrVar)
If Len(arrVar(lngCnt)) > 0 Then
lngCnt2 = 0
For lngCnt2 = 1 To Int(Len(arrVar(lngCnt)) / lngChks)
strOut = strOut & (Mid$(arrVar(lngCnt), (lngCnt2 - 1) * lngChks + 1, lngChks) & vbNewLine)
Next
'add remaining data at end of string < lngchks
If Len(arrVar(lngCnt)) Mod lngChks <> 0 Then strOut = strOut & (Mid$(arrVar(lngCnt), (lngCnt2 - 1) * lngChks + 1, Len(arrVar(lngCnt)) Mod lngChks) & vbNewLine)
End If
Next
TruncateMid = Split(strOut, vbNewLine)
End Function