2016-01-06 54 views
0

我试图写一个基本功能的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

这也无所谓如果我删除一些甚至全部单元格,或者i F I叫它使用空单元格或甚至在另一个页面,它会永远追加的结果与前一个:

second example

为什么会出现这种情况?我该如何解决这个问题?

我对基本的东西一无所知,所以如果这件事很简单,请不要打我。

原来的功能是这样的:

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

您发现的代码是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是reseted(新Dim ED)每次函数被调用时。所以即使是函数的返回值。

+0

我自己想不出来,谢谢! – arielnmz