VBA函数以数组作为返回值

时间:2012-01-13 14:32:24

标签: arrays function vba

我有以下代码:

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

如果答案需要更多信息,请告诉我。感谢

2 个答案:

答案 0 :(得分:5)

您的代码中有几个问题:

  • 您应该在模块开头使用Option Explicit,这样您就会被迫声明所有您的变量(包括iIndex,应该重命名,因为它与财产发生冲突)
  • 如果所选字符范围内没有空格(返回空字符串),则代码不起作用

最后,为了回答你的问题(但我想知道你为什么不亲自检查),你的函数返回一个空数组(存在但从不ReDim编辑)。你甚至不能UBound这样的数组。

答案 1 :(得分:4)

我认为这是一个有趣的编码任务,下面是我尝试编写一个更有效的函数“切断”大字符串

的两次尝试
  • 空间[CHR(32)]
  • 然后变成固定长度
  • 然后带有任何剩余长度

    1. 我的首选方法使用rexexp立即打破字符串
    2. 第二种方法运行3个字符串操作,对我来说感觉更丑陋,更复杂
      • 使用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