summaryrefslogtreecommitdiff
path: root/patches/vba/vba-financial-functions.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/vba/vba-financial-functions.diff')
-rw-r--r--patches/vba/vba-financial-functions.diff813
1 files changed, 0 insertions, 813 deletions
diff --git a/patches/vba/vba-financial-functions.diff b/patches/vba/vba-financial-functions.diff
deleted file mode 100644
index 842c8e2cc..000000000
--- a/patches/vba/vba-financial-functions.diff
+++ /dev/null
@@ -1,813 +0,0 @@
-diff --git basic/source/runtime/methods1.cxx basic/source/runtime/methods1.cxx
-index 6917e1b..1f87c04 100644
---- basic/source/runtime/methods1.cxx
-+++ basic/source/runtime/methods1.cxx
-@@ -82,11 +82,15 @@
- #include <com/sun/star/uno/Sequence.hxx>
- #include <com/sun/star/lang/XMultiServiceFactory.hpp>
- #include <com/sun/star/i18n/XCalendar.hpp>
-+#include <com/sun/star/sheet/XFunctionAccess.hpp>
-
- using namespace comphelper;
-+using namespace com::sun::star::sheet;
- using namespace com::sun::star::uno;
- using namespace com::sun::star::i18n;
-
-+void unoToSbxValue( SbxVariable* pVar, const Any& aValue );
-+Any sbxToUnoValue( SbxVariable* pVar, const Type& rType, com::sun::star::beans::Property* pUnoProperty = NULL );
-
- static Reference< XCalendar > getLocaleCalendar( void )
- {
-@@ -2508,6 +2512,546 @@ RTLFUNC(Round)
- rPar.Get(0)->PutDouble( dRes );
- }
-
-+void CallFunctionAccessFunction( const Sequence< Any >& aArgs, const rtl::OUString& sFuncName, SbxVariable* pRet )
-+{
-+ static Reference< XFunctionAccess > xFunc;
-+ Any aRes;
-+ try
-+ {
-+ if ( !xFunc.is() )
-+ {
-+ Reference< XMultiServiceFactory > xFactory( getProcessServiceFactory() );
-+ if( xFactory.is() )
-+ {
-+ xFunc.set( xFactory->createInstance(::rtl::OUString::createFromAscii( "com.sun.star.sheet.FunctionAccess")), UNO_QUERY_THROW);
-+ }
-+ }
-+ Any aRet = xFunc->callFunction( sFuncName, aArgs );
-+
-+ unoToSbxValue( pRet, aRet );
-+
-+ }
-+ catch( Exception& )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ }
-+}
-+
-+RTLFUNC(SYD)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 4 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+
-+ // retrieve non-optional params
-+
-+ Sequence< Any > aParams( 4 );
-+ aParams[ 0 ] <<= makeAny( rPar.Get(1)->GetDouble() );
-+ aParams[ 1 ] <<= makeAny( rPar.Get(2)->GetDouble() );
-+ aParams[ 2 ] <<= makeAny( rPar.Get(3)->GetDouble() );
-+ aParams[ 3 ] <<= makeAny( rPar.Get(4)->GetDouble() );
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("SYD") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(SLN)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 3 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+
-+ // retrieve non-optional params
-+
-+ Sequence< Any > aParams( 3 );
-+ aParams[ 0 ] <<= makeAny( rPar.Get(1)->GetDouble() );
-+ aParams[ 1 ] <<= makeAny( rPar.Get(2)->GetDouble() );
-+ aParams[ 2 ] <<= makeAny( rPar.Get(3)->GetDouble() );
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("SLN") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(Pmt)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 3 || nArgCount > 5 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+ // retrieve non-optional params
-+
-+ double rate = rPar.Get(1)->GetDouble();
-+ double nper = rPar.Get(2)->GetDouble();
-+ double pmt = rPar.Get(3)->GetDouble();
-+
-+ // set default values for Optional args
-+ double fv = 0;
-+ double type = 0;
-+
-+ // fv
-+ if ( nArgCount >= 4 )
-+ {
-+ if( rPar.Get(4)->GetType() != SbxEMPTY )
-+ fv = rPar.Get(4)->GetDouble();
-+ }
-+ // type
-+ if ( nArgCount >= 5 )
-+ {
-+ if( rPar.Get(5)->GetType() != SbxEMPTY )
-+ type = rPar.Get(5)->GetDouble();
-+ }
-+
-+ Sequence< Any > aParams( 5 );
-+ aParams[ 0 ] <<= rate;
-+ aParams[ 1 ] <<= nper;
-+ aParams[ 2 ] <<= pmt;
-+ aParams[ 3 ] <<= fv;
-+ aParams[ 4 ] <<= type;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Pmt") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(PPmt)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 4 || nArgCount > 6 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+ // retrieve non-optional params
-+
-+ double rate = rPar.Get(1)->GetDouble();
-+ double per = rPar.Get(2)->GetDouble();
-+ double nper = rPar.Get(3)->GetDouble();
-+ double pv = rPar.Get(4)->GetDouble();
-+
-+ // set default values for Optional args
-+ double fv = 0;
-+ double type = 0;
-+
-+ // fv
-+ if ( nArgCount >= 5 )
-+ {
-+ if( rPar.Get(5)->GetType() != SbxEMPTY )
-+ fv = rPar.Get(5)->GetDouble();
-+ }
-+ // type
-+ if ( nArgCount >= 6 )
-+ {
-+ if( rPar.Get(6)->GetType() != SbxEMPTY )
-+ type = rPar.Get(6)->GetDouble();
-+ }
-+
-+ Sequence< Any > aParams( 6 );
-+ aParams[ 0 ] <<= rate;
-+ aParams[ 1 ] <<= per;
-+ aParams[ 2 ] <<= nper;
-+ aParams[ 3 ] <<= pv;
-+ aParams[ 4 ] <<= fv;
-+ aParams[ 5 ] <<= type;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("PPmt") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(PV)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 3 || nArgCount > 5 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+ // retrieve non-optional params
-+
-+ double rate = rPar.Get(1)->GetDouble();
-+ double nper = rPar.Get(2)->GetDouble();
-+ double pmt = rPar.Get(3)->GetDouble();
-+
-+ // set default values for Optional args
-+ double fv = 0;
-+ double type = 0;
-+
-+ // fv
-+ if ( nArgCount >= 4 )
-+ {
-+ if( rPar.Get(4)->GetType() != SbxEMPTY )
-+ fv = rPar.Get(4)->GetDouble();
-+ }
-+ // type
-+ if ( nArgCount >= 5 )
-+ {
-+ if( rPar.Get(5)->GetType() != SbxEMPTY )
-+ type = rPar.Get(5)->GetDouble();
-+ }
-+
-+ Sequence< Any > aParams( 5 );
-+ aParams[ 0 ] <<= rate;
-+ aParams[ 1 ] <<= nper;
-+ aParams[ 2 ] <<= pmt;
-+ aParams[ 3 ] <<= fv;
-+ aParams[ 4 ] <<= type;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("PV") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(NPV)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 1 || nArgCount > 2 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+
-+ Sequence< Any > aParams( 2 );
-+ aParams[ 0 ] <<= makeAny( rPar.Get(1)->GetDouble() );
-+ Any aValues = sbxToUnoValue( rPar.Get(2),
-+ getCppuType( (Sequence<double>*)0 ) );
-+
-+ // convert for calc functions
-+ Sequence< Sequence< double > > sValues(1);
-+ aValues >>= sValues[ 0 ];
-+ aValues <<= sValues;
-+
-+ aParams[ 1 ] <<= aValues;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("NPV") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(NPer)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 3 || nArgCount > 5 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+ // retrieve non-optional params
-+
-+ double rate = rPar.Get(1)->GetDouble();
-+ double pmt = rPar.Get(2)->GetDouble();
-+ double pv = rPar.Get(3)->GetDouble();
-+
-+ // set default values for Optional args
-+ double fv = 0;
-+ double type = 0;
-+
-+ // fv
-+ if ( nArgCount >= 4 )
-+ {
-+ if( rPar.Get(4)->GetType() != SbxEMPTY )
-+ fv = rPar.Get(4)->GetDouble();
-+ }
-+ // type
-+ if ( nArgCount >= 5 )
-+ {
-+ if( rPar.Get(5)->GetType() != SbxEMPTY )
-+ type = rPar.Get(5)->GetDouble();
-+ }
-+
-+ Sequence< Any > aParams( 5 );
-+ aParams[ 0 ] <<= rate;
-+ aParams[ 1 ] <<= pmt;
-+ aParams[ 2 ] <<= pv;
-+ aParams[ 3 ] <<= fv;
-+ aParams[ 4 ] <<= type;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("NPer") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(MIRR)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 3 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+
-+ // retrieve non-optional params
-+
-+ Sequence< Any > aParams( 3 );
-+ Any aValues = sbxToUnoValue( rPar.Get(1),
-+ getCppuType( (Sequence<double>*)0 ) );
-+
-+ // convert for calc functions
-+ Sequence< Sequence< double > > sValues(1);
-+ aValues >>= sValues[ 0 ];
-+ aValues <<= sValues;
-+
-+ aParams[ 0 ] <<= aValues;
-+ aParams[ 1 ] <<= makeAny( rPar.Get(2)->GetDouble() );
-+ aParams[ 2 ] <<= makeAny( rPar.Get(3)->GetDouble() );
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("MIRR") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(IRR)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 1 || nArgCount > 2 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+ // retrieve non-optional params
-+ Any aValues = sbxToUnoValue( rPar.Get(1),
-+ getCppuType( (Sequence<double>*)0 ) );
-+
-+ // convert for calc functions
-+ Sequence< Sequence< double > > sValues(1);
-+ aValues >>= sValues[ 0 ];
-+ aValues <<= sValues;
-+
-+ // set default values for Optional args
-+ double guess = 0.1;
-+ // guess
-+ if ( nArgCount >= 2 )
-+ {
-+ if( rPar.Get(2)->GetType() != SbxEMPTY )
-+ guess = rPar.Get(2)->GetDouble();
-+ }
-+
-+ Sequence< Any > aParams( 2 );
-+ aParams[ 0 ] <<= aValues;
-+ aParams[ 1 ] <<= guess;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("IRR") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(IPmt)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 4 || nArgCount > 6 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+ // retrieve non-optional params
-+
-+ double rate = rPar.Get(1)->GetDouble();
-+ double per = rPar.Get(2)->GetInteger();
-+ double nper = rPar.Get(3)->GetDouble();
-+ double pv = rPar.Get(4)->GetDouble();
-+
-+ // set default values for Optional args
-+ double fv = 0;
-+ double type = 0;
-+
-+ // fv
-+ if ( nArgCount >= 5 )
-+ {
-+ if( rPar.Get(5)->GetType() != SbxEMPTY )
-+ fv = rPar.Get(5)->GetDouble();
-+ }
-+ // type
-+ if ( nArgCount >= 6 )
-+ {
-+ if( rPar.Get(6)->GetType() != SbxEMPTY )
-+ type = rPar.Get(6)->GetDouble();
-+ }
-+
-+ Sequence< Any > aParams( 6 );
-+ aParams[ 0 ] <<= rate;
-+ aParams[ 1 ] <<= per;
-+ aParams[ 2 ] <<= nper;
-+ aParams[ 3 ] <<= pv;
-+ aParams[ 4 ] <<= fv;
-+ aParams[ 5 ] <<= type;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("IPmt") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(FV)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 3 || nArgCount > 5 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+ // retrieve non-optional params
-+
-+ double rate = rPar.Get(1)->GetDouble();
-+ double nper = rPar.Get(2)->GetDouble();
-+ double pmt = rPar.Get(3)->GetDouble();
-+
-+ // set default values for Optional args
-+ double pv = 0;
-+ double type = 0;
-+
-+ // pv
-+ if ( nArgCount >= 4 )
-+ {
-+ if( rPar.Get(4)->GetType() != SbxEMPTY )
-+ pv = rPar.Get(4)->GetDouble();
-+ }
-+ // type
-+ if ( nArgCount >= 5 )
-+ {
-+ if( rPar.Get(5)->GetType() != SbxEMPTY )
-+ type = rPar.Get(5)->GetDouble();
-+ }
-+
-+ Sequence< Any > aParams( 5 );
-+ aParams[ 0 ] <<= rate;
-+ aParams[ 1 ] <<= nper;
-+ aParams[ 2 ] <<= pmt;
-+ aParams[ 3 ] <<= pv;
-+ aParams[ 4 ] <<= type;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FV") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(DDB)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 4 || nArgCount > 5 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+ // retrieve non-optional params
-+
-+ double cost = rPar.Get(1)->GetDouble();
-+ double salvage = rPar.Get(2)->GetDouble();
-+ double life = rPar.Get(3)->GetDouble();
-+ double period = rPar.Get(4)->GetDouble();
-+
-+ // set default values for Optional args
-+ double factor = 2;
-+
-+ // factor
-+ if ( nArgCount >= 5 )
-+ {
-+ if( rPar.Get(5)->GetType() != SbxEMPTY )
-+ factor = rPar.Get(5)->GetDouble();
-+ }
-+
-+ Sequence< Any > aParams( 5 );
-+ aParams[ 0 ] <<= cost;
-+ aParams[ 1 ] <<= salvage;
-+ aParams[ 2 ] <<= life;
-+ aParams[ 3 ] <<= period;
-+ aParams[ 4 ] <<= factor;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DDB") ), rPar.Get( 0 ) );
-+}
-+
-+RTLFUNC(Rate)
-+{
-+ (void)pBasic;
-+ (void)bWrite;
-+
-+ ULONG nArgCount = rPar.Count()-1;
-+
-+ if ( nArgCount < 3 || nArgCount > 6 )
-+ {
-+ StarBASIC::Error( SbERR_BAD_ARGUMENT );
-+ return;
-+ }
-+ // retrieve non-optional params
-+
-+ double nper = 0;
-+ double pmt = 0;
-+ double pv = 0;
-+
-+ nper = rPar.Get(1)->GetDouble();
-+ pmt = rPar.Get(2)->GetDouble();
-+ pv = rPar.Get(3)->GetDouble();
-+
-+ // set default values for Optional args
-+ double fv = 0;
-+ double type = 0;
-+ double guess = 0.1;
-+
-+ // fv
-+ if ( nArgCount >= 4 )
-+ {
-+ if( rPar.Get(4)->GetType() != SbxEMPTY )
-+ fv = rPar.Get(4)->GetDouble();
-+ }
-+
-+ // type
-+ if ( nArgCount >= 5 )
-+ {
-+ if( rPar.Get(5)->GetType() != SbxEMPTY )
-+ type = rPar.Get(5)->GetDouble();
-+ }
-+
-+ // guess
-+ if ( nArgCount >= 6 )
-+ {
-+ if( rPar.Get(6)->GetType() != SbxEMPTY )
-+ type = rPar.Get(6)->GetDouble();
-+ }
-+
-+ Sequence< Any > aParams( 6 );
-+ aParams[ 0 ] <<= nper;
-+ aParams[ 1 ] <<= pmt;
-+ aParams[ 2 ] <<= pv;
-+ aParams[ 3 ] <<= fv;
-+ aParams[ 4 ] <<= type;
-+ aParams[ 5 ] <<= guess;
-+
-+ CallFunctionAccessFunction( aParams, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Rate") ), rPar.Get( 0 ) );
-+}
-+
- RTLFUNC(StrReverse)
- {
- (void)pBasic;
-diff --git basic/source/runtime/rtlproto.hxx basic/source/runtime/rtlproto.hxx
-index 3564a46..7f4df3c 100644
---- basic/source/runtime/rtlproto.hxx
-+++ basic/source/runtime/rtlproto.hxx
-@@ -167,29 +167,41 @@ extern RTLFUNC(Kill); // JSM
- extern RTLFUNC(MkDir); // JSM
- extern RTLFUNC(RmDir); // JSM
- extern RTLFUNC(SendKeys); // JSM
-+extern RTLFUNC(DDB);
- extern RTLFUNC(DoEvents);
- extern RTLFUNC(DimArray);
- extern RTLFUNC(Dir);
- extern RTLFUNC(Exp);
- extern RTLFUNC(FileLen);
- extern RTLFUNC(Fix);
-+extern RTLFUNC(FV);
- extern RTLFUNC(Hex);
- extern RTLFUNC(Input);
- extern RTLFUNC(InStr);
- extern RTLFUNC(InStrRev);
- extern RTLFUNC(Int);
-+extern RTLFUNC(IPmt);
-+extern RTLFUNC(IRR);
- extern RTLFUNC(Join);
- extern RTLFUNC(LCase);
- extern RTLFUNC(Left);
- extern RTLFUNC(Log);
- extern RTLFUNC(LTrim);
- extern RTLFUNC(Mid);
-+extern RTLFUNC(MIRR);
-+extern RTLFUNC(NPer);
-+extern RTLFUNC(NPV);
- extern RTLFUNC(Oct);
-+extern RTLFUNC(Pmt);
-+extern RTLFUNC(PPmt);
-+extern RTLFUNC(PV);
-+extern RTLFUNC(Rate);
- extern RTLFUNC(Replace);
- extern RTLFUNC(Right);
- extern RTLFUNC(RTrim);
- extern RTLFUNC(RTL);
- extern RTLFUNC(Sgn);
-+extern RTLFUNC(SLN);
- extern RTLFUNC(Space);
- extern RTLFUNC(Split);
- extern RTLFUNC(Sqr);
-@@ -197,6 +209,7 @@ extern RTLFUNC(Str);
- extern RTLFUNC(StrComp);
- extern RTLFUNC(String);
- extern RTLFUNC(StrReverse);
-+extern RTLFUNC(SYD);
- extern RTLFUNC(Tan);
- extern RTLFUNC(UCase);
- extern RTLFUNC(Val);
-diff --git basic/source/runtime/stdobj.cxx basic/source/runtime/stdobj.cxx
-index f997065..38ba7cd 100644
---- basic/source/runtime/stdobj.cxx
-+++ basic/source/runtime/stdobj.cxx
-@@ -175,7 +175,12 @@ static Methods aMethods[] = {
- { "expression", SbxVARIANT, 0,NULL,0 },
- { "CVErr", SbxVARIANT, 1 | _FUNCTION, RTLNAME(CVErr),0 },
- { "expression", SbxVARIANT, 0,NULL,0 },
--
-+{ "DDB", SbxDOUBLE, 5 | _FUNCTION | _COMPTMASK, RTLNAME(DDB),0 },
-+ { "Cost", SbxDOUBLE, 0, NULL,0 },
-+ { "Salvage", SbxDOUBLE, 0, NULL,0 },
-+ { "Life", SbxDOUBLE, 0, NULL,0 },
-+ { "Period", SbxDOUBLE, 0, NULL,0 },
-+ { "Factor", SbxVARIANT, _OPT, NULL,0 },
- { "Date", SbxDATE, _LFUNCTION,RTLNAME(Date),0 },
- { "DateAdd", SbxDATE, 3 | _FUNCTION, RTLNAME(DateAdd),0 },
- { "Interval", SbxSTRING, 0,NULL,0 },
-@@ -273,6 +278,12 @@ static Methods aMethods[] = {
- { "FreeLibrary", SbxNULL, 1 | _FUNCTION, RTLNAME(FreeLibrary),0 },
- { "Modulename", SbxSTRING, 0,NULL,0 },
-
-+{ "FV", SbxDOUBLE, 5 | _FUNCTION | _COMPTMASK, RTLNAME(FV),0 },
-+ { "Rate", SbxDOUBLE, 0, NULL,0 },
-+ { "NPer", SbxDOUBLE, 0, NULL,0 },
-+ { "Pmt", SbxDOUBLE, 0, NULL,0 },
-+ { "PV", SbxVARIANT, _OPT, NULL,0 },
-+ { "Due", SbxVARIANT, _OPT, NULL,0 },
- { "Get", SbxNULL, 3 | _FUNCTION, RTLNAME(Get),0 },
- { "filenumber", SbxINTEGER, 0,NULL,0 },
- { "recordnumber", SbxLONG, 0,NULL,0 },
-@@ -333,6 +344,16 @@ static Methods aMethods[] = {
- { "Compare", SbxINTEGER, _OPT, NULL,0 },
- { "Int", SbxDOUBLE, 1 | _FUNCTION, RTLNAME(Int),0 },
- { "number", SbxDOUBLE, 0,NULL,0 },
-+{ "IPmt", SbxDOUBLE, 6 | _FUNCTION | _COMPTMASK, RTLNAME(IPmt),0 },
-+ { "Rate", SbxDOUBLE, 0, NULL,0 },
-+ { "Per", SbxDOUBLE, 0, NULL,0 },
-+ { "NPer", SbxDOUBLE, 0, NULL,0 },
-+ { "PV", SbxDOUBLE, 0, NULL,0 },
-+ { "FV", SbxVARIANT, _OPT, NULL,0 },
-+ { "Due", SbxVARIANT, _OPT, NULL,0 },
-+{ "IRR", SbxDOUBLE, 2 | _FUNCTION | _COMPTMASK, RTLNAME(IRR),0 },
-+ { "ValueArray", SbxARRAY, 0, NULL,0 },
-+ { "Guess", SbxVARIANT, _OPT, NULL,0 },
- { "IsArray", SbxBOOL, 1 | _FUNCTION, RTLNAME(IsArray),0 },
- { "Variant", SbxVARIANT, 0,NULL,0 },
- { "IsDate", SbxBOOL, 1 | _FUNCTION, RTLNAME(IsDate),0 },
-@@ -401,6 +422,10 @@ static Methods aMethods[] = {
- { "Length", SbxLONG, _OPT, NULL,0 },
- { "Minute", SbxINTEGER, 1 | _FUNCTION, RTLNAME(Minute),0 },
- { "Date", SbxDATE, 0,NULL,0 },
-+{ "MIRR", SbxDOUBLE, 2 | _FUNCTION | _COMPTMASK, RTLNAME(MIRR),0 },
-+ { "ValueArray", SbxARRAY, 0, NULL,0 },
-+ { "FinanceRate", SbxDOUBLE, 0, NULL,0 },
-+ { "ReinvestRate", SbxDOUBLE, 0, NULL,0 },
- { "MkDir", SbxNULL, 1 | _FUNCTION, RTLNAME(MkDir),0 },
- { "pathname", SbxSTRING, 0,NULL,0 },
- { "Month", SbxINTEGER, 1 | _FUNCTION, RTLNAME(Month),0 },
-@@ -417,6 +442,15 @@ static Methods aMethods[] = {
-
- { "Nothing", SbxOBJECT, _CPROP, RTLNAME(Nothing),0 },
- { "Now", SbxDATE, _FUNCTION, RTLNAME(Now),0 },
-+{ "NPer", SbxDOUBLE, 5 | _FUNCTION | _COMPTMASK, RTLNAME(NPer),0 },
-+ { "Rate", SbxDOUBLE, 0, NULL,0 },
-+ { "Pmt", SbxDOUBLE, 0, NULL,0 },
-+ { "PV", SbxDOUBLE, 0, NULL,0 },
-+ { "FV", SbxVARIANT, _OPT, NULL,0 },
-+ { "Due", SbxVARIANT, _OPT, NULL,0 },
-+{ "NPV", SbxDOUBLE, 2 | _FUNCTION | _COMPTMASK, RTLNAME(NPV),0 },
-+ { "Rate", SbxDOUBLE, 0, NULL,0 },
-+ { "ValueArray", SbxARRAY, 0, NULL,0 },
- { "Null", SbxNULL, _CPROP, RTLNAME(Null),0 },
-
- { "Oct", SbxSTRING, 1 | _FUNCTION, RTLNAME(Oct),0 },
-@@ -428,16 +462,46 @@ static Methods aMethods[] = {
- { "stop", SbxLONG, 0,NULL,0 },
- { "interval", SbxLONG, 0,NULL,0 },
- { "Pi", SbxDOUBLE, _CPROP, RTLNAME(PI),0 },
-+
-+{ "Pmt", SbxDOUBLE, 5 | _FUNCTION | _COMPTMASK, RTLNAME(Pmt),0 },
-+ { "Rate", SbxDOUBLE, 0, NULL,0 },
-+ { "NPer", SbxDOUBLE, 0, NULL,0 },
-+ { "PV", SbxDOUBLE, 0, NULL,0 },
-+ { "FV", SbxVARIANT, _OPT, NULL,0 },
-+ { "Due", SbxVARIANT, _OPT, NULL,0 },
-+
-+{ "PPmt", SbxDOUBLE, 6 | _FUNCTION | _COMPTMASK, RTLNAME(PPmt),0 },
-+ { "Rate", SbxDOUBLE, 0, NULL,0 },
-+ { "Per", SbxDOUBLE, 0, NULL,0 },
-+ { "NPer", SbxDOUBLE, 0, NULL,0 },
-+ { "PV", SbxDOUBLE, 0, NULL,0 },
-+ { "FV", SbxVARIANT, _OPT, NULL,0 },
-+ { "Due", SbxVARIANT, _OPT, NULL,0 },
-+
- { "Put", SbxNULL, 3 | _FUNCTION, RTLNAME(Put),0 },
- { "filenumber", SbxINTEGER, 0,NULL,0 },
- { "recordnumber", SbxLONG, 0,NULL,0 },
- { "variablename", SbxVARIANT, 0,NULL,0 },
-
-+{ "PV", SbxDOUBLE, 5 | _FUNCTION | _COMPTMASK, RTLNAME(PV),0 },
-+ { "Rate", SbxDOUBLE, 0, NULL,0 },
-+ { "NPer", SbxDOUBLE, 0, NULL,0 },
-+ { "Pmt", SbxDOUBLE, 0, NULL,0 },
-+ { "FV", SbxVARIANT, _OPT, NULL,0 },
-+ { "Due", SbxVARIANT, _OPT, NULL,0 },
-+
- { "QBColor", SbxLONG, 1 | _FUNCTION, RTLNAME(QBColor),0 },
- { "number", SbxINTEGER, 0,NULL,0 },
-
- { "Randomize", SbxNULL, 1 | _FUNCTION, RTLNAME(Randomize),0 },
- { "Number", SbxDOUBLE, _OPT, NULL,0 },
-+{ "Rate", SbxDOUBLE, 6 | _FUNCTION | _COMPTMASK, RTLNAME(Rate),0 },
-+ { "NPer", SbxDOUBLE, 0, NULL,0 },
-+ { "Pmt", SbxDOUBLE, 0, NULL,0 },
-+ { "PV", SbxDOUBLE, 0, NULL,0 },
-+ { "FV", SbxVARIANT, _OPT, NULL,0 },
-+ { "Due", SbxVARIANT, _OPT, NULL,0 },
-+ { "Guess", SbxVARIANT, _OPT, NULL,0 },
- { "Red", SbxINTEGER, 1 | _FUNCTION, RTLNAME(Red),0 },
- { "RGB-Value", SbxLONG, 0,NULL,0 },
- { "Reset", SbxNULL, 0 | _FUNCTION, RTLNAME(Reset),0 },
-@@ -492,6 +556,15 @@ static Methods aMethods[] = {
- { "WindowStyle", SbxINTEGER, _OPT, NULL,0 },
- { "Sin", SbxDOUBLE, 1 | _FUNCTION, RTLNAME(Sin),0 },
- { "number", SbxDOUBLE, 0,NULL,0 },
-+{ "SLN", SbxDOUBLE, 2 | _FUNCTION | _COMPTMASK, RTLNAME(SLN),0 },
-+ { "Cost", SbxDOUBLE, 0,NULL,0 },
-+ { "Double", SbxDOUBLE, 0,NULL,0 },
-+ { "Life", SbxDOUBLE, 0,NULL,0 },
-+{ "SYD", SbxDOUBLE, 2 | _FUNCTION | _COMPTMASK, RTLNAME(SYD),0 },
-+ { "Cost", SbxDOUBLE, 0,NULL,0 },
-+ { "Salvage", SbxDOUBLE, 0,NULL,0 },
-+ { "Life", SbxDOUBLE, 0,NULL,0 },
-+ { "Period", SbxDOUBLE, 0,NULL,0 },
- { "Space", SbxSTRING, 1 | _FUNCTION, RTLNAME(Space),0 },
- { "string", SbxLONG, 0,NULL,0 },
- { "Spc", SbxSTRING, 1 | _FUNCTION, RTLNAME(Spc),0 },
-diff --git sc/source/ui/vba/vbawsfunction.cxx sc/source/ui/vba/vbawsfunction.cxx
-index 6d6629b..101e1c9 100644
---- sc/source/ui/vba/vbawsfunction.cxx
-+++ sc/source/ui/vba/vbawsfunction.cxx
-@@ -74,13 +74,48 @@ ScVbaWSFunction::invoke(const rtl::OUString& FunctionName, const uno::Sequence<
-
- for (int i=0; i < Params.getLength();i++)
- {
-+ aArrayTemp[i]= aArray[i];
- uno::Reference<excel::XRange> myRange( aArray[ i ], uno::UNO_QUERY );
- if ( myRange.is() )
- {
- aArrayTemp[i] = myRange->getCellRange();
- continue;
- }
-- aArrayTemp[i]= aArray[i];
-+ else if ( aArray[ i ].getValueType().getTypeClass() == uno::TypeClass_SEQUENCE )
-+ {
-+ // the sheet.FunctionAccess service doesn't deal with Sequences, only Sequences of Sequence
-+ uno::Type aType = aArray[ i ].getValueType();
-+ if ( aType.equals( getCppuType( (uno::Sequence<sal_Int16>*)0 ) ) )
-+ {
-+ uno::Sequence< uno::Sequence< sal_Int16 > > aTmp(1);
-+ aArray[ i ] >>= aTmp[ 0 ];
-+ aArrayTemp[i] <<= aTmp;
-+ }
-+ else if ( aType.equals( getCppuType( (uno::Sequence<sal_Int32>*)0 ) ) )
-+ {
-+ uno::Sequence< uno::Sequence< sal_Int32 > > aTmp(1);
-+ aArray[ i ] >>= aTmp[ 0 ];
-+ aArrayTemp[i] <<= aTmp;
-+ }
-+ else if ( aType.equals( getCppuType( (uno::Sequence<double>*)0 ) ) )
-+ {
-+ uno::Sequence< uno::Sequence< double > > aTmp(1);
-+ aArray[ i ] >>= aTmp[ 0 ];
-+ aArrayTemp[i] <<= aTmp;
-+ }
-+ else if ( aType.equals( getCppuType( (uno::Sequence<rtl::OUString>*)0 ) ) )
-+ {
-+ uno::Sequence< uno::Sequence< rtl::OUString > > aTmp(1);
-+ aArray[ i ] >>= aTmp[ 0 ];
-+ aArrayTemp[i] <<= aTmp;
-+ }
-+ else if ( aType.equals( getCppuType( (uno::Sequence<uno::Any>*)0 ) ) )
-+ {
-+ uno::Sequence< uno::Sequence<uno::Any > > aTmp(1);
-+ aArray[ i ] >>= aTmp[ 0 ];
-+ aArrayTemp[i] <<= aTmp;
-+ }
-+ }
- }
-
- for ( int count=0; count < aParamTemp.getLength(); ++count )