关于宏:如何正确结束基本功能

How to end a Basic function properly

我尝试在basic for libreoffice calc中编写一个函数,使用以下代码获取所选单元格中每个单词的第一个字母:

1
2
3
4
5
6
7
8
9
10
11
12
Function GetFirstLetters(rng) As String
    Dim arr
    Dim I As Long
    arr = Split(rng,"")
    If IsArray(arr) Then
        For I = LBound(arr) To UBound(arr)
            GetFirstLetters = GetFirstLetters & Left(arr(I), 1)
        Next I
    Else
        GetFirstLetters = Left(arr, 1)
    End If
End Function

它工作正常,除非我再次尝试执行它,否则新的结果似乎会附加到以前执行的结果之后,它会同时返回两个字符串,例如:

first example

如果我删除了部分甚至全部单元格,或者使用空单元格甚至在另一页中调用它,也不重要,它总是将结果追加到前一个单元格:

second example

为什么会这样?我怎样才能纠正这种行为?

我对基础知识一无所知,所以如果这很简单的话,请不要责怪我。

最初的功能是:

1
2
3
4
5
6
7
8
9
10
11
12
13
Function GetFirstLetters(rng As Range) As String
'Update 20140325
    Dim arr
    Dim I As Long
    arr = VBA.Split(rng,"")
    If IsArray(arr) Then
        For I = LBound(arr) To UBound(arr)
            GetFirstLetters = GetFirstLetters & Left(arr(I), 1)
        Next I
    Else
        GetFirstLetters = Left(arr, 1)
    End If
End Function

我从这里得到的:http://www.extendoffice.com/documents/excel/1580-excel-extract-first-letter-of-each-word.html。


您找到的代码是VBAfor excel。OpenOffice或libreoffice使用StarBasic,而不是VBA。这是相似但不相等的。因此,您不能简单地使用与Excel相同的代码。

第一个区别是,没有Range对象。您注意到了这一点,并将rng用作Variant

但另一个区别是,函数名与全局范围中的变量名类似。如果再次调用函数,它们将不会被重置。所以在StarBasic中,我们最好:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function GetFirstLetters(sCellValue as String) As String
    Dim arr As Variant
    Dim I As Long
    Dim sResult As String
    arr = Split(sCellValue,"")
    If IsArray(arr) Then
        For I = LBound(arr) To UBound(arr)
            sResult = sResult & Left(arr(I), 1)
        Next I
    Else
        sResult = Left(arr, 1)
    End If
    GetFirstLetters = sResult
End Function

每次调用函数时,都会重置sResult(新的Dimed)。所以即使是函数的返回值。