Visualstudio2017でexcelのマクロを実行したいしたいと考えています.
言語はVC++です
検索しても資料があまりなく,とっかかりが掴めない状況です.
なにかアドバイスを頂けると大変嬉しいです.
宜しくお願い致します.
開発環境
Windows8.1 Pro (64bit)
Excel 2016 (64bit)
Visual Studio 2017
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
マネージドなプログラムからのエクセルの操作はすでに回答があるので、アンマネージドなプログラムからエクセルを操作する方法です。
大雑把に言って三つほどあるようです。
- #import を使用してタイプライブラリーを読み込む方法。
- MFC のウィザードでヘッダーを作成する方法。
- #import も MFC も使用しない方法。
私自身は、主に 1 の方法でプログラムを作成しています。2 の方法もたまに使用しますが、3 はサンプルプログラムぐらいしか動かした事がありません。
以下のプログラムは 1 の方法で作ってあります。
"Book2.xlsm" に "Test" というマクロが定義されています。
引数が二つあり、それぞれをセルに書き込むだけです。
引数は 0 ~ 30 まで指定できるようです。
開発環境
Windows7 Pro (32bit)
Excel 2013 (32bit)
Visual Studio 2015
C++
1#define WIN32_LEAN_AND_MEAN 2#include <windows.h> 3#include <iostream> 4#include <comutil.h> 5 6//Excelを操作するためのタイプライブラリを読みこむ (Excel2013(32bit)) 7#import "C:\Program Files\Microsoft Office 15\root\vfs\ProgramFilesCommonX86\Microsoft Shared\OFFICE15\MSO.DLL" no_auto_exclude auto_rename 8#import "C:\Program Files\Microsoft Office 15\root\vfs\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA6\Vbe6ext.olb" 9#import "C:\Program Files\Microsoft Office 15\root\office15\EXCEL.EXE" no_auto_exclude auto_search auto_rename dual_interfaces 10using namespace Excel; //名前空間の定義 11 12struct StartOle { 13 StartOle() { CoInitialize(NULL); } //COMを初期化 14 ~StartOle() { CoUninitialize(); } //COMを閉じる 15} _inst_StartOle; 16 17int main(void) 18{ 19 _ApplicationPtr pXL; 20 21 //--------------------------------------------------------- 22 //Excelの起動 23 pXL.CreateInstance(L"Excel.Application"); 24 pXL->Visible[0] = TRUE; // ウィンドウを表示 25 pXL->DisplayAlerts[0] = FALSE; //アラームを出さないように 26 27 //--------------------------------------------------------- 28 //WorkBookを開く 29 WorkbooksPtr pBooks = pXL->Workbooks; 30 _WorkbookPtr pBook = pBooks->Open("Book2.xlsm"); //マクロを含むブックを開く 31 32 //--------------------------------------------------------- 33 //マクロ名と引数を格納 34 variant_t macro = (_bstr_t)"Book2.xlsm!Test"; //実行マクロ名 35 variant_t arg1 = (_bstr_t)"テストです"; //引数1 36 variant_t arg2 = (_bstr_t)"二つ目の引数"; //引数2 37 38 //マクロを実行 39 pXL->Run(macro, arg1, arg2); 40 ::Sleep(5 * 1000); // 動作確認の為一時停止 41 42 //ウィンドウを最小化 43 pXL->WindowState[0] = xlMinimized; 44 45 std::cout << "マクロの実行を確認するために一時停止:"; 46 char buff[256]; 47 std::cin.getline(buff, sizeof buff); 48 49 //--------------------------------------------------------- 50 //ワークブックを閉じる 51 pBook->Close(); 52 pBook.Release(); // COMオブジェクトを解放 53 pBooks.Release(); // COMオブジェクトを解放 54 55 //Excelを終了する 56 pXL->Quit(); 57 pXL.Release(); // COMオブジェクトを解放 58}
それほど詳しいわけではありませんが、質問があれば答えられる範囲で回答いたします。
投稿2019/01/23 01:42
総合スコア986
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
突っ込まれても答えられないのはほぼ確実なので参考程度に。
セルアクセスに関して、昔作っておいたメモ(何か抜けているかもしれません)を起こしたものですが、参考になるでしょうか。Officeのインストールで、.net開発云々のオプションが必要だったと思います。
まずは、プロジェクトの参照設定にMicrosoft.Office.Interop.Excel
を追加。
C++
1using namespace Microsoft::Office::Interop; 2 3// 新しいブックを作成 4Excel::Workbook^ wbook = oXls->Workbooks->Add(Type::Missing); 5Excel::Worksheet^ wsheet = (Excel::Worksheet^)wbook->Worksheets[1]; 6 7//表見出し 8wsheet->Range["A1",Type::Missing]->Value2 = "y=2^x"; 9wsheet->Range["A2",Type::Missing]->Value2 = "x"; 10wsheet->Range["B2",Type::Missing]->Value2 = "y"; 11 12wbook->Close() 13oXls->Quit();
というわけで、C++はやる気が無い全く勉強しておらず、環境もないので確認出来ませんが、ブックを開いてマクロを実行だけなら、こんな感じで行けるんじゃないでしょうか。
C++
1Excel::Workbook^ wbook = oXls->Workbooks->Open(<実行マクロのブック>); 2wbook->Run(<マクロ名>);
投稿2019/01/22 14:55

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/24 09:35

退会済みユーザー
2019/01/24 12:47 編集

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。