我正在尝试在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
并且它正常工作,除非我尝试再次执行它,然后似乎新结果被附加到任何先前执行的结果并且它将两个字符串一起返回,例如:
如果我删除一些甚至所有单元格,或者如果我使用空单元格或甚至在另一页面中调用它也没关系,它总会将结果附加到前一个:
为什么会这样?我该如何解决这个问题?
我对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。
答案 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)。所以即使是函数的返回值。