TOP

LibreOffice Calc 中用英文书写的金额

描述

LibreOffice Calc 没有可以在工作表上将数字显示为英文单词的内置函数,但您可以通过将以下 SpellNum_YouLibreCalc 函数宏插入到 Basic 模块中来添加此功能。

此函数允许您使用公式将数字转换为任何货币的单词,例如数字 22.50 将被读作 "Twenty Two Dollars and Fifty Cents" 或者 "Twenty Two Pesos and Fifty Centavos"

如果您使用 Calc 作为模板来填写支票或其他会计凭证,这将非常有用。



BASIC SpellNum_YouLibreCalc 函数的代码

要添加您自己的英文求和函数,请打开菜单 Tools - Macros - Edit Macros...,选择 Module1 并将以下代码文本复制到所选模块:

 
  Function SpellNum_YouLibreCalc(ByVal MyNumber, Optional CurrNameS, Optional CurrNamePl, Optional CentNameS, Optional CentNamePl, Optional Modifier, Optional CurrPlace, Optional AddZero)
      ' moonexcel.com.ua 
      Dim Place(9) As String   
      Dim FCalc    As Object
      Dim Dollars, Cents, Temp, DecimalPlace, Count, CalcResult 
      
      If Len(MyNumber) = 0 Then Exit Function   
      
      FCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
      
      If IsMissing(CurrNameS)  Then CurrNameS  = 0
      If IsMissing(CurrNamePl) Then CurrNamePl = 0
      If IsMissing(CentNameS)  Then CentNameS  = 0
      If IsMissing(CentNamePl) Then CentNamePl = 0
      If IsMissing(Modifier)   Then Modifier   = 0           
      If IsMissing(CurrPlace)  Then CurrPlace  = 0
      If IsMissing(AddZero)    Then AddZero    = 0
                 
      If CurrNameS  = 0 Then CurrNameS  = ""            
      If CurrNamePl = 0 Then CurrNamePl = ""
      If CentNameS  = 0 Then CentNameS  = ""      
      If CentNamePl = 0 Then CentNamePl = ""      
      
      Place(2) = " Thousand "
      Place(3) = " Million "
      Place(4) = " Billion "
      Place(5) = " Trillion " 

      MyNumber     = Trim(Str(MyNumber))
      ValMyNumber  = Val(MyNumber)
      DecimalPlace = InStr(MyNumber, ".")
      
      If DecimalPlace > 0 Then      
        If Modifier = 5 Then
          Cents = GetHundreds(Left(Mid(MyNumber, DecimalPlace + 1) & "000", 3))
        Else 
          Cents = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & "00", 2))
        End If        
        
        MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
      End If        
           
      Count = 1   
         
      Do While MyNumber <> ""
          Temp = GetHundreds(Right(MyNumber, 3))          
          If Temp <> "" Then Dollars = Temp & Place(Count) & Dollars          
          If Len(MyNumber) > 3 Then
              MyNumber = Left(MyNumber, Len(MyNumber) - 3)
          Else
              MyNumber = ""
          End If          
          Count = Count + 1
      Loop                                            
                                          
      If Modifier = 3 Then
        CalcResult = FCalc.callFunction("MOD", Array(ValMyNumber, 1))
        CalcResult = FCalc.callFunction("ROUND", Array(CalcResult, 2))                     
        Cents      = Str(CalcResult * 100) & "/100" 
      End If
      
      If Modifier = 4 Then        
        CalcResult = FCalc.callFunction("MOD", Array(ValMyNumber, 1))                  
        CalcResult = FCalc.callFunction("ROUND", Array(CalcResult, 3))                      
        Cents      = Str(CalcResult * 1000) & "/1000"              
      End If
      
      If CurrPlace = 1 Then
          If Len(Dollars) = 0 Then 
	        Dollars =  CurrNamePl & " Zero"
	      ElseIf Dollars = "One" Then
	        Dollars = CurrNameS & " One"
	      Else
	        Dollars = CurrNamePl & " " & Dollars 
	      End If      
      Else
	      If Len(Dollars) = 0 Then 
	        Dollars = "Zero " & CurrNamePl
	      ElseIf Dollars = "One" Then
	        Dollars = "One " & CurrNameS
	      Else
	        Dollars = Dollars & " " & CurrNamePl        
	      End If 
      End If           
      
      LenCents = Len(Cents)  
      
      If CurrPlace = 1 Then	      
	      If LenCents = 0 Then 
	        Cents = CentNamePl & " Zero"
	      ElseIf Cents = "One" Then
	        Cents = CentNamePl & " One"
	      Else
	        Cents = CentNamePl & " " & Cents 
	      End If
      Else
          If LenCents = 0 Then 
	        Cents = "Zero " & CentNamePl
	      ElseIf Cents = "One" Then
	        Cents = "One " & CentNameS
	      Else
	        Cents = Cents & " " & CentNamePl        
	      End If      
      End If
      
      If Modifier <> 2 Then Cents = " and " & Cents      
          
      If LenCents = 0 And AddZero <> 1 Then Cents = ""     
      
      Select Case Modifier
        Case 1:    SpellNumber = Dollars
        Case 2:    SpellNumber = Cents
        Case Else: SpellNumber = Dollars & Cents    
      End Select           
                                
      SpellNum_YouLibreCalc = FCalc.callFunction("TRIM", Array(SpellNumber))
  End Function
  

  Function GetHundreds(ByVal MyNumber)
      Dim Result As String
      If Val(MyNumber) = 0 Then Exit Function
      MyNumber = Right("000" & MyNumber, 3)
      ' 转换百位数 
      If Mid(MyNumber, 1, 1) <> "0" Then
          Result = GetDigit(Mid(MyNumber, 1, 1)) & " Hundred "
      End If
      ' 转换十位和个位数字 
      If Mid(MyNumber, 2, 1) <> "0" Then
          Result = Result & GetTens(Mid(MyNumber, 2))
      Else
          Result = Result & GetDigit(Mid(MyNumber, 3))
      End If
      GetHundreds = Result
  End Function
  

  Function GetTens(TensText)
      Dim Result As String
      ' 重置临时函数的值 
      Result = ""
      ' 如果该值在 10-19 之间... 
      If Val(Left(TensText, 1)) = 1 Then   
          Select Case Val(TensText)
              Case 10: Result = "Ten"
              Case 11: Result = "Eleven"
              Case 12: Result = "Twelve"
              Case 13: Result = "Thirteen"
              Case 14: Result = "Fourteen"
              Case 15: Result = "Fifteen"
              Case 16: Result = "Sixteen"
              Case 17: Result = "Seventeen"
              Case 18: Result = "Eighteen"
              Case 19: Result = "Nineteen"
              Case Else
          End Select
      Else ' 如果该值在 20-99 之间... 
          Select Case Val(Left(TensText, 1))
              Case 2: Result = "Twenty "
              Case 3: Result = "Thirty "
              Case 4: Result = "Forty "
              Case 5: Result = "Fifty "
              Case 6: Result = "Sixty "
              Case 7: Result = "Seventy "
              Case 8: Result = "Eighty "
              Case 9: Result = "Ninety "
              Case Else
          End Select
          ' 入座 
          Result = Result & GetDigit(Right(TensText, 1))  
      End If
      GetTens = Result
  End Function
  

  Function GetDigit(Digit)
      Select Case Val(Digit)
          Case 1: GetDigit = "One"
          Case 2: GetDigit = "Two"
          Case 3: GetDigit = "Three"
          Case 4: GetDigit = "Four"
          Case 5: GetDigit = "Five"
          Case 6: GetDigit = "Six"
          Case 7: GetDigit = "Seven"
          Case 8: GetDigit = "Eight"
          Case 9: GetDigit = "Nine"
          Case Else: GetDigit = ""
      End Select
  End Function
  

然后,关闭Macro Editor,返回LibreOffice Calc,选择任意单元格并使用我们的新函数。