ダイアログ上にエクセルシート3

[戻る]
ちる 2002/10/17(木) 09:18:40
毎度毎度すみません・・・

ヘルプを見たり、ネット上でエクセルについて
いろいろ調べていますがスプレッドシートの使い方がどうしても分かりません。

まず質問の2で教えていただいたスプレッドシートクラスのヘルプですが
OCXスプレッドシートを追加した際に作成されるCWebCalcクラスの
説明はまったく載っていません・・・見るところが違うのでしょうか。
例えばCWebCalcクラスの関数にGetCellsというものがあるのですが
これらはどういった方法で調べればいいのでしょうか。

http://www.microsoft.com/japan/developer/library/off2000/vbaoff/ocobjspreadsheet
.htm

よろしくお願い致します!

dairygoods 2002/10/17(木) 10:29:01
GetXとSetXについては、「Xプロパティ」の説明が該当します。

CWebCalcは、Spreadsheetオブジェクトにアクセスするためにクラスウィザードが
勝手に作ったクラスのクラス名なので、これを探してもどこにもないと思います。

ちる 2002/10/17(木) 11:04:45
ありがとうございます!

Xプロパティについてリンク先も含めて調べたのですがいまいち理解できません><
GetCells関数とはどういう機能なのでしょうか?
http://www.microsoft.com/japan/developer/library/off2000/vbaoff/ocprox.htm

>Spreadsheetオブジェクトにアクセスするために
Spreadsheetにアクセスするためのクラスということは・・・
すみません、クラスの根本が理解できていないようです。

生成されたCWebCalcというものはSpreadsheetクラスやRangeクラスやWorksheetクラスの
すべての機能を兼ね備えた万能クラスと考えてよろしいでしょうか?
//
となるとRengeクラスのメンバー関数を使用できるとして
CwebCalc m_Sheet;
と宣言し、RengeクラスのGetCellsを使用するの方法は
m_Sheet.GetCellsとしてよろしいのでしょうか?
//
またCwebCalcクラスの宣言としてCRange GetCells();となっていますが
m_Sheet.GetCellsの戻り値はいったいどうなるのでしょうか?
//
また以下のRangeクラスのオブジェクトを見ても例えば似たような
 Cells プロパティというものは追加したスプレッドシート9.0の中には
ありませんし・・・
http://www.microsoft.com/japan/developer/library/off2000/vbaoff/ocobjRange.htm

たくさんの疑問がいっぱいです・・・

PATIO 2002/10/17(木) 11:21:23
単に宣言の見方が悪いのではと思うのですが、

CRange GetCells();というのは、CRange CWebCalc::GetCells();と言うことなのでは?
つまり戻り値がCRangeだと行っているのではと思うのですけれど。
もっとも、CRange& CWebCalc::GetCells();の間違いではないかという気もしますけれど。

クラスの理解をきちんとすることが必要な気がします。
基本を理解しないまま進んでしまうとあとで軌道修正をするのが大変だと思いますよ。

dairygoods 2002/10/17(木) 12:16:08
> Xプロパティについてリンク先も含めて調べたのですがいまいち理解できません><

失礼。そのままXプロパティというのがあったのですね…。

上記のXというのは単に何らかの名前という意味でした。
GetCellsやSetCellsの説明は、「Cellsプロパティ」を見てください。

ActiveXコントロールにおける「プロパティ」とは
何なのかを調べてみた方が良いでしょう。


> 生成されたCWebCalcというものはSpreadsheetクラスやRangeクラスやWorksheetクラスの
> すべての機能を兼ね備えた万能クラスと考えてよろしいでしょうか?

違います。CWebCalsはSpreadsheetクラスに対応します。
クラスウィザードがクラスを生成するときに、
CWebCalc,CRange,CWorksheetなどのリストが表示され、
どのクラスを生成するか聞いてきませんでしたか?

ちる 2002/10/17(木) 13:26:53
うう・・

Cellsプロパティを見てみました。
ここに書いてあることがGetCellsやSetCellsの説明なんですね。
CellsプロパティはRange、Spreadsheet、Worksheetクラスそれぞれに存在し
それぞれ返す値が違うと・・でもどう違うのでしょう?・・・

また構文に書いてあること
expression.Cells(Row, Column)とは何を言っているのでしょうか?
引数は取らないと上に書いてあるのですけど、これはまた違うことを行っているのでしょ
うか?

またそれぞれを体系的に分けると下記のようでいいのでしょうか?
Range-セルのオブジェクト
Spreadsheet-スプレッドシートのオブジェクト?
Worksheet-ワークシートのオブジェクト

致命的なのがワークシートとスプレッドシートの区別がつきません><

もしよろしければ
セルの値を取得するサンプルプログラムを1ついただけないでしょうか・・
PATIO様のおっしゃる通り基礎が理解できていないのに
こんな質問は大変申し訳ないのですがどうかお願い致します。

dairygoods 2002/10/17(木) 14:15:41
> CellsプロパティはRange、Spreadsheet、Worksheetクラスそれぞれに存在し
> それぞれ返す値が違うと・・でもどう違うのでしょう?・・・

どれも同じでしょう。VBオブジェクトの場合、いろんなオブジェクトから
同じオブジェクトにアクセスできるようにするのを好むようです。


> expression.Cells(Row, Column)とは何を言っているのでしょうか?

ヘルプに「Range オブジェクトでは、Item プロパティが既定のプロパティ」とありますが、
VBでは、メンバを省略した場合、既定のプロパティを指定したものと見なされます。
つまり、sheet.Cellsという記述は、sheet.Cells.Itemと同じ意味になります。
そのため、sheet.Cells(col,row)は、sheet.Cells.Item(col,row)と解釈されます。


> 致命的なのがワークシートとスプレッドシートの区別がつきません><

ヘルプの図(この図は継承関係ではありません)にある通り、
ワークシートと選択範囲とツールバーとウィンドウ枠をまとめたものが
スプレッドシートです。


> セルの値を取得するサンプルプログラムを1ついただけないでしょうか・・

関数一覧を眺めて予想:
sheet.GetCells().GetItem(row, col).GetText();

ちる 2002/10/17(木) 16:28:41
もう少し質問させてください。

sheet.GetCells().GetItem(row, col).GetText();
を試してみました。

GetItemの引数rowとcolはconst struct tagVARIANT &型らしいですが
これがどのようなものか分かりません。

A1のセルをとりたい場合はどうすればよいでしょうか?

dairygoods 2002/10/17(木) 17:49:25
VARIANTの定義を見れば予想がつくと思いますが、
いろんなデータ型を入れる汎用型です。

直接利用するのは面倒なので、多くのライブラリでラップクラスを用意しています。


個人的な好みで _variant_t を使いますと、
行と列は多分整数値でしょうから、こんな感じでしょうか。

_variant_t ret = sheet.GetCells().
      GetItem(_variant_t(1L), _variant_t(1L)).GetText();
const char* text = (const char*)(_bstr_t)ret;

ちる 2002/10/18(金) 10:46:47
[[解決]]
ありがとうございました。
先はまだまだ長そうですが一応セルの値を入力することは出来ました。

今後は少々方向転換して、開発の容易であるVBのActiveXも視野に入れて
やっていきたいと思います!!!

VCは基礎からやり直します・・・(涙

ちる 2002/10/18(金) 10:53:10
[[解決]]
ダイアログ上にエクセルシートのまとめ(その1〜その3)

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200210/02100039.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200210/02100060.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200210/02100073.txt

古いスレッドには追加発言できません。