現在オフラインです。再接続するためにインターネットの接続を待っています

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

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB: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)
xll vc xlcall xlcall32 xlmhowto

警告: この記事は自動翻訳されています

プロパティ

文書番号:178474 - 最終更新日: 12/05/2015 08:15:03 - リビジョン: 6.0

  • kbnosurvey kbarchive kbhowto kbmt KB178474 KbMtja
フィードバック