C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■96656 / )  Re[7]: C#からWORD文書内のブックマークへ書き込み
□投稿者/ 魔界の仮面弁士 (2944回)-(2021/01/05(Tue) 16:47:26)
2021/01/05(Tue) 17:01:36 編集(投稿者)

No96653 (S.Kos さん) に返信
> ("hoge")はダメ、["hoge"]なら良し、この見分け(?)はどこにあるのでしょう・・

C# における ["hoge"] や [1] は、インデクサー (indexer) 構文と呼ばれるものです。

VBA / Visual Basic の世界においては、丸括弧指定による
「配列のインデックス」や「引数付きデフォルトプロパティ」にあたります。

https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/indexers/
http://tki.main.jp/hata/indexer2.html



> Word.Shape tmpShape = oWordDoc.Shapes["hoge"];

VBA で [F2] キーを押してオブジェクト ブラウザーを表示してみてください。
そして左上のドロップダウンで [Word]を選択しておきます。

左側のペインで Document オブジェクトをクリックしてみると、
右側に Shapes プロパティが現れます。それを選択すると、
|
| Property Shapes As Shapes
|  読み取り専用
|  Word.Document のメンバー
|
と記載されていることを確認できます。

このことから、oWordDoc.Shapes すなわち「Word.Document オブジェクト」の
Shapes メンバーが、「0 個の引数を受け取る読取専用プロパティ」であり、
その戻り値として Word.Shapes コレクション型を返すということが分かります。


さらに、そのオブジェクト ブラウザーにて、
左側のペインから Shapes オブジェクトを選択すると、
右側に Item プロパティが(他と異なる水色を纏ったアイコンで)現れ、その定義が
|
| Function Item(Index) As Shape
|  Word.Shapes の既定メンバー
|
と記載されていることを確認できます。

これはすなわち、「Word.Shpes オブジェクト」の
Item メンバーは、「1 個の引数を必要とするデフォルト メソッド」であり、
その戻り値として Word.Shape オブジェクト型を返すということが分かります。


Visual Basic では、プロパティの引数もメソッドの引数も
どちらも (丸括弧) で指定します。
引数が 0 個の時は丸括弧も省略できます。
そのプロパティやメソッドが、オブジェクトの「デフォルトメンバー」の場合
メンバー名を省略してアクセスすることも可能です。


一方 C# は、プロパティには引数を指定できません。
また、メソッドなら丸括弧指定で引数を指定しますが、
メソッドの引数が 0 個であっても丸括弧は省略できません。
ただし、「デフォルトメンバーを持つオブジェクト」の場合には、
[角括弧] を使った「インデクサー」構文を使うことで、
デフォルトメンバーへのアクセスが可能になります。


> Word.Shape tmpShape = oWordDoc.Shapes["hoge"];

上記を VBA の構文で記す場合、
 Dim tmpShape As Word.Shape
 Set tmpShape = oWordDoc.Shapes.Item("hoge")
と書けます。ただし Item はデフォルト プロパティのため、通常は
 Set tmpShape = oWordDoc.Shapes("hoge")
と書きます。

Shapes 型と Shape 型を明確に分ける場合には、意図的に
 Set tmpShapes = oWordDoc.Shapes '引数無し読取専用プロパティ
 Set tmpShape = tmpShapes("hoge") '引数付きデフォルトプロパティ
 'Set tmpShape = tmpShapes.Item("hoge") '引数付きデフォルトプロパティ
と書くこともあります。
先のオブジェクト ブラウザーの定義と見比べてみてください。


しかし C# においては、引数付きプロパティが言語仕様としてサポートされておらず、
かわりにインデクサーで代用されるようになっています。そのため上記は、
 tmpShapes = oWordDoc.Shapes;
 tmpShape = tmpShapes["hoge"];
あるいは
 tmpShape = oWordDoc.Shapes["hoge"];
という角括弧の構文に置き換わることになる…というわけです。


蛇足ですが、お使いの C# バージョンが古い場合には、
 tmpShape = tmpShapes["hoge"];
が使えず、代わりに、隠しメンバーとなる getter メソッド経由で
 object item = "hoge";
 tmpShape = tmpShapes.get_Item(ref item);
と書かねばならないケースもあります。

とはいえ、そこまで古いバージョンの C# 環境を使うことは
今となってはそうそう無いでしょうね。
返信 編集キー/


管理者用

- Child Tree -