@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

VC++からExcelマクロを作成する方法

1
投稿者投稿内容
butthead
大ベテラン
会議室デビュー日: 2004/01/14
投稿数: 162
投稿日時: 2006-01-20 12:50
お世話になります。

ピボットテーブルをVC++にて作成したいと考えていますが、

資料が少なくどのように作成したらいいかわかりません。

当初、オートメーション機能を使った場合

VC++にてPivotTableWizardにて作成することを考えていましたが、

参考となる資料がまったくないため、VC++から開かれたExcelブックに直接マクロを

書き込み、それを実行させることを考え始めました。

以下は参考にしているVC++からのオートメーションによるマクロの呼び出しです。

COleVariant vWork,vWork2;
_Application pXlsApp;
Workbooks pXlsBooks;
Modules pModules_tmp;


//Excelを起動する
pXlsApp.CreateDispatch("Excel.Application");
pXlsApp.m_bAutoRelease = TRUE;
pXlsApp.SetVisible(TRUE); //画面表示を有効にする

//Workbookを開く
LPDISPATCH pWkBooks = pXlsApp.GetWorkbooks(); //起動したExcelのWorkbooksのディスパッチを取得
CString strFile = "C:\\BOOK2.XLS"; //開く
pXlsBooks.AttachDispatch(pWkBooks,TRUE);
pXlsBooks.Open((LPCTSTR)strFile);
//使いやすいように、WorkBooksクラスのOpenメソッド引数は調整してあります。

//マクロ名を格納
vWork.SetString("BOOK2.XLS!Test",VT_BSTR); //実行マクロ名
vWork2.SetString("テストだよ〜ん。",VT_BSTR); //引数

//マクロ・シートをディスパッチを生成
pModules_tmp.CreateDispatch("Excel.Macrosheet");
pModules_tmp.m_bAutoRelease = TRUE;

//マクロとExcelを結びつける。
LPDISPATCH pMacNam = pXlsApp.GetExcel4MacroSheets();
pModules_tmp.AttachDispatch(pMacNam,TRUE);

//マクロの実行
vWork = pXlsApp.Run(vWork,vWork2);
//Excelのマクロを実行
//使いやすいように、_ApplicationクラスのRunメソッドの引数の数を調整してあります。
//オブジェクトの解放
pModules_tmp.ReleaseDispatch();

//WorkBookを閉じる
pXlsBooks.Close();
pXlsBooks.ReleaseDispatch();

//Excelを終了
pXlsApp.Quit();
pXlsApp.ReleaseDispatch();

C#やVB.NETではマクロを作成してExcelシートに記述する方法が見つかりましたが、

http://support.microsoft.com/default.aspx?scid=kb;JA;303872

VC++ではないため、どうやればいいのかを探しています。

何かサンプル、もしくは参考になるサイト、ご存知の方がいればお教えくださいませ。

よろしくお願いします。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-01-20 16:14
こんにちは。

引用:

buttheadさんの書き込み (2006-01-20 12:50) より:

C#やVB.NETではマクロを作成してExcelシートに記述する方法が見つかりましたが、
http://support.microsoft.com/default.aspx?scid=kb;JA;303872
VC++ではないため、どうやればいいのかを探しています。



上記のリンク先のC#コードをVC++のコードに翻訳してみました。
ご参考にどうぞ。
#MFCのサンプルコードを提示されていたので、今回はMFCを使ってみました。
 #importディレクティブを使って記述することも可能です。

開発環境:Visual C++.net 2003
Office: Microsoft Excel 2000(Excel9.0)
コード:
void CTestDlg::OnBnClickedButton1()
{
	// TypeLibからの生成したMFCクラス
	CApplication oExcel;			// _Application(Microsoft Excel x.x Object Library)
	CWorkbooks oWorkbooks;			// Workbooks(Microsoft Excel x.x Object Library)
	CWorkbook oBook;				// _Workbook(Microsoft Excel x.x Object Library)
	CVBProject oProject;			// _VBProject(Microsoft Visual Basic for Application)
	CVBComponents oComponents;		// _VBComponents(Microsoft Visual Basic for Application)
	CVBComponent oModule;			// _VBComponent(Microsoft Visual Basic for Application)
	CCodeModule oCodeModule;		// _CodeModule(Microsoft Visual Basic for Application)
	CCommandBars oCommandBars;		// _CommandBars(Microsoft Office x.x Object Library)
	CCommandBar0 oCommandBar;		// CommandBar(Microsoft Office x.x Object Library)
	CCommandBarControls oCommandBarControls;	// CommandBarControls(Microsoft Office x.x Object Library)
	CCommandBarButton oCommandBarButton;		// _CommandBarButton(Microsoft Office x.x Object Library)

	// 定数
	const long vbext_ct_StdModule = 1;
	const long msoControlButton = 1;

	COleVariant oMissing;
	oMissing.vt = VT_NULL;

	try {
		// Create an instance of Excel.
		if (!oExcel.CreateDispatch("Excel.Application"))	{
			AfxMessageBox("Fail to create Excel.Application object", MB_OK);
			return;
		}

		// Add a workbook.
		oWorkbooks = oExcel.get_Workbooks();
		oBook = oWorkbooks.Add(oMissing);

		// Create a new VBA code module.
		oProject = oBook.get_VBProject();
		oComponents = oProject.get_VBComponents();
		oModule = oComponents.Add(vbext_ct_StdModule);

		LPCTSTR sCode = 
			"sub VBAMacro()\\r\\n"
			"   msgbox \\"VBA Macro called\\"\\r\\n"
			"end sub";

		// Add the VBA macro to the new code module.
		oCodeModule = oModule.get_CodeModule();
		oCodeModule.AddFromString(sCode);

		try {
			// Create a new toolbar and show it to the user.
			oCommandBars = oExcel.get_CommandBars();

			//oCommandBar = oCommandBars.Add(COleVariant(L"VBAMacroCommandBar"), oMissing, oMissing, oMissing);
			oCommandBar = oCommandBars.Add(COleVariant("VBAMacroCommandBar"));

			oCommandBar.put_Visible(TRUE);

			// Create a new button on the toolbar.
			oCommandBarControls = oCommandBar.get_Controls();
			//oCommandBarButton = oCommandBarControls.Add(COleVariant(msoControlButton), oMissing, oMissing, oMissing, oMissing);
			oCommandBarButton = oCommandBarControls.Add(COleVariant(msoControlButton));

			// Assign a macro to the button.
			oCommandBarButton.put_OnAction("VBAMacro");
			// Set the caption of the button.
			oCommandBarButton.put_Caption("Call VBAMacro");
			// Set the icon on the button to a picture.
			oCommandBarButton.put_FaceId(2151);
			
		}
		catch (CException* e) {
			AfxMessageBox("VBAMacroCommandBar already exists.", MB_OK);
			e->Delete();
		}

		// Make Excel visible to the user.
		oExcel.put_Visible(TRUE);
		// Set the UserControl property so Excel won't shut down.
		oExcel.put_UserControl(TRUE);

	}
	catch (CException* e) {
		e->ReportError();
		e->Delete();
	}
}

1

スキルアップ/キャリアアップ(JOB@IT)