- 01: 名前:佐々木 投稿日:2000/07/03(月) 20:06
- こんにちは。
Visioのオブジェクトモデルについて質問です。
シェイプの情報を全て取得したいのですが、全Sectionの全Rowの全Cellを取得するのって
For〜などを使って行うのは、無理でしょうか?
いづれもコレクションになっていないので、無理だと思っているのですが…。
取得したいSection,Row,Cellをプログラムで指定する以外に方法はないのでしょうか?
なにかいい方法がありましたら、ご教授お願いします。
Visio2000です。
- 02: 名前:かど 投稿日:2000/07/03(月) 20:22
- かどです。
>シェイプの情報を全て取得したいのですが、全Sectionの全Rowの全Cellを取得するのって
>For〜などを使って行うのは、無理でしょうか?
SectionExits() でそのセクションが存在するかどうか調べて
RouCount分の情報を
GetResults() or GetFormulas() で一気に取得するっていうのは
どうでしょうか?
もっとスマートな方法があるかもしれません。
- 03: 名前:Licca 投稿日:2000/07/04(火) 10:39
- Sectionインデックス定数などを指定せずにForループで一気にデータを取得するのは出来ないと思います。
面倒かもしれませんが、一つずつのSectionを指定する作業は避けられないのではないでしょうか。
かどさんの
>Row.Count分のデータ
は、その行のデフォルトのデータしか取得できないと思います。
例えばコントロールセクションのY座標のデータは取得できないとか。
外していたらごめんなさい。
- 04: 名前:かど投稿日:2000/07/04(火) 13:12
- かどです。
言葉足らずでした。
>Sectionインデックス定数などを指定せずにForループで一気にデータを取得するのは出来ないと思います。
>面倒かもしれませんが、一つずつのSectionを指定する作業は避けられないのではないでしょうか。
確かに一つ一つのセクションをアクセスする事になりますが、例えば、
SectionとCellIndexをテーブルに持ち For で回すことは出来ると思います。
>かどさんの
>>Row.Count分のデータ
(タイプミス、修正感謝します >> Licca さん)
>は、その行のデフォルトのデータしか取得できないと思います。
>例えばコントロールセクションのY座標のデータは取得できないとか。
Dim cellTables() as Integer
...
cellTables = (visSectionControls, visCtlX, visCtlY, visCtlXDyn...)
のようなテーブルを事前に準備し、これと RowCount を織り交ぜれば
何とかなりませんかねぇ?
(テーブルを作るのが結構大変かも!!)
これも、1個ずつSection の Cell の情報をもとめるのと
大して変わらないというお話であれば、退散します。
予断ですが、2000のSetFormulas()は5.0のそれに比べてはるかに処理スピードが
遅いと思うのですが、皆さん、どうでしょう?
- 05: 名前:佐々木 投稿日:2000/07/04(火) 14:07
- かどさん、Liccaさん、情報ありがとうございます。
GetFormulasメソッドの存在を知りませんでした。
取得したい情報のSection、Row、Cellのテーブルを定義しておいて、
それを使おうと思っていたところです。
Type TYPE_CELL_INDEX
iSec As Integer
iRow As Integer
iCel As Integer
End Type
Dim aryCells() As TYPE_CELL_INDEX
↑こんな構造体の配列です。
ところが、GetFormulasメソッドの使い方がよく分かりません。
あらかじめ取得したいCellのインデックス(Section、Row、Cell)を配列で用意して
実行すると、一気に取得できると思っているのですが、ヘルプでいう「SID_SRCStream」の指定方法について、
ヒントを頂けないでしょうか?
- 06: 名前:かど 投稿日:2000/07/04(火) 18:18
- かどです。
既に解決されたかも知れませんが・・・。
>ところが、GetFormulasメソッドの使い方がよく分かりません。
>あらかじめ取得したいCellのインデックス(Section、Row、Cell)を配列で用意して
>実行すると、一気に取得できると思っているのですが、ヘルプでいう「SID_SRCStream」の指定方法について、
>ヒントを頂けないでしょうか?
SID_SRCStream を Dim pSrc() As Integer とします。
佐々木さんもお書きになっておられますが、pSrc() にはSection,Row,CellIndexを
記述します。
つまり、1つのセルに対し、配列3つ必要になります。
Dim aryCells() as TYPE_CELL_INDEX
Dim pSrc() as Integer
Dim pArray() as Variant
....
Redim pSrc(0)
If Shape.SectionExists(aryCells(i).iSec, 0) = True Then
For j = 1 To Shape.RowCount(aryCells(i).iSec)
Redim Preserve pSrc(Ubound(pSrc)+1)
pSrc(Ubound(pSrc)) = aryCells(i)
Redim Preserve pSrc(Ubound(pSrc)+1)
pSrc(Ubound(pSrc)) = j '''' 行番号
Redim Preserve pSrc(Ubound(pSrc)+1)
pSrc(Ubound(pSrc)) = aryCells(i).iCel '''' CellIndex
Next j
EndIf
Shape.GetFormulas pSrc(), pArray()
pSrc() の配列を増やす部分はもっとうまい方法を考えてください。:-)
ただし、このプログラムは試していませんし、タイプミスもあるかとは
思いますが、ご容赦ください。
- 07: 名前:佐々木投稿日:2000/07/04(火) 19:59
- かどさん、ありがとうございます。
Section,Row,Cellのインデックスを順番にセットした配列を用意するのですね。
たしかにヘルプの言っているとおりです。やっと理解できました。
ありがとうございます。
■トップに戻る リロード 単独スレ表示
|