VC++ でエクセルを起動する (#import でタイプライブラリを読込む)


需要はないとは思いますが、C++ (MSVC) でエクセルを操作するプログラムです。
まず最初はエクセルを起動するだけです。
#importでタイプライブラリを読込んでいますが、libidを使用しているのでエクセルのバージョンには依存しないはずです。

#define  WIN32_LEAN_AND_MEAN
#define  _WIN32_WINNT _WIN32_WINNT_WIN7
#include <windows.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <comutil.h>

#pragma warning (disable:4192)
//Excelを操作するためのタイプライブラリを読みこむ
//Microsoft Office Object Library
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" no_auto_exclude auto_rename dual_interfaces
//Microsoft Visual Basic for Applications Extensibillity
#import "libid:0002E157-0000-0000-C000-000000000046" dual_interfaces
//Mcrosoft Excel Object Library
#import "libid:00020813-0000-0000-C000-000000000046" no_auto_exclude auto_search auto_rename dual_interfaces

struct StartOle {
	StartOle() { CoInitialize(NULL); }					//COMを初期化
	~StartOle() { CoUninitialize(); }					//COMを閉じる
} _inst_StartOle;

int main(void)
{
	Excel::_ApplicationPtr excelApp;

	//---------------------------------------------------------
	//Excelの起動
	excelApp.CreateInstance(L"Excel.Application");

	if (excelApp) {
		excelApp->Visible[0] = VARIANT_TRUE;			//エクセルを表示する
		excelApp->DisplayAlerts[0] = VARIANT_FALSE;		//警告が出ないように

		//確認のために一時停止
		::Sleep(4 * 1000);
		excelApp->WindowState[0] = Excel::xlMinimized;
		std::cout << "エクセルの起動を確認:";
		std::string s;
		std::getline(std::cin, s);

		//-------------------------------------------------
		//Excelを閉じる
		excelApp->Quit();
		excelApp.Release();								//COM オブジェクトを解放
	} else {
		std::cerr << "エクセルを起動できません\n";
	}

	std::cout << "テストプログラムを終了:";
	std::string s;
	std::getline(std::cin, s);
}

さすがにこれだけではさみしいので (ワークブックを開くだけでしたら、ShellExecute のほうが簡単) 、セルにデータを入力してファイルに保存してみます。

#define  WIN32_LEAN_AND_MEAN
#define  _WIN32_WINNT _WIN32_WINNT_WIN7
#include <windows.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <comutil.h>

#pragma warning (disable:4192)
//Excelを操作するためのタイプライブラリを読みこむ
//Microsoft Office Object Library
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" no_auto_exclude auto_rename dual_interfaces
//Microsoft Visual Basic for Applications Extensibillity
#import "libid:0002E157-0000-0000-C000-000000000046" dual_interfaces
//Mcrosoft Excel Object Library
#import "libid:00020813-0000-0000-C000-000000000046" no_auto_exclude auto_search auto_rename dual_interfaces

struct StartOle {
	StartOle() { CoInitialize(NULL); }					//COMを初期化
	~StartOle() { CoUninitialize(); }					//COMを閉じる
} _inst_StartOle;

void dump_com_error(_com_error& e)
{
	std::cerr << "Com error!\n";
	std::cerr << "\tCode = " << std::setw(8) << std::hex << e.Error() << '\n';
	std::cerr << "\tCode meaning = " << e.ErrorMessage() << '\n';
	_bstr_t bstrSource(e.Source());
	_bstr_t bstrDescription(e.Description());
	LPCSTR	source = (LPCSTR)bstrSource;
	std::cerr << "\tSource = " << (source ? source : "(NULL)") << "\n";
	LPCSTR descript = (LPCSTR)bstrDescription;
	std::cerr << "\tDescription = " << (descript ? descript : "(NULL)") << "\n";
}

int main(void)
{
	Excel::_ApplicationPtr excelApp;

	//---------------------------------------------------------
	//Excelの起動
	excelApp.CreateInstance(L"Excel.Application");

	if (excelApp) {
		excelApp->Visible[0] = VARIANT_TRUE;			//エクセルを表示する
		excelApp->DisplayAlerts[0] = VARIANT_FALSE;		//警告が出ないように

		try {											//例外を捕捉
			//新規でのWorkBookを追加
			Excel::WorkbooksPtr workbooks = excelApp->Workbooks;
			Excel::_WorkbookPtr workbook = workbooks->Add();

			//-------------------------------------------------
			//セルにデータを入力
			//アクティブ・シートを取得
			Excel::_WorksheetPtr worksheet = workbook->ActiveSheet;

			//文字列を入力
			worksheet->Range["A1"][vtMissing]->Value2 = bstr_t("色は匂へど 散りぬるを");
			worksheet.Release();							//COM オブジェクトを解放

			//確認のために一時停止
			::Sleep(4 * 1000);
			excelApp->WindowState[0] = Excel::xlMinimized;
			std::cout << "エクセルの起動およびデータ入力を確認:";
			std::string s;
			std::getline(std::cin, s);

			//-------------------------------------------------
			//ワークブックを保存
			bstr_t filename{ "Sample01.xlsx" };
			workbook->SaveAs(							//ワークシートを保存
							filename,					//保存するファイル名
							vtMissing,					//ファイルのフォーマットを指定
							vtMissing,					//読み取りパスワードを設定
							vtMissing,					//書き込みパスワードを設定
							vtMissing,					//ファイルを開く時、読み取り専用で開くことを推奨するメッセージを表示するかどうかの設定
							vtMissing,					//バックアップ・ファイルを作成するかどうかの指定
							Excel::xlNoChange			//アクセスモードの指定
			);

			//ワークブックを閉じる
			workbook->Close();
			workbook.Release();
			workbooks.Release();
		}
		catch (_com_error& e) {							//例外処理
			dump_com_error(e);
		}

		//Excelを閉じる
		excelApp->Quit();
		excelApp.Release();								//COM オブジェクトを解放
	} else {
		std::cerr << "エクセルを起動できません\n";
	}

	std::cout << "テストプログラムを終了:";
	std::string s;
	std::getline(std::cin, s);
}

保存したファイル (ワークブック) はデフォルトではおそらくドキュメントフォルダーにあります。(カレント フォルダーではないです)

「なんかVBAに似ているな」と思った人。かなり鋭いです。
基本的にオブジェクト (ワークシートとかセルとか) やメソッドはVBAと同じようなものが使えますし、C++ではあまりなじみが無いプロパティも使えます。勿論、あくまでもC++なので、構文などはVBAとは違いますが。
と言いますか、特別ドキュメントが用意してあるわけではないのでVBAのマニュアルを参照しながらでないとプログラムが書けないです。