How do I get a function that says if B2 or C2 is empty the result is empty, but otherwise C2 is divided by B2
The term “user defined function” for Calc is commonly supposed to mean a function added - based on user code, that’s by programming - to the standard functions of Calc. What you got suggested by @hjek and accepted as a correct answer is not something of that kind. In commonly used terms it is a formula (aka spreadsheet-formula"). Given the literal subject the other answer was correct though probably not very helpful to you. No reason, however, to downvote it. Serious attempt to help!
It’s fairly simple to literally translate your requirements
if B2 or C2 is empty the result is empty, but otherwise C2 is divided by B2
to a formula
=IF(OR(ISBLANK(B2), ISBLANK(C2)), "", C2/B2)
I think your question is good and precise, but the headline is misleading, because User-Defined Functions has to do with using macros to defined named functions, whereas your problem can be solved just fine with a simple formula.
(If this works for you, please click on the ✓ to accept the answer.)
Works perfect. Many thanks.
Every macro written in LO BASIC as FUNCTION can be used as function in Calc. LO BASIC Functions, when used as Calc functions, get the current cell as parameter and return a value to the cell.
Edited by @Lupp:
More precise: The parameters passed to the function are described by the parameter list appended (enclosed in parentheses) to the function’s name. Each parameter may be a constant or a reference or a formula again. When called from a cell’s formula the function gets passed parameters always as if specified ‘ByVal’ in Calc. (Excel may do it otherwise.)
Thanks for your answer. I am not proficient in Libre and am not familiar with the terms LO BASIC. Can you refer me to a source that explains this in more basic terms?
@Calcasieu You should read this essential book. It’s the best out there that I’ve yet found: OpenOffice.org Macros Explained - OOME_3_0 Andrew Pitonyak -669 pages
@Lupp, Thank you this was what I was looking for.
In OpenOffice.org Macros Explained - OOME_3_0 by Andrew Pitonyak -669 pages, on page 514 or section 15.7 is ‘Write your own Calc functions’.
Here is another example to fill in for a missing function in standard Calc:
This Basic Macro adds a new Calc function that can format a number as a string using the Basic (not Calc)
format function to do the work, for example you can now format a number as a string with leading zeros or the like:
Function FORMAT_(Number As Integer, sFormat As String) As Variant Dim s$ : s=format(CStr(Number), sFormat) Format_ = s End Function
Note that this could not simply be named Format, as that name conflicts with the other built in function named Format. (I think it’s strange that Calc can’t seem to use that built in function, but that is something to figure out another day. Also I was surprised that I couldn’t find a function in Calc to format a number as a string, perhaps it’s there by a name that I just haven’t found yet.)
If you just want to keep it simple this works the same as the code above:
Function FORMAT_(N, s) As Variant : Format_ = format(CStr(N), s) : End Function
Then call your new Basic macro in a cell formula just like any other function, with the name followed by a parenthesized list of parameters, like this:
=FORMAT_(A15,"0#") & "/" & FORMAT_(B15,"0#") & "/" & C15 to format a fixed width date string from Day, Month, and Year integer columns. The
0# string parameter says to output a string where if the 10’s numeral (in a 2 digit number the left most numeral) is missing then display a zero, and a numeral 0-9 for the right most digit. I.e. 5 → “05”, and 15 → “15”.
Once you’ve created your Basic Macro, to get it to work, you must do two things: First save your Calc doc. Then do
Reloadand be sure to click on
Enable Macroswhen it reloads. This will cause Calc to read the new list of available Basic Macros.
Also after you make any further edits to your macro, you can hit the
F9key to cause Calc to re-calculate using the newly edited macro code.
I will try this since it is the most elegant solution, but it occurred to me that my time value would best be displayed as <days>.<fraction_of_days> after a short amount to accumulation (i.e. the fractional part becomes less significant), so the simplest solution is to let it be tracked as if it was a date/time value, but use integer.fraction as the format string (i.e. 0.00).