In the last post I described how to set up a Visual Studio solution to build xll addins using XLW. For the introduction to XLW series take a look at the first post. Today I am going to show how easy it is to create user defined functions (UDF) for Excel using XLW.
The starting point will be the solution we set up in the previous post. If you don’t have set it up you can download it.
The project contains two files that we are going to modify to add new functions:
-
mylib.h
1 2 3 4 5 6 7 8 9 10 11 12
#ifndef _mylib_h_ #define _mylib_h_ #include <xlw/xlw.h> //<xlw:libraryname=MyLibrary double //Square root of an argument MySqrt(double x //argument ); #endif
-
mylib.cpp
1 2 3 4 5 6 7 8 9 10 11
#include "mylib.h" #include <math.h> double MySqrt(double x) { if( x < 0. ) { throw("#Negative argument"); } return sqrt(x); }
The third file (xlwmylib.cpp
) is autogenerated by the build process.
1. Library Name
Library Name is a term XLW uses to tell in which category you can find your
functions in the Function Wizard: \
\
The name of the library is specified in the file mylib.h
on the line 6:
//<xlw:libraryname=MyLibrary
2. Basic Function
Consider a function definition, which should be placed in mylib.h
file:
|
|
- {:.dl-lines}
- Line 1
- contains type of results the function returns and comment with function description as it will appear in Excel’s function wizard
- Line 2
- contains the name of the function (Function in Excel will have same name),
and definition of the first argument. The comment is a description of the
argument as it will appear in Excel’s function wizard.
Note: if you need to include quotes in description string escape them with
backslash, e.g.:
// argument \"1\"
- Line 3
- contains the second argument with its description
- Line 4
- ends function definition
3. Handling Errors
It is possible to return an error message to Excel from a function. Consider
the example with SumSqrt
function. Put the following code in mylib.cpp
:
|
|
- {:.dl-lines}
- Line 6
- check if any of the arguments is negative
- Line 8
- if we have a negative argument we throw an error with message
#Negative argument
As a result, the Excel function displays string #Negative argument
if any of
the arguments is negative or numeric result if both numbers are non-negative.
4. Basic input/output data types
double
bool
std::string
int
- although it can be used as an input type it cannot be an output type. Convert it todouble
for output.
5. Happy Coding!
If you want to see the code described in this post in action you can
download updated mylib
library. It also
contains changes introduced in the next post.