VC++から、MS-Word2000のdocファイル(帳票テンプレート)
を開き、データを所定の箇所へセットし文書を完成させたいのですが、
どのようにすれば実現できるでしょうか?
(要は、VBからwordやExcelを制御するのと同様のことをしたいのです)
分かる方がいらしたらお教え願います。
環境:Win2000 VC6.0 MFC
数ヶ月前に格闘しました。Word98のものですがほとんど同じなので、当時にまとめたメモを載
せます。
*** VC++でWordを操作する方法 *******
① MFCアプリケーションを新規作成するときに「MFC AppWizard-ステップ3/6」で「オートメ
ーション」のチェックボックスをONにする
② ClassWizardの「クラスの追加→タイプライブラリから...」を選択し、msword8.olb
(Word2000の場合はmsword9.olb)をインポートする
パス:($Officeのインストールディレクトリ)\Microsoft Office\Office\
③ 表示された「クラスの確認ダイアログ」から必要なクラスを選択して[OK]ボタンをクリッ
クする(=>msword8.cpp と msword8.hが生成される)
例)
_Application アプリケーション
Documents & _Document ドキュメント
Sections & Section セクション
Font フォント
_ParagraphFormat 左寄せ・中央揃え・右寄せ etc.
④ enum等のクラス以外のものは直接読み込めないのでタイプライブラリビューからカット&ペ
ーストする
1)VC++の「ツール(T)」→「OLE/COMオブジェクトビューア」を選択して
「OLE/COM Object Viewer」を起動する。
2)OLE/COM Object Viewerの「File」→「View TypeLib...」を選択して msword8.olb
を開く
3)ITypeLib Viewer の「View」→「Group by type kind」を選択するとEnumsや
Structs等のグループ別に表示されるので、適当な型を選ぶと右側のビューに定義が表示され
る。(コピー&ペースト可)
<プログラミング例> ”Hello World!”と入力したファイルWordTest.doc(保存場所は
C:\tmp\)ファイルを生成する
--------------------------------------------------------------------------------
CString strFileName = _T(C:\\tmp\\wordtest.doc);
_Application MyWord;
MyWord.CreateDispatch(Word.Application); // 接続
MyWord.m_bAutoRelease = TRUE;
MyWord.SetVisible(FALSE); // アプリケーションを不可視に
Documents m_documents(MyWord.GetDocuments());
// ドキュメントオブジェクトをアプリケーションに結びつける
_Document m_doc(m_documents.Add()); // ファイルの新規作成
Selection m_select(MyWord.GetSelection()); // 選択領域オブジェクト
m_select.TypeText(Hello World!\r\n);
m_doc.SaveAs(strFileName); // 名前を付けてファイルを保存
m_doc.ReleaseDispatch();
MyWord.Quit(); // アプリケーションの終了
MyWord.ReleaseDispatch(); // 切断
--------------------------------------------------------------------------------
但し、_Documentクラスの関数SaveAs()を次のように追加している
--------------------------------------------------------------------------------
class _Document : public COleDispatchDriver
{
...
void SaveAs(LPCTSTR FileName, WdSaveFormat FileFormat=wdFormatDocument,
BOOL LockComments=FALSE, LPCTSTR Password=NULL, BOOL
AddToRecentFiles=FALSE,
LPCTSTR WritePassword=NULL, BOOL ReadOnlyRecommended=FALSE,
BOOL EmbedTrueTypeFonts=FALSE, BOOL SaveNativePictureFormat=TRUE,
BOOL SaveFormsData=FALSE, BOOL SaveAsAOCELetter=TRUE);
...
}
void _Document::SaveAs(LPCTSTR FileName, WdSaveFormat FileFormat, BOOL
LockComments,
LPCTSTR Password, BOOL AddToRecentFiles, LPCTSTR WritePassword,
BOOL ReadOnlyRecommended, BOOL EmbedTrueTypeFonts,
BOOL SaveNativePictureFormat, BOOL SaveFormsData, BOOL SaveAsAOCELetter)
{
static BYTE parms[] =
VTS_BSTR VTS_I4 VTS_BOOL VTS_BSTR VTS_BOOL VTS_BSTR VTS_BOOL VTS_BOOL
VTS_BOOL VTS_BOOL VTS_BOOL;
InvokeHelper(0x66, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
FileName, FileFormat, LockComments, Password,
AddToRecentFiles, WritePassword,
ReadOnlyRecommended, EmbedTrueTypeFonts, SaveNativePictureFormat,
SaveFormsData, SaveAsAOCELetter);
------------------------------------------------------------------------------
※注意:WdSaveFormatはenum型なので④の方法でインポートしなければならない
他にもやり方はあると思いますが、これでVC++からWordを制御できます。
後は、Wordのマクロ(VBA)を参考に試してみて下さい。
seraさん、ありがとうございます。
早速試してみます。
で、ひとつ質問なのですが、どうやってこの方法を見つけたんでしょうか?
もし参考になる本などがあれば、教えていただきたいのですが・・・
よろしくお願いします。
最も参考にしたのは、↓です。
http://www1.neweb.ne.jp/wa/junneko/tec/tec001.html
それから↓も参考になります。
http://www1.plala.or.jp/knambo/vc/usecom.html
特に参考書と呼べるものは見当たりませんでした。
WordのVBAについては、
MS VBA Programming Series②
VBA Word97/98 ハンドブック
技術評論社 竹内里佳・佐藤立子:共著
を参考にしました。後はWordのマクロの記録で生成されるコードを調べました。
Excelの情報量は多いのにWordの方はVBAの書籍さえ少ないのがちょっと悲しかったです。
seraさん、質問の回答ありがとうございました。
自分もいろいろ本屋をまわって探したんですが、
全然見付からなくて、途方にくれていたんです・・・。
非常に助かりました。
本当にありがとうございました。