Как правильно завершить базовую функцию

Я пытаюсь написать функцию в Basic для 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

И он работает правильно, если я не попытаюсь выполнить его снова, тогда кажется, что новый результат добавляется к результату любого предыдущего выполнения, и он возвращает обе строки вместе, например:

первый пример

Также не имеет значения, удаляю ли я некоторые или даже все ячейки, или если я вызываю его, используя пустую ячейку или даже на другой странице, он всегда будет добавлять результат к предыдущему:

второй пример

Почему это происходит? Как я могу исправить это поведение?

Я ничего не знаю о 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.


person arielnmz    schedule 06.01.2016    source источник


Ответы (1)


Вы нашли код VBA для Excel. 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 сбрасывается (новый Dimed) каждый раз при вызове функции. Так что даже возвращаемое значение функции.

person Axel Richter    schedule 06.01.2016
comment
Сам бы не догадался, спасибо! - person arielnmz; 06.01.2016