いつもいつも申し訳ありません。
まだまだ勉強不足のため、ご教授お願いします。
環境は Windows2000/VC 6.0/ダイアログベース
ダイアログでは .dat/.csv ファイルがすでに読み込めるように
なっています。
Excelファイルも開けるようになってます。
ですが、Excelファイルには表があるのですが
Excelを開くと新規で上書きされてしまいます。
どのようにすれば上書きされないで
表がそのまま開いてくらるのですか?
あとどのようにしたら
ダイアログの情報をExcelに書き込めるのですか?
今現在、どのような手順で Excel ファイルを開いているのですか?
#include <atlbase.h>
#pragma warning(disable : 4146 4192)
#import C:\Program Files\Microsoft Office\Office\Mso9.dll \
no_namespace rename (DocumentProperties, DocumentPropertiesXL)
#import C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.olb
no_namespace
#import C:\Program Files\Microsoft Office\Office\Excel9.olb rename \
(DialogBox,DialogBoxXL) rename(RGB,RGBXL) rename(DocumentProperties, \
DocumentPropertiesXL) no_dual_interfaces
using namespace Excel;
void CA_TABDlg::OnButton6()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
::CoInitialize(NULL);
Excel::_ApplicationPtr excel;
excel.CreateInstance( Excel.Application.9);
Excel::WorkbooksPtr books = excel->GetWorkbooks ();
Excel::_WorkbookPtr book = books->Open(C:\\Visual C++\\Excel書込2
\\xlsputcell\\Book1.xls);
//絶対パスで、すでに、存在するエクセルファイルを指定しないと、実行時エラー
Excel::SheetsPtr sheets = book->GetWorksheets();
Excel::_WorksheetPtr sheet = sheets->GetItem(COleVariant((short) 1));
Excel::RangePtr cell = sheet->GetRange(COleVariant(A1));
cell->PutItem(COleVariant((short)1), COleVariant((short)1),
COleVariant(新しい値));
book->Close();
excel->Quit();
::CoUninitialize();
CDialog::OnOK();
}
ちょっと見にくいかもしれませんが
全然わからなかったので、掲示板に載っていたものを
うつしてみました。
>Excelを開くと新規で上書きされてしまいます。
>どのようにすれば上書きされないで
>表がそのまま開いてくらるのですか?
books->Open() がファイルを開いてることは想像できますよね?
その後に、ワークシートに対する書き込みが数行あります。
それが余分なんじゃないですか?
余分な行を削除すれば、上書きされなくなるでしょう。
>books->Open() がファイルを開いてることは想像できますよね?
はい、わかります。
Excel::SheetsPtr sheets = book->GetWorksheets();
Excel::_WorksheetPtr sheet = sheets->GetItem(COleVariant((short) 1));
Excel::RangePtr cell = sheet->GetRange(COleVariant(A1));
この3行が余分だと思いコメントにしてみたところ
C:\Visual C++\コピー ~ A_TAB完成版\A_TABDlg.cpp(628) : error C2065:
'cell' : 定義されていない識別子です。
C:\Visual C++\コピー ~ A_TAB完成版\A_TABDlg.cpp(628) : error C2227:
'->PutItem' : 左側がクラス、構造体、共用体へのポインタではありません。
このようなエラーがでてきてしまいました。
1行目だけコメントにしても同じようなエラーがでてしまいます。
>この3行が余分だと思いコメントにしてみたところ
その次の
cell->PutItem(COleVariant((short)1), COleVariant((short)1), COleVariant(新しい
値));
も余分です。
あなたがコメントアウトした3行は書き込み先のセルの参照を取得していて、↑はその
セルに対して「新しい値」という文字列を書き込んでいます。
なお、
book->Close();
excel->Quit();
も削除しないと、せっかく開いたブックが閉じられ、Excel が終了します。
Excel::SheetsPtr sheets = book->GetWorksheets();
Excel::_WorksheetPtr sheet = sheets->GetItem(COleVariant((short) 1));
Excel::RangePtr cell = sheet->GetRange(COleVariant(A1));
cell->PutItem(COleVariant((short)1), COleVariant((short)1),
COleVariant(新しい値));
book->Close();
excel->Quit();
が、不要とのことですよね?
これらをコメントにするとExcel
が開かなくなってしまうのですが・・・
そういえば、
Excel::_ApplicationPtr excel;
excel.CreateInstance( Excel.Application.9);
しだけだと Excel が非表示ですね。
↑の直後で
excel->Visible = true;
すれば Excel が表示状態になります。
>これらをコメントにするとExcel
>が開かなくなってしまうのですが・・・
↑で非表示状態で起動した Excel が居座っているんでしょう。
タスクマネージャなどで確認してみてください。
無事にExcelが開くようになりました。
ありがとうございます。
>Excel が居座っているんでしょう。
>タスクマネージャなどで確認してみてください。
確認してみたところExcelは起動してませんでした。
どうしてでしょう・・・
とりあえず開けるようになったのでよかったです。
もう一つの質問なんですが
ダイアログに読み込まれている数値を
開けるようになったExcelに書き込みたいのですが・・・
どのようにしたらよいのですか?
「値の書き込み」は、あなたがコメントアウトなり削除したコードに含まれてましたよ
ね?
cell->PutItem(COleVariant((short)1), COleVariant((short)1), COleVariant(新しい
値));
の「新しい値」という固定文字列の代わりに、「ダイアログに読み込まれている数値」
を指定すればいいと思います。
あなたが消したりコメントアウトしたコードがどのような意味を持っているのかについ
て、あなた自身で少しは理解する努力をしてみませんか?
なんとなくできてきたのですが
Excel::RangePtr cell = sheet->GetRange(COleVariant(A1));
これでセルの場所を指定
cell->PutItem(COleVariant((short)1), COleVariant((short)1),
COleVariant(新しい値));
これで数値を指定
じゃないですか。
数値は1つじゃないんで複数指定したいのですが、
もう一度同じ事を書くと
***** : error C2086: 'cell' : 再定義されました。
とエラーが出てしまいます。
回避の仕方教えてください。
***** : error C2086: 'cell' : 再定義されました。
とエラーが出てしまいます。
回避の仕方教えてください。
再定義せずそのままcellを使えばいいのでは?
はい。
そう思いまして
sheet->GetRange(COleVariant(B1));
cell->PutItem(COleVariant((short)1), COleVariant((short)1),
COleVariant(数値));
とやってみたのですが
.cpp : error C2039: 'PutItme' : 'Range' のメンバではありません。
c:\\excel9.tlh(41640) : 'Range' の宣言を確認してください。
というようなエラーが出てしまうんです。
は?
> cell = sheet->GetRange(COleVariant(B1));
> cell->PutItem(COleVariant((short)1), COleVariant((short)1),
> COleVariant(数値));
じゃないのですか?
変数って分かります?
間違えてました。
『cell =』貼り付けるの忘れてたみたいです。
ちゃんと同じように書いてました。
ですが、エラーが出てしまいます。