Page 1 of 1

[Solved] Defining Variables for Functionaccess

Posted: Sat Jun 29, 2019 5:22 pm
by sokolowitzky
Here I attach a screen shot of the error I got.
Due to some other functions I use, I must declare "option explicit" in the module.
In this case I must define all variables.
And calc basic does not accept the way I define variables.

I'd be very glad if someone could tell me what is wrong with this code.

Code: Select all

option explicit
sub essayer
dim fndtxt as string
dim searchn as string
 fndtxt="."
 searchn="aaa.1"
 msgbox cFND(fndtxt, searchn)
 end sub

  function cFND (fndtxt as string, searchn as string)
 dim FuncAcc 
 ' The first argument to callFunction() is the Calc Function Name
 ' The 2nd argument is the parameters of that function as an array
 FuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")
 FND = FuncAcc.callFunction( "FIND" , array(fndtxt, searchn))
 ' msgbox SBST 
 cFND = FND
 End function

Re: Defining Variables for Functionaccess

Posted: Sat Jun 29, 2019 5:32 pm
by Villeroy
FND is not defined

Re: Defining Variables for Functionaccess

Posted: Sat Jun 29, 2019 5:36 pm
by sokolowitzky
It's still the same.

Re: Defining Variables for Functionaccess

Posted: Sat Jun 29, 2019 5:43 pm
by Villeroy
Remove "as object". StarBasic is somewhat broken when it comes to explicit variable types.
 Edit: "as object" is wrong anyway. The return value of that function is an integer or an error if the search string is not found 

Re: Defining Variables for Functionaccess

Posted: Sat Jun 29, 2019 6:52 pm
by sokolowitzky
thank you. I think I can figure out what is wrong now.
But now I can not make the function turn the value.
Mormally I set a function to a variable to use the value that came out of it.
But this time I can not manage it.

This is kind of a different subject. Maybe I should open a newer topic.

Code: Select all

option explicit
sub essayer
dim fndtxt as string
dim searchn as string
dim y as integer
 fndtxt="."
 searchn="aaa.1"
y = cFND(fndtxt, searchn)
'cFND(fndtxt, searchn)
msgbox "but macro can not call the value of function cFND "& chr(13)&"instead it shows """ & y &""
'msgbox asmas.value
 end sub

  function cFND (fndtxt as string, searchn as string)
 dim oFA 
 dim FND 
  dim cFND 
 ' The first argument to callFunction() is the Calc Function Name
 ' The 2nd argument is the parameters of that function as an array
 oFA = createunoservice("com.sun.star.sheet.FunctionAccess")
 FND = oFA.callFunction( "FIND" , array(fndtxt, searchn))
   cFND=FND 
msgbox "the function itself can show value of cFND as a variable,"&chr(13)&"which is = "& cFND
 End function

Re: Defining Variables for Functionaccess

Posted: Sat Jun 29, 2019 7:02 pm
by Zizi64
Why you use the FunctionAccess - what is developed to the Calc Cell functions - for searching a string in an another string? That is developed to the sheets.
In my opinion, it is better to use the function of the StarBasic named InStr():
https://help.libreoffice.org/6.2/en-US/ ... 20401.html

Re: Defining Variables for Functionaccess

Posted: Sat Jun 29, 2019 7:06 pm
by Villeroy
In case of no match, you have to handle the error which can be very tricky in StarBasic.
If this is about the FIND function only, there is Basic InStr which returns 0 in case of no match.
And we can use Python as a true programming language for macros. Python can do anything with strings.

Re: Defining Variables for Functionaccess

Posted: Sun Jun 30, 2019 1:09 am
by JeJe
The reason your function returns 0 is because you've declared a variable with the same name as the function. Remove the line,

dim cFND

As suggested above instr would be easier.

Re: [Solved] Defining Variables for Functionaccess

Posted: Sun Jun 30, 2019 5:03 am
by sokolowitzky
Thank you all of you.

@Zizi, I use a lot of spreadsheet functions in basic and sometimes I forgot or I don't know at all that there is an equivalent in Starbasic. This is one of them. I was just trying to make some function for trimming texts between dots. Thank you for your message.

Re: [Solved] Defining Variables for Functionaccess

Posted: Sun Jun 30, 2019 10:17 am
by Zizi64
The InStr() is better for your task, but the next code works for me in my LO 6.1.6 x64.

Code: Select all

REM  *****  BASIC  *****

option explicit
'******************************************************************

Sub essayer

 dim fndtxt as string
 dim searchn as string

	fndtxt="," 'The string has not contain a comma! (For trying the error hander)
	searchn="aaa.1"
	msgbox vFND(fndtxt, searchn)
end Sub
'__________________________________________________________________


Function vFND(sFndTxt as string, sSearchn as string) as variant

 dim oFuncAcc as object
	' The first argument to callFunction() is the Calc Function Name
	' The 2nd argument is the parameters of that function as an array
	on error goto errorhandler
	oFuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")

	vFND = oFuncAcc.callFunction( "FIND" , array(sFndTxt, sSearchn))
	Exit function

errorhandler:	
	vFND =  "Error " & error()

end Function
'__________________________________________________________________

Re: [Solved] Defining Variables for Functionaccess

Posted: Sun Jun 30, 2019 12:04 pm
by JeJe
For a search with more options there is also XTextSearch

https://www.openoffice.org/api/docs/com ... earch.html

See Andrew Pitonyak's OpenOffice.org Macros Explained for a listing on how to use this.

Re: [Solved] Defining Variables for Functionaccess

Posted: Sun Jun 30, 2019 5:53 pm
by Villeroy

Code: Select all

function cFND (fndtxt as string, searchn as string,optional iStart) AS Integer
dim FuncAcc
If isMissing(iStart) then iStart = 1
On Error Goto exitErr
FuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")
cFND = FuncAcc.callFunction( "FIND" , array(fndtxt, searchn, iStart))
exit sub
exitErr:
REM exit with Interger 0 
End function
And for functions other than FIND (SEARCH for instance) you may want to set some of the properties of your FunctionAccess that are derived from the document settings

Code: Select all

MatchWholeCell         boolean             
NullDate               .util.Date               
RegularExpressions     boolean                
StandardDecimals       short                    
and Wildcards (boolean, LibreOffice only)