如何正确结束基本功能

时间:2016-01-06 16:26:47

标签: macros libreoffice basic libreoffice-calc

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

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

为什么会这样?我该如何解决这个问题?

我对Basic没有任何了解,所以如果这很简单,请不要抨击我。

原始功能是:

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

1 个答案:

答案 0 :(得分:1)

您找到的代码是Excel VBA。 Openoffice或Libreoffice使用StarBasic,而不是VBA。这是相似但不相等的。因此,您无法使用与Excel中相同的代码。

第一个区别是,没有Range个对象。您已注意到此问题并将rng用作Variant

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

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都会重置(新Dim ed)。所以即使是函数的返回值。