さて皆さん、
この記事ではEXCELの各種のアドインに付いて解説した。
具体的には、
- xlamアドイン
- COMアドイン(VSTOアドインとも言う)
- XLLアドイン
だ。
この記事は結構人気がありアクセス数も多いのだが、その中でもEXCEL XLLアドインに興味を持っている人が多いようだ。
そう言う人の為に、「XLL開発完全制覇」と言う壮大なタイトルでワテが解説記事を書いてみたい。
何回まで続くか分からないが、では「XLL開発完全制覇」の第一回講座を開始しよう。
第一回目は、XLLアドイン用にマイクロソフト社が公開している
Excel 2013 SDK: Excel 2013 XLL Software Development Kit
の入手とビルド(コンパイル)だ。
Excel XLL SDKの入手とインストール
「Excel 2013 SDK: Excel 2013 XLL Software Development Kit」はここだ。
ちなみに、
「Excel 2007 SDK: Excel 2007 XLL Software Development Kit」はここだ。
本日(2017/8/31)現在、EXCEL2016やEXCEL2010用のXLL SDKは出ていない。
また、EXCEL 2007 SDKやEXCEL 2013 SDKの中身は殆ど同じだ。
興味ある人は、両者を比較してみると良いだろう。
ワテが数年前にXLL開発に凝っていた頃は、ネットを検索してもXLL開発に関する情報は殆ど無く、一人でEXCEL 2007 SDKとEXCEL 2013 SDKの中身の違いなど調べていた。
さて、そんな昔話はどうでもよいが、早速Excel 2016 SDKをダウンロードしてサンプルをビルドしてみよう。
ちなみに、ワテの環境は以下の通り。
- Windows 10 Pro (x64)
- Visual Studio 2017 Community
- Office 2013 Professional (Excel 2013も含む)
Excel 2013 SDK: Excel 2013 XLL Software Development Kitをダウンロード
Excel 2013 SDKのダウンロードサイトを開くと下図が出る。
図 Excel 2013 SDKのダウンロードサイトを開いた画面
注意事項としては、Language:English となっているが、英語版しかないのでJapaneseなどを探しても見つからない。
SDKが英語版だからと言って、それで作ったXLLが英語版EXCELでしか使えないなどの心配は無い。日本語版EXCELでも文字化けなどの問題も無く使える。フランス語版EXCELでも使えると思うがワテは試していない。
上記のサイトから excelxllsdk.msi と言う名前のインストーラーをダウンロードする(下図)。
図 Windows10のデスクトップに保存したexcelxllsdk.msi インストーラー
excelxllsdk.msi インストーラーを実行する
拡張子が .msi と言うマイクロソフトのインストーラー形式なので、実行するとインストーラーが起動する。
あとは普通にダブルクリックしてインストールすれば良いのだが、一つ補足説明しておく。
インストーラーを実行するとC言語の幾つかのサンプルソースコードやヘッダーファイルが指定先のフォルダに展開される。またコンパイル済のLibファイルもある。
インストール後は、それらのファイルは自分の好きなフォルダのコピペしてXLL開発に使えば良いので、今からインストールするSDKの保存場所には特に気を使う必要は無い。
まあ、要するにSDK一式を展開するだけの為のフォルダだ。
兎に角、インストーラーを実行してみよう。
念のためにワテは管理者権限で実行した。
まあ一般ユーザー権限でも問題は無いと思うが。
図 Excel 2013 XLL Software Development Kitインストーラーを実行した
図 End-User License Agreementに同意する
まあ、この辺りはどんどん進んでいく。
SDKのインストール先フォルダはどこでも良い
ここでフォルダ指定するが、このデフォルトのままで特に問題は無い。
その中にSDKの一式が展開されるだけだ。
図 Excel SDK展開先のフォルダを指定しても良い(普通はそのままで良い)
ちなみに、ワテは、以下のフォルダにインストールした。
D:\2013 Office System Developer Resources
どんどん進んでいく。
図 ここでInstallを押下するとインストールが開始する
インストーラーを実行したので、Windows10の場合には下図の確認画面が出る。
図 ユーザーアカウント制御の確認画面
図 無事にExcel 2013 XLL SDKのインストールが完了した
Excel 2013 XLL SDKのインスール結果を見る
Excel 2013 SDKをインストールしたので、そのフォルダを見てみよう。
D:\2013 Office System Developer Resources
を開く。
図 Excel 2013 SDKの中身(十個くらいのフォルダがある)
Excel 2013 SDKの中身は何かというと、十個くらいのフォルダがある。
フォルダ | ワテの説明 |
DOC | Welcome to the Microsoft Excel 2010 XLL Software Development Kitと言うのが起動する。Excel2010版だが、2013でも2016でも通用する。 |
INCLUDE |
XLCALL.H はこの後でXLL作成に利用する。 |
LIB |
XLCALL32.LIB は、この後でXLL作成時にリンクして使う。 |
x64 |
XLCALL32.LIB は、多分64bit版EXCEL用なのだがワテは試した事が無い。 |
SAMPLES |
Visual Studioのサンプルソリューションが三つある。 |
EXAMPLE |
先ずはこのサンプルをビルドしてみる。 |
FRAMEWORK |
.NET Frameworkとは一切関係ない。 上のEXAMPLEや下のGENERICと言うサンプルをビルドする時に必要になるスタティックライブラリだ。 ワテの理解では、このFRAMEWORKはXLL作成時に利用する便利ライブラリと言う感じ。 |
GENERIC |
二番目のサンプル |
SRC |
XLCALL.CPP, ReadMe.txt がある。ReadMe.txtにある説明を読むと良い。 FRAMEWORKのビルドで必要になる。 |
表 Excel 2013 SDKに入っているフォルダやファイルの解説(ワテの理解なので勘違いもあるかも)
では、早速サンプルプログラムをVisual Studio 2017 CommunityのC/C++でビルドしてみよう。
EXAMPLEをVisual Studio2017Communityでビルド
EXAMPLEフォルダには、拡張子 .C のソースコードやMAKEFILEなどがある。
図 EXAMPLEフォルダ
Example.slnをメモ帳で開いてみると、冒頭に以下の記述がある。
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
コード Example.slnファイルの中身(先頭のみ示す)
Example.slnはVisual Studio 2008のソリューションファイルで有る事が分る。
かなり古いサンプルだ。
Example.slnファイルをVisual Studio 2013ソリューションにアップグレード
まあ、兎に角 Example.sln をダブルクリックで開いてみる。
下図に示す「一方向アップグレード」の確認画面が出る。
図 「一方向アップグレード」の確認画面
Visual Studio 2017のソリューションにアップグレードしよう。
どんどん進んでいく。
図 VS2008からVS2013への「一方向アップグレード」の結果画面
まあ、幾つかの警告が出ているが気にしない。
EXAMPLEをVisual Studio2017でリビルドする
で、アップグレード後のソリューションファイルが起動した(下図)。
図 アップグレード後のExample.slnソリューションファイルを起動しリビルドする
上図において、兎に角リビルドしてみよう。
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー MSB3073 コマンド "SET TYPE=DEBUG SET PLATFORM=Win32 nmake -f makefile clean nmake -f makefile all" はコード 2 で終了しました。 Example C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.MakeFile.Targets 49 警告 MSB4211 プロパティ "WindowsTargetPlatformVersion" は初めて値に設定されますが、これは "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.Cpp.WindowsSDK.props (29,5)" で既に使用されています。 Example 144 警告 MSB4211 プロパティ "TargetPath" は初めて値に設定されますが、これは "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.MakeFile.Targets (25,5)" で既に使用されています。 Example 284 エラー C1083 include ファイルを開けません。'framewrk.h':No such file or directory Example D:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.c 14 エラー U1077 '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX86\x86\cl.EXE"' : リターン コード '0x2' Example D:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\NMAKE 1
図 EXAMPLEソリューションをVS2017のCコンパイラでビルドしたらエラー出まくり
そうすると、上図のようにエラーが出まくる。
その中で注意すべきエラーは以下の二つ。
nmake -f makefile clean エラー C1083 include ファイルを開けません。'framewrk.h':No such file or directory
図 EXAMPLEのビルドエラーの重要なやつ
まあ、要するに、NMakeを使ってビルドする設定になっているのと、framewrk.hファイルが見付からないと言うエラーだ。
NMakeをやめて普通のビルド設定にしておく
ワテの場合make, gmake, nmakeやmakefileなどの設定は得意ではない。
昔良くやっていたがこの所とんと使う機会が無いのですっかり忘れた。
ここは、普通にVisual Studioのデフォルトの設定に戻そう。
まあ、makefileを使いこなせる人はこのあたりは各自で好きにすると良いだろう。
図 デフォルトでは構成の種類が「メイクファイル」
早速、Makeを使わない設定にしよう。
ソリューションのプロパティを開くと上図が出るので、下図のように「すべての構成」のアクティブ(Win32)プラットフォームを選択しておく。
そして、「構成の種類」を「ダイナミックライブラリ(.dll)」に変更する。
図 構成の種類をメイクファイルからダイナミックライブラリ(.dll)に変更
上図において、[OK]ボタンを押下すると、設定が反映される。
で、再びリビルドすると、別のエラーがダダダと出ている。
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) E1696 ソース ファイルを開けません "xlcall.h" Example d:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.C 13 エラー (アクティブ) E1696 ソース ファイルを開けません "framewrk.h" Example d:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.C 14 エラー (アクティブ) E0020 識別子 "XLOPER12" が定義されていません Example d:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.C 145 エラー (アクティブ) E0020 識別子 "xlGetName" が定義されていません Example d:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.C 157 エラー (アクティブ) E0020 識別子 "xlfRegister" が定義されていません Example d:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.C 161 エラー (アクティブ) E0020 識別子 "LPXLOPER12" が定義されていません Example d:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.C 162
図 ダイナミックライブラリ(.dll)に変更してもエラー多数
まあ、要するに
xlcall.h framewrk.h
の二つのヘッダーファイルが見付からないと言う事だ。
それらは、以下のフォルダにある。
D:\2013 Office System Developer Resources\Excel2013XLLSDK\SAMPLES\FRAMEWRK\FRAMEWRK.H D:\2013 Office System Developer Resources\Excel2013XLLSDK\INCLUDE\XLCALL.H
そこで、これらのヘッダーファイルのパスを指定すればエラーを消せる。
EXAMPLE.Cファイルを開いて、先頭付近を見る。
図 ヘッダーファイルのパスを変更前のEXAMPLE.Cファイル
その部分を以下のように変更する。
#include <ctype.h> #include <windows.h> //#include <xlcall.h> // org #include "../../INCLUDE/xlcall.h" //#include <framewrk.h> // org #include "../FRAMEWRK/framewrk.h"
図 ヘッダーファイルのパスを変更したEXAMPLE.Cファイル
早速リビルドしてみる。
そうすると、別のエラーが多発した(下図)。
図 ヘッダーファイルのパスを修正してEXAMPLEプロジェクトをリビルドしたら別のエラー
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 警告 MSB4211 プロパティ "WindowsTargetPlatformVersion" は初めて値に設定されますが、これは "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.Cpp.WindowsSDK.props (29,5)" で既に使用されています。 Example 144 エラー LNK2019 未解決の外部シンボル _Excel12 が関数 _CallerExample@0 で参照されました。 Example D:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.obj 1 エラー LNK2019 未解決の外部シンボル _InitFramework が関数 _InitFrameworkExample@0 で参照されました。 Example D:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.obj 1 エラー LNK2019 未解決の外部シンボル _TempNum12 が関数 _TempNumExample@0 で参照されました。 Example D:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.obj 1 エラー LNK2019 未解決の外部シンボル _TempStr12 が関数 _TempStrExample@0 で参照されました。 Example D:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.obj 1 エラー LNK2019 未解決の外部シンボル _TempBool12 が関数 _TempBoolExample@0 で参照されました。 Example D:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.obj 1 エラー LNK2019 未解決の外部シンボル _TempInt12 が関数 _TempIntExample@0 で参照されました。 Example D:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\EXAMPLE\EXAMPLE.obj 1
図 ヘッダーファイルのパスを修正してEXAMPLEプロジェクトをリビルドしたら別のエラー
上図のエラーの理由は、「未解決の外部シンボル」と言う事なので、何らかのライブラリがリンクされていないからだ。
SAMPLE\EXAMPLES\EXAMPLE.Cの冒頭には以下の記述がある。
/* ** File: SAMPLE\EXAMPLES\EXAMPLE.C ** Description: XLL SDK Example ** ** ** This file uses the framework library ** (frmwrk32.lib). ** */ #include <ctype.h> #include <windows.h> #include "../../INCLUDE/XLCALL.H" #include "../FRAMEWRK/FRAMEWRK.H"
図 SAMPLE\EXAMPLES\EXAMPLE.Cの冒頭の記述
要するにEXAMPLE.Cをリルドするには、frmwrk32.libが必要との事。
そう言う事か。
では、先にfrmwrk32.libを作成しよう。
frmwrk32.libを作成する
Framework.slnもメイクファイルの設定だ。
このままビルドしたら正常にビルド出来たのだが、ワテの場合にはメイクファイルは嫌いなので普通のスタティックライブラリ(.lib)プロジェクトに変更しておく。
図 Frameworkプロジェクトをスタティックライブラリ(.lib)に変更する
そしてビルドしてみる。
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー C1083 include ファイルを開けません。'xlcall.h':No such file or directory Framework D:\2013 Office System Developer Resources[org]\Excel2013XLLSDK - コピー\SAMPLES\FRAMEWRK\FRAMEWRK.c 75
ぞの結果、xlcall.hが見付からないエラーが出るので、以下のように他のヘッダーファイルもパスを修正する。
#include <windows.h> #include <malloc.h> #include <wchar.h> //#include <xlcall.h> //org #include "../../INCLUDE/XLCALL.H" //#include <xlcall.cpp> //org #include "../../SRC/xlcall.cpp" //#include <framewrk.h> //org #include "../FRAMEWRK/FRAMEWRK.H" //#include <memorymanager.h> //org #include "../FRAMEWRK/MemoryManager.h" #include <stdarg.h>
図 FRAMEWRK.c のヘッダーファイル読み込み設定を修正する(修正後)
ちなみに xlcall関連のファイルは以下のフォルダにある。
D:\2013 Office System Developer Resources\Excel2013XLLSDK\INCLUDE\XLCALL.H D:\2013 Office System Developer Resources\Excel2013XLLSDK\SRC\XLCALL.CPP
XLCALL.CPPをインクルードしている部分がある。
そのXLCALL.CPPの中身も以下のように修正する。
図 FRAMEWRKプロジェクトのヘッダーファイル関連の修正箇所(修正後)
上図に於いて、XLCALL.CPPファイルをFRAMEWRKプロジェクトで開くには、ソリューションエクスプローラー画面の「外部依存関係」の中にXLCALL.CPPがあるのでクリックすると開ける。
これで、FRAMEWRKプロジェクトをリビルドしてみる。
その結果、正常にリビルド出来て、Debugフォルダの中に
Framework.lib
が出来た。
元々のメイクファイルの設定では
frmwrk32.lib
と言うファイル名で生成されるので、もし気になる人はFRAMEWRKプロジェクトの設定で、
ターゲット名 $(ProjectName)
の部分で修正しておいても良い。
Debugフォルダの中にFramework.libを無事に生成する事が出来た。それを下図に示す。
図 Debugフォルダの中にFramework.libを無事に生成する事が出来た
では、早速、Framework.libをEXAMPLEプロジェクトに組み込もう。
EXAMPLEプロジェクトにFramework.libをリンクする設定
プロジェクトの設定で、下図を出す。
図 Exampleプロパティ画面でリンカー設定を行う
上図のように「追加のライブラリディレクトリ」設定を行う。
その設定場所は、以下の通り。
リンカー 全般 追加のライブラリディレクトリ ..\FRAMEWRK\Debug
図 Exampleプロパティ画面でリンカー設定の「追加のライブラリディレクトリ」を変更する
なお、上図の例ではDebugビルドの設定なのでReleaseビルドの設定も同様にしておくと良いだろう。
次に必要なのがFramework.libをリンクする設定だ。
図 リンカーで「追加の依存ファイル」にFramework.libを追加する
変更後の状態を以下に示す。
追加の依存ファイル Framework.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
このように設定すれば完了だ。
リンカー設定が完了したので再びEXAMPLEプロジェクトをリビルド
図 リンカー設定が完了したので再びEXAMPLEプロジェクトをリビルドしたが新なエラー
また別のエラーが出たがな。
その当時のワテは、もう、この辺りで訳分からん状態だった。
エラー LNK2019 未解決の外部シンボル _Excel4 が関数 _TempActiveRef で参照されました。 Example D:\2013 Office System Developer Resources\Excel2013XLLSDK\SAMPLES\EXAMPLE\Framework.lib(FRAMEWRK.obj) エラー LNK2019 未解決の外部シンボル _Excel4v@16 が関数 _Excel で参照されました。 Example D:\2013 Office System Developer Resources\Excel2013XLLSDK\SAMPLES\EXAMPLE\Framework.lib(FRAMEWRK.obj) エラー LNK1120 2 件の未解決の外部参照
TempActiveRef, Excel, _Excel4, _Excel4v などで検索すると、FRAMEWORK.Cにある。
図 FRAMEWORK.Cにある Excel()関数
上図のExcel()と言う関数は以下の通り。
int cdecl Excel(int xlfn, LPXLOPER pxResult, int count, ...) { int xlret; va_list ppxArgs; ・・・
まあ、この関数が見付からないと言う事なのだが、結論を先に言うと、この関数は無くても良い。
従って、Excel()関数の全体を例えばこんな風に囲って無効化すると良い。
#if(0) // Excel4排除 ・・・ ・・・ #endif
図 Excel関数を無効化するために #if(0)-#endifで囲う
実際にやった結果は以下の通り。
こんな風に囲って無効化しておく。
あるいは使わないので削除してしまっても良いが。
試しにここでリビルドしてみると良い。
別の「未解決の外部参照エラー」が出ただろう。
つまり、まだ他にも使わない関数があるのでそれらを無効化する。
具体的には以下の通り。
LPXLOPER TempActiveRef(WORD rwFirst, WORD rwLast, BYTE colFirst, BYTE colLast) LPXLOPER TempActiveColumn(BYTE col) LPXLOPER TempActiveCell(WORD rw, BYTE col)
図 EXCEL2013XLLでは不要な関数を削除する
これで完了だ。
これらの作業をやっているとお気付きだと思うが、FRAMEWORKプロジェクトに於いては、末尾に4が付く関数と12が付く関数がある。
4が付く関数や何も数字が付かない関数は不要だ。
EXCEL2007以降で使えるXLLを作る場合には、12版の関数のみで良いのだ(ワテの理解)。
このようにFRAMEWORKプロジェクトを修正しておいてリビルドする。
それで生成したFramework.libを使ってEXAMPLEプロジェクトをリビルドすれば、エラー無くリビルドに成功するだろう。
その結果、
Example.dll
が生成される。
これが目的のXLLなのだが、拡張子をxllに変更して
Example.xll
にしてもEXCEL(2007, 2010, 2013, 2016など)には読み込めないと思う。
その辺りの解決方法は次回の講座で紹介したい。
まとめ
「ワレコのEXCEL XLL完全制覇講座」の第一回目が終わった。
無事に皆さんもEXAMPLEプロジェクトをリビルドする事が出来ただろうか?
ワテの場合、その当時ネット検索してもこの辺りの手順を解説しているサイトを見付ける事が出来ず、一人独学で必死で試行錯誤した記憶がある。
なので、今回紹介した手順をマスターするだけでも二、三週間掛った。
まあ、この後の講座で、今回作成したDLLをXLLとしてエクセルに読み込むまでのやり方を紹介したい。
それをマスター出来れば、XLL開発の玄関口に到達したと言っても良いだろう。
そこから先が長いのだが。
XLL開発の解説書(ワテ推薦)
検索すると同じタイトルで表紙の色違いがヒットすると思うが、それは1st Editionと2nd Editionの違いだ。なので上記の2nd Edition版がお勧めだ。
ワテの知る限り、XLL開発の解説書はこの本しかない。
ちょっと高いがXLL開発には必携の一冊だ。
コメント
XLLは馴染みのないカテゴリーでしたが、やっとExample.xll が完成しました!
次回はいつ頃ですか~?期待して待ちます。
XLL講座の続編は、今のところ未定です (^_^)
未定ですか・・・XLLは敷居が高いのでExcel-DNA+自作DLLで色々試しています。
Excel-DNAを使わない感じのも作成して見たいので、数少ないXLL講座(書籍もだけど)に期待しております。