none
VC++2010Express & Excel2010 オートメーションに関しまして RRS feed

  • 質問

  • VC++を使ってExcelの操作を行うプログラム(*.exe)を作成する際に必要なタイプライブラリのインポート指定


    例えば、Excel2003の場合

    #import "C:\Program Files\Common Files\Microsoft Shared\Office11\MSO.DLL"
    #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
    #import "C:\Program Files\Microsoft Office\Office11\EXCEL.EXE" rename("DialogBox", "ExcelDialogBox") rename("RGB", "ExcelRGB")


    はExcel2010の場合、どの様に記述すれば良いのでしょうか?

    2011年6月11日 10:10

回答

  • >該HPの内容を見ると、Excelの各バージョンで内容が若干異なっています。
    AnswersへのLinkを貼ってください。

    例えば、RGBは#include <windows.h> された環境だとRGB Macroに展開されてしまい、Compileが通らなくなります。
    既存の定義との重複を回避するためにrenameを行います。
    なので、rename("RGB", "Excel2010RGB")でもよいです。(Excel2010RGBが既存の定義と被らなければ)

    調べる方法としては、renameなしでCompileしてErrorになった個所を調べ、
    既存の定義と重複するならrenameする、といった流れになります。

    • 回答としてマーク Ruru 2011年6月13日 15:20
    2011年6月13日 14:15

すべての返信

  • Answers でもらっていたアドバイスは試されたのでしょうか?
    試した上で、どうだったのかをまず書きましょう。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年6月11日 14:17
    モデレータ
  • ソースコードが今、手元にないため(勤務先にある)、来週確認したいと思います。

     

    2011年6月12日 8:57
  • 参考までに、以下のような方法もあります。

    1.OLE/COM Object Viewerを起動する
    2.Type Librariesを開く
    3.Microsoft Excel XX.X Object Libraryを探して開く(XX.XにはVersionが入る)
    4.ITypeLib Viewerを開く
    5.library Excelのすぐ下にimportlibの項目があるので、その中身とExcel.exe(X.X = Microsoft Excel XX.X Object Libraryの下に書かれている)を#importする。
      (stdole2.tlbは除く)

    2011年6月13日 11:08
  • Kozzさん ありがとうございました。

    実行してみたところ以下のような表示が帰ってきました(Answersでの内容と同じになりました)。

    次回からは、自分で調べたいと思いますが、一つだけ分からないことがあります。

    Answersで参照指示されたHPでは

    ”rename は importするタイプライブラリ内の名前とAPIの名前が同じなので名前を置換えている”

    との説明があるのですが、これはどのようにして調べたらよいのでしょうか?

     #import "C:\Program Files\Microsoft Office\Office11\EXCEL.EXE" rename("DialogBox", "ExcelDialogBox") rename("RGB", "ExcelRGB")

    の行です。 該HPの内容を見ると、Excelの各バージョンで内容が若干異なっています。

     

    Azulean さんへ

    勤務先はセキュリティの関係で磁気媒体を持ち込むことができず、ソースコード(これは自宅で作成してメールで勤務先へ送り、勤務先で

    仕上げたもので個人ツールに相当するものなのですが)を紙にプリントアウトして持ち帰るしか方法がなく、今週一杯かけて整形して

    印刷し、自宅で週末に打ち込んで実際に調べてみる予定です。整形しないと、横幅がA4用紙に入らず困ってしまいました。

    IDEでtabを使用して横方向にインデントを付けながらソースコードを作成するとPCの画面では綺麗に表示できますが、印刷するとなると

    困りますね・・・・。

    自宅のPCに有るハズのオリジナルのソースコードはディスクを整理した際に消してしまったようで、残っていませんでした。

     

    ==以下、OleViewer の表示==

    // Generated .IDL file (by the OLE/COM Object Viewer)
    //
    // typelib filename: EXCEL.EXE

    [
      uuid(****),
      version(1.7),
      helpstring("Microsoft Excel 14.0 Object Library"),
      helpfile("VBAXL10.CHM"),
      helpcontext(0x0000ffff),
      custom(****, "Microsoft.Office.Interop.Excel.dll")

    ]
    library Excel
    {
        // TLib :     // TLib : Microsoft Visual Basic for Applications Extensibility 5.3 : {****}
        importlib("VBE6EXT.OLB");
        // TLib : Microsoft Office 14.0 Object Library : {****}
        importlib("MSO.DLL");
        // TLib : OLE Automation : {****}
        importlib("stdole2.tlb");

        // Forward declare all types defined in this typelib
        interface Adjustments;
        interface CalloutFormat;
        interface ColorFormat;
        interface LineFormat;

    {****}にはレジストリキーに出てくるような16進数が存在しますが、セキュリティー上の問題が発生したら困るので

       伏せさせて頂きました。

     

    2011年6月13日 13:53
  • ”rename は importするタイプライブラリ内の名前とAPIの名前が同じなので名前を置換えている”
    との説明があるのですが、これはどのようにして調べたらよいのでしょうか?

    rename がなければ、多重定義などでビルドエラーになるから、rename 指定するだけでは?
    調べるというか、試した結果でわかるのだと思いますよ。

    勤務先はセキュリティの関係で磁気媒体を持ち込むことができず、ソースコード(これは自宅で作成してメールで勤務先へ送り、勤務先で
    仕上げたもので個人ツールに相当するものなのですが)を紙にプリントアウトして持ち帰るしか方法がなく、今週一杯かけて整形して
    印刷し、自宅で週末に打ち込んで実際に調べてみる予定です。整形しないと、横幅がA4用紙に入らず困ってしまいました。

    私、ソースコードそのものを要求していましたっけ…。そう読み取れるものがあったのであれば誤解ですのでここで訂正させてください。

    磁気媒体を持ち込むことを禁じる理由としては、ウィルスなどの悪意あるプログラムの社内への流入の抑止と共に、機密漏洩防止があるのではないでしょうか。
    紙媒体に変えたところで、機密を持ち出している事実は変わりませんので、安易にソースコードの持ち出しはしないでください。
    個人用ツールとして作ったとしても、会社での勤務時間や資産を使って作り出したのであれば、会社の知的財産とみなされると考えます。
    (場合によっては懲戒処分などの対象になる可能性があります)

     

    さて、問題は結局どうなったんでしょうか?
    Answers の該当スレッドも見てみましたが、結果がどうなったのかいまいち見えません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年6月13日 14:10
    モデレータ
  • >該HPの内容を見ると、Excelの各バージョンで内容が若干異なっています。
    AnswersへのLinkを貼ってください。

    例えば、RGBは#include <windows.h> された環境だとRGB Macroに展開されてしまい、Compileが通らなくなります。
    既存の定義との重複を回避するためにrenameを行います。
    なので、rename("RGB", "Excel2010RGB")でもよいです。(Excel2010RGBが既存の定義と被らなければ)

    調べる方法としては、renameなしでCompileしてErrorになった個所を調べ、
    既存の定義と重複するならrenameする、といった流れになります。

    • 回答としてマーク Ruru 2011年6月13日 15:20
    2011年6月13日 14:15
  • Azulean さんへ

    「社内教育の資料作成(宿題)を自宅で行う」程度の勤務外業務は認められています。 強いて言えば「おまえは、サービス残業している
    (させられている)ぞ」ぐらいでしょうか? 本当の知的財産に相当するのは、勤務時間内に作成したこのソフトで駆動されるエクセルのマクロに
    なると思います。 本ソースコードの仕上げは、勤務先環境に合わせた微調整程度の修正です。

    エクセルを立ち上げてからマクロ実行しても良いのですが、ずぼらな私は、コマンドラインからバッチファイルを使って
    ・ファイルのオープン
    ・処理マクロの実行
    ・結果のセーブ
    を自動実行させ、単調な作業を無くして楽しています(:P)。

    どちらにしてもソースコードがないとコンパイルができない為、確かめようがありませんね。

     

    Kozz さんへ

    回答ありがとうございました。 参考にさせていただきます。

    Answersのリンクは

    http://answers.microsoft.com/ja-jp/office/forum/office_2010-customize/vc2010express-excel2010-%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E9%96%A2%E3%81%97%E3%81%BE%E3%81%97%E3%81%A6/3568cc11-ad8b-41cb-a450-e2b06f30a659

    です。

     

     

     

     

    2011年6月13日 14:52