下位互換機能

適用対象: Excel 2013 | Office 2013 | Visual Studio

このトピックでは、Microsoft Excel の各バージョンにおける XLL 互換性の問題について説明します。

便利な定数の定義

XLL プロジェクト コードに、次に示すような定義を組み込んで、このコンテキストで使用されるすべてのリテラルによる数値のインスタンスを置き換えることを検討してください。 これにより、バージョン固有のコードが明確になり、バージョンに関連する一見無害な形の数値によるバグが発生する可能性を抑えられるようになります。

#define MAX_XL11_ROWS            65536
#define MAX_XL11_COLS              256
#define MAX_XL12_ROWS          1048576
#define MAX_XL12_COLS            16384
#define MAX_XL11_UDF_ARGS           30
#define MAX_XL12_UDF_ARGS          255
#define MAX_XL4_STR_LEN           255u
#define MAX_XL12_STR_LEN        32767u

実行中のバージョンの取得

を使用して実行されているバージョンを Excel4(xlfGetWorkspace, &version, 1, &arg)検出する必要があります。ここで arg数値 XLOPER は 2 に設定され、version は文字列 XLOPER であり、整数に強制できます。 For Microsoft Excel 2013, this is 15.0. You should do this in, or from, the xlAutoOpen function. You can then set a global variable that informs all of the modules in your project which version of Excel is running. Your code can then decide whether to call the C API using Excel12 and XLOPER12s, or using Excel4 using XLOPERs.

C API のバージョンを検出するために XLCallVer を呼び出すことができますが、この方法では、Excel 2007 より前のどのバージョンを実行しているかについては示されません。

デュアル インターフェイスをエクスポートするアドインの作成

文字列を受け取り、ワークシートのデータ型の任意の値を返す XLL 関数を考えてみましょう。 型 "PD" として登録され、次のようにプロトタイプ化された関数をエクスポートできます。ここで、文字列は長さカウントバイト文字列として渡されます。

LPXLOPER WINAPI my_xll_fn(unsigned char *arg);

����͊����ɓ��삵�܂����A�����‚��̗��R����AExcel 2007 �ȍ~�̃R�[�h�ɑ΂��闝�z�I�ȃC���^�[�t�F�C�X�ɂ͂Ȃ�܂���B

  • C API �̃o�C�g������Ɋւ��鐧�����������AExcel 2007 �ȍ~�ŃT�|�[�g����钷�� Unicode ������ɃA�N�Z�X�ł��܂���B
  • Excel 2007 �ȍ~�� Excel �́A XLOPER �̎󂯓n�����”\�ł��B�������A����͓���I�� XLOPER12 �ɕϊ�����邽�߁AExcel 2007 �ȍ~�ł́A�ȑO�� Excel �̃o�[�W�����̃R�[�h�Ŏ��s����ꍇ�ɂ͑��݂��Ȃ��ÖٓI�ȕϊ��̃I�[�o�[�w�b�h���������܂��B
  • この関数をスレッド セーフにすることができますが、型文字列が に PD$変更された場合、Excel 2007 より前の起動時に登録が失敗します。

これらの理由から、理想的には、Excel 2007 以降では、 として QD%$登録されたユーザーの関数をエクスポートする必要があります。コードがスレッド セーフであり、次のようにプロトタイプ化されていると仮定します。

LPXLOPER12 WINAPI my_xll_fn_v12(wchar_t *arg);

Excel 2007 �ȍ~�ł͕ʂ̊֐���o�^���邱�Ƃ��]�܂������ 1 �‚̗��R�́AXLL �֐����ő� 255 �‚̈�����󂯓���� (�ȑO�̃o�[�W�����ł� 30 �‚ɐ�������Ă��܂���)�B

好都合なことに、プロジェクトから両方のバージョンをエクスポートすると、両方のメリットが得られます。 その後、実行中の Excel バージョンを検出して、最適な関数を条件によって登録します。 詳細と実装例については、「 Excel 2007 でのアドイン (XLL) の開発」を参照してください。

この方法により、Excel 2003 で実行されているワークシートに、Excel 2007 以降で実行されている同じシートとは異なる結果が表示される可能性があります。 たとえば、Excel 2003 では Excel 2003 ワークシート セル内の Unicode 文字列を ASCII バイト文字列にマッピングし、その文字列を切り詰めてから XLL 関数に渡します。 Excel 2007 以降、Excel は変換されていない Unicode 文字列を正しい方法で登録された XLL 関数に渡します。 これが、異なる結果の原因になります。 このような可能性とユーザーへの影響に対する注意は、アップグレード時以外にも必要になります。 たとえば、いくつかの組み込みの数値関数は、Excel 2000 と Excel 2003 との間で改善されています。

新しいワークシート関数と分析ツール関数

分析ツール (ATP) 関数は、Excel 2007 以降の Excel に含まれています。 以前は、XLL では xlUDF を使用することでのみ ATP 関数を呼び出せました。 Starting in Excel 2007, the ATP functions should be called using the function enumerations defined in xlcall.h. 「DLL からのユーザー定義関数の呼び出し」の例では、2 通りの方法を示しています。

関連項目