2016-01-06 33 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