我有以下代码:
Function TruncateString(str, n)
' Returns an array with strings no more than n char long, truncated at spaces
Dim truncatedArr() As String
If str <> "" Then
str = remove_spaces_left(str)
For i = 0 To (CLng(Len(str) / n))
Index = InStrRev(Left(str, n), " ")
ReDim Preserve truncatedArr(i)
truncatedArr(i) = Left(str, Index)
If Right(truncatedArr(i), 1) = " " Then truncatedArr(i) = Left(truncatedArr(i), Len(truncatedArr(i)) - 1)
str = Right(str, Len(str) - Index)
Next i
End If
TruncateString = truncatedArr
End Function
我的问题是当str
为空时函数返回的值是多少?当我这样做时,我遇到了类型兼容性问题
arr = TruncateString (text,15)
arr的定义如下:
dim arr() as string
如果答案需要更多信息,请告诉我。感谢
答案 0 :(得分:5)
您的代码中有几个问题:
Option Explicit
,这样您就会被迫声明所有您的变量(包括i
和Index
,应该重命名,因为它与财产发生冲突)最后,为了回答你的问题(但我想知道你为什么不亲自检查),你的函数返回一个空数组(存在但从不ReDim
编辑)。你甚至不能UBound
这样的数组。
答案 1 :(得分:4)
我认为这是一个有趣的编码任务,下面是我尝试编写一个更有效的函数“切断”大字符串
的两次尝试然后带有任何剩余长度
rexexp
立即打破字符串Split
将字符串分隔为较小的文本块,使用空格字符作为分隔符Mid$
Mod
测试),如果是,则将这些部分字符串附加到最终结果两个函数都通过拆分最终文本来返回一个数组,然后我使用我的主子文件中的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 - Regexp
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