Excelに書込み – プログラミング – Home

通知
すべてクリア

[解決済] Excelに書込み

固定ページ 1 / 2

コムギ
 コムギ
(@コムギ)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

いつもいつも申し訳ありません。
まだまだ勉強不足のため、ご教授お願いします。

環境は Windows2000/VC 6.0/ダイアログベース

ダイアログでは .dat/.csv ファイルがすでに読み込めるように
なっています。
Excelファイルも開けるようになってます。
ですが、Excelファイルには表があるのですが
Excelを開くと新規で上書きされてしまいます。
どのようにすれば上書きされないで
表がそのまま開いてくらるのですか?

あとどのようにしたら
ダイアログの情報をExcelに書き込めるのですか?


引用未解決
トピックタグ
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 23年前
投稿: 196
 

今現在、どのような手順で Excel ファイルを開いているのですか?


返信引用
コムギ
 コムギ
(@コムギ)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

#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();
}

ちょっと見にくいかもしれませんが
全然わからなかったので、掲示板に載っていたものを
うつしてみました。


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 23年前
投稿: 196
 

>Excelを開くと新規で上書きされてしまいます。
>どのようにすれば上書きされないで
>表がそのまま開いてくらるのですか?

books->Open() がファイルを開いてることは想像できますよね?

その後に、ワークシートに対する書き込みが数行あります。
それが余分なんじゃないですか?

余分な行を削除すれば、上書きされなくなるでしょう。


返信引用
コムギ
 コムギ
(@コムギ)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

>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行目だけコメントにしても同じようなエラーがでてしまいます。


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 23年前
投稿: 196
 

>この3行が余分だと思いコメントにしてみたところ

その次の

cell->PutItem(COleVariant((short)1), COleVariant((short)1), COleVariant(新しい
値));

も余分です。

あなたがコメントアウトした3行は書き込み先のセルの参照を取得していて、↑はその
セルに対して「新しい値」という文字列を書き込んでいます。

なお、

book->Close();
excel->Quit();

も削除しないと、せっかく開いたブックが閉じられ、Excel が終了します。


返信引用
コムギ
 コムギ
(@コムギ)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

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
が開かなくなってしまうのですが・・・


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 23年前
投稿: 196
 

そういえば、

Excel::_ApplicationPtr excel;
excel.CreateInstance( Excel.Application.9);

しだけだと Excel が非表示ですね。

↑の直後で

excel->Visible = true;

すれば Excel が表示状態になります。

>これらをコメントにするとExcel
>が開かなくなってしまうのですが・・・

↑で非表示状態で起動した Excel が居座っているんでしょう。
タスクマネージャなどで確認してみてください。


返信引用
コムギ
 コムギ
(@コムギ)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

無事にExcelが開くようになりました。
ありがとうございます。

>Excel が居座っているんでしょう。
>タスクマネージャなどで確認してみてください。

確認してみたところExcelは起動してませんでした。
どうしてでしょう・・・
とりあえず開けるようになったのでよかったです。

もう一つの質問なんですが

ダイアログに読み込まれている数値を
開けるようになったExcelに書き込みたいのですが・・・
どのようにしたらよいのですか?


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 23年前
投稿: 196
 

「値の書き込み」は、あなたがコメントアウトなり削除したコードに含まれてましたよ
ね?

cell->PutItem(COleVariant((short)1), COleVariant((short)1), COleVariant(新しい
値));

の「新しい値」という固定文字列の代わりに、「ダイアログに読み込まれている数値」
を指定すればいいと思います。

あなたが消したりコメントアウトしたコードがどのような意味を持っているのかについ
て、あなた自身で少しは理解する努力をしてみませんか?


返信引用
コムギ
 コムギ
(@コムギ)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

なんとなくできてきたのですが

Excel::RangePtr cell = sheet->GetRange(COleVariant(A1));
これでセルの場所を指定

cell->PutItem(COleVariant((short)1), COleVariant((short)1),
COleVariant(新しい値));
これで数値を指定

じゃないですか。
数値は1つじゃないんで複数指定したいのですが、
もう一度同じ事を書くと

***** : error C2086: 'cell' : 再定義されました。

とエラーが出てしまいます。
回避の仕方教えてください。


返信引用
こん!
 こん!
(@こん!)
ゲスト
結合: 22年前
投稿: 11
 

***** : error C2086: 'cell' : 再定義されました。

とエラーが出てしまいます。
回避の仕方教えてください。

再定義せずそのままcellを使えばいいのでは?


返信引用
コムギ
 コムギ
(@コムギ)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

はい。
そう思いまして

sheet->GetRange(COleVariant(B1));
cell->PutItem(COleVariant((short)1), COleVariant((short)1),
COleVariant(数値));

とやってみたのですが

.cpp : error C2039: 'PutItme' : 'Range' のメンバではありません。
c:\
\excel9.tlh(41640) : 'Range' の宣言を確認してください。

というようなエラーが出てしまうんです。


返信引用
こん!
 こん!
(@こん!)
ゲスト
結合: 22年前
投稿: 11
 

は?
> cell = sheet->GetRange(COleVariant(B1));
> cell->PutItem(COleVariant((short)1), COleVariant((short)1),
> COleVariant(数値));

じゃないのですか?
変数って分かります?


返信引用
コムギ
 コムギ
(@コムギ)
ゲスト
結合: 22年前
投稿: 39
Topic starter  

間違えてました。
『cell =』貼り付けるの忘れてたみたいです。
ちゃんと同じように書いてました。
ですが、エラーが出てしまいます。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました