Visual C を使用して Excel のアドイン (XLL) を作成するには、方法

文書翻訳 文書翻訳
文書番号: 178474
すべて展開する | すべて折りたたむ

目次

概要

XLL アドインは Excel で作成できますです。コンパイラは、Dll (ダイナミック リンク ライブラリ) をビルドをサポートします。この資料でXll、Microsoft Visual C での構築作業を開始するのに設計されています。するにはこの資料に記載されている手順を実行します、いくつかの経験が必要Microsoft Excel 97 開発者のキットと Dll を構築する必要があります、XLL の作成に必要なヘッダーとライブラリ ファイルを格納します。

詳細

XLL の作成手順

  1. Anewxll という名前の新しい MFC AppWizard (.dll) プロジェクトを作成します。
  2. Xlcall.h、Framewrk.h、Framewrk.c、および Xlcall32.lib からのコピー、Microsoft Excel 97 開発者のキットに、プロジェクト ディレクトリです。
  3. Framewrk.c を Framewrk.cpp に変更します。
  4. Framewrk.cpp は、プロジェクトのソース ファイルに追加します。
  5. 次の追加 #include 行を回避するのには、Framewrk.cpp の上にプリコンパイル済みヘッダーに関するコンパイラのエラー:
    
          #include "stdafx.h"
    					
  6. Framewrk.cpp で次の行を変更します。
          #include "..\..\include\xlcall.h"
    					
          #include "xlcall.h"
    					
  7. [プロジェクト] メニューの [設定] をクリックします。[リンク] タブをクリックし、追加Xlcall32.lib するには、[オブジェクト/ライブラリ モジュール ボックスを編集します。
  8. 次の追加 #include ステートメント Anewxll.cpp の先頭に。
          #include "xlcall.h"
          #include "framewrk.h"
    					
    注: プロジェクト今すぐセットアップを適切には、コンパイルする必要があります。ただし、XLL サポートまだ追加されていません。残りの手順を提供します。いくつかのサンプル コードは、作業を開始するのには、XLL に追加できます。

  9. Anewxll.cpp するには、次のコードを追加します。サンプル コード-----------
          //================================================================
          // Commonly used global variables
          int err;
          char buf[8192];
          char txt[8192];
    
          // Function registering table
          int nFuncs;
    
          // proc, type_text, function_text, arg, macro_type, category,
          // shortcut_text, help_topic, function_help
          static LPSTR func[][9] = {
          {" MyFunc", " JJJ", " MyFunc", " ", " 1", " MyCat", " ", " ", " "},
          {" MyMotd", " I", " MyMotd", " ", " 1", " MyCat", " ", " ", " "},
          {0,0,0,0, 0, 0, 0}
          };
    
          // Menu table
          int nMenuItems;
    
          static LPSTR menu[][5] = {
          {" &MyMenu", " ", " ", " Joe's Xll menu!!!", " "},
          {" M.O.T.D."," MyMotd", " ", " Message of the Day!", " "},
          {0, 0, 0, 0, 0}
          };
    
          // Initialization routine
          BOOL __stdcall xlAutoOpen(void) {
             AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
    
             // DEBUG output to indicate when called
             AfxMessageBox("xlAutoOpen() called!", MB_SETFOREGROUND);
    
             int i, j;
    
             // Get XLL file name
             static XLOPER xDll;
             Excel(xlGetName, &xDll, 0);
    
             // Prefix strengths with their length & count items
             // Note the framework's TempStr() function prefixes the
             // lengths anyway, but this is for other code that might
             // use the arrays
             for(nFuncs=0;     func[nFuncs][0];     nFuncs++) {
                 for(i=0; i<9; i++) {
                     func[nFuncs][i][0]     = (BYTE) strlen(func[nFuncs][i]+1);
                 }
    
             }
    
             for(nMenuItems=0; menu[nMenuItems][0]; nMenuItems++) {
                 for(i=0; i<5; i++) {
                 menu[nMenuItems][i][0] = (BYTE) strlen(menu[nMenuItems][i]+1);
                 }
             }
    
             // Loop through the function list, and register the functions
             for(i=0; i<nFuncs; i++) {
    
                // Register a function
                err = Excel(xlfRegister, 0, 9, (LPXLOPER)&xDll,
                   (LPXLOPER)TempStr(func[i][0]),
                   (LPXLOPER)TempStr(func[i][1]),
                   (LPXLOPER)TempStr(func[i][2]),
                   (LPXLOPER)TempStr(func[i][3]),
                   (LPXLOPER)TempStr(func[i][4]),
                   (LPXLOPER)TempStr(func[i][5]),
                   (LPXLOPER)TempStr(func[i][6]),
                   (LPXLOPER)TempStr(func[i][7]),
                   (LPXLOPER)TempStr(func[i][8])
                   );
    
                if(err != xlretSuccess) {
                 sprintf(buf, "xlfRegister for function %d, err = %d", i, err);
                 AfxMessageBox(buf, MB_SETFOREGROUND);
                }
             }
    
             // Free XLL file name from the xlGetName call made earlier
             Excel(xlFree, 0, 1, (LPXLOPER)&xDll);
    
             // Menu support section
             static XLOPER xMenu;
             static XLOPER xMenuList[10*5];
             ASSERT(nMenuItems< 10);
    
             // Build menu
             xMenu.xltype            = xltypeMulti;
             xMenu.val.array.lparray = &xMenuList[0];
             xMenu.val.array.rows    = nMenuItems;
             xMenu.val.array.columns = 5;
    
             for(i=0; i<nMenuItems; i++) {
                 for(j=0; j<5; j++) {
                     xMenuList[j+i*5].xltype  = xltypeStr;
                     xMenuList[j+i*5].val.str = menu[i][j];
                 }
             }
    
             // Add menu
            Excel(xlfAddMenu,0,3,TempNum(1),(LPXLOPER)&xMenu,TempStr(" Help"));
    
             // Finished
             return 1;
          }
    
          // Cleanup routine
          BOOL __stdcall xlAutoClose(void) {
             ::MessageBox(NULL, "xlAutoClose()", "Debug", MB_SETFOREGROUND );
    
             // Delete menu
             Excel(xlfDeleteMenu, 0, 2, TempNum(1), TempStr(" MyMenu"));
    
             return 1;
          }
    
          // Support for descriptive information about the add-in(s)
          // You can add a new customized title for the user, but
          // unfortunately, only an add-in written in Microsoft Visual Basic
          // can add a description string.
          LPXLOPER _stdcall xlAddInManagerInfo(LPXLOPER xAction) {
             static XLOPER xInfo, xIntAction;
    
             // Find out what action must be taken
             Excel(xlCoerce, &xIntAction, 2, xAction, TempInt(xltypeInt));
    
             // DEBUG output to indicate when called
             sprintf(buf, "xlAddInManagerInfo(%ld)", (long)xIntAction.val.w);
             ::MessageBox(NULL, "xlAddInManagerInfo()", "Debug",
                 MB_SETFOREGROUND );
    
             // Set title if asked
             if(xIntAction.val.w == 1) {
                 xInfo.xltype = xltypeStr;
                 xInfo.val.str = " My Add-in!!!!";
                 xInfo.val.str[0] = (char)strlen(&xInfo.val.str[1]);
             }
             else {
                 xInfo.xltype = xltypeErr;
                 xInfo.val.err = xlerrValue;
             }
    
             return (LPXLOPER)&xInfo;
          }
    
            short __stdcall MyMotd(void) {
             char *name[] = {
                "Rebekah",
                "Brent",
                "John",
                "Joseph",
                "Robert",
                "Sara",
                0
             };
             char *quote[] = {
                "An apple a day, keeps the doctor away!",
                "Carpe Diem: Seize the Day!",
                "What you dare to dream, dare to do!",
                "I think, therefore I am.",
                "A place for everything, and everything in its place.",
                "Home is where the heart is.",
    
                0
             };
    
             int nNames, nQuotes;
    
             for(nNames=0; name[nNames]; nNames++);
             for(nQuotes=0; quote[nQuotes]; nQuotes++);
    
             sprintf(buf, "%s says '%s'", name[rand()%nNames],
                quote[rand()%nQuotes]);
             ::MessageBox(NULL, buf, "XLL MOTD", MB_SETFOREGROUND );
    
             return 0;
          }
    
          // Example function that returns the product of its two parameters
          long __stdcall MyFunc(long parm1, long parm2) {
           sprintf(buf, "You sent %ld and %ld to MyFunc()!", parm1, parm2);
           ::MessageBox(NULL, buf, "MyFunc() in Anewxll!!!", MB_SETFOREGROUND);
    
           return parm1 * parm2;
          }
          //=================================================================
    					
  10. Anewxll.def ファイルの末尾に次の行を追加します。
          xlAutoOpen
          xlAutoClose
          xlAddInManagerInfo
          MyMotd
          MyFunc
    					
  11. 今すぐ Anewxll.dll と呼ばれる DLL を作成するのには、プロジェクトをコンパイルできます。DLL をコンパイルすると、Anewxll.xll に名前を変更します。

Microsoft Excel ではアドインの使用

  1. Microsoft Excel で新しいブックを開きます。
  2. アドインは、[ツール] メニューをクリックします。参照 Anewxll.xll を追加し、[OK] をクリックします。アドイン ダイアログ ボックスで、xlAutoOpen は、[OK] をクリックすると表示します。関数を実行します。
  3. M.O.T.D [MyMenu] メニューをクリックします。メニュー項目がクリックされると、表示するのには、MyMotd 関数を実行します。メッセージ ボックスでは、見積もりなど"Rebekah の質問 ' は 1 日、りんごを保持します。医者を離れた!'"。
  4. セルに、次の数式を追加します。
    =MYFUNC(2,6)
    					
    MYFUNC 12, 2 と 6 の積を返します。

  5. アドインは、[ツール] メニューをクリックします。アドインのチェック ボックスをオフにします[OK]。[アドイン] ダイアログ ボックス、xlAutoClose で [ok] をクリックすると表示します。関数を実行します。

注意事項

Microsoft Visual C 6.0 を使用している場合は、前の例では、障害が発生しました。デバッグ モードでコンパイルします。障害が発生するための視覚唯一のメモリでデバッグ ビルド、し、XLL 開発者が文字列の長さプレフィックスを使用することが重要に、アクセス違反が発生 C 6.0 は、文字列をリテラルに配置されますを参照してください。回避策として、プロジェクト設定で、/ZI コンパイラ スイッチを削除するかだけで、リリース ビルドをテストできます。詳細については、次の資料では、Microsoft Knowledge Base を参照してください。
198477 PRB:/ZI を使用アクセス違反が発生する可能性があります。

関連情報

Xll の詳細については、次の項目を参照してください。
Microsoft Excel 97 開発者のキット (ISBN: 1-57231-498-2)

プロパティ

文書番号: 178474 - 最終更新日: 2011年7月5日 - リビジョン: 6.0
キーワード:?
kbhowto kbmt KB178474 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:178474
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com