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
のマニュアルを参照しながらでないとプログラムが書けないです。
Author And Source
この問題について(VC++ でエクセルを起動する (#import でタイプライブラリを読込む)), 我々は、より多くの情報をここで見つけました https://qiita.com/BenjaminBenton7/items/52cfcfe493551e3b69f9著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .