Excelの選択したセルの行数を取得するにはどうしたらよいでしょうか。
VBAでは Selection.Row で取得できたと思いますが、
VB.NETでは Selectionオブジェクトに Rowプロパティがありません。
宜しくお願いします。
まず、Selection はプロパティです。
オブジェクトを返すプロパティです。
返されるオブジェクトは1つではありません。
>Selectionオブジェクトに Rowプロパティがありません。
そのような解釈がいつでも成り立つようなプロパティでは
ありません。対象により用意されているプロパティは変化します。
[VB.NET]から Excel のオブジェクトへ出した命令は、実際は[Excel VBA]と
同じ処理が呼び出されて実行されます。
>VBAでは Selection.Row で取得できたと思いますが、
>VB.NETでは Selectionオブジェクトに Rowプロパティがありません。
それはあり得ません。
ただし、Selection が目的の Excel のオブジェクトを正しく
指しているならという前提条件付で。Rowプロパティを持たない
オブジェクトが対象であれば当然 Rowプロパティは存在しません。
> VBAでは Selection.Row で取得できたと思いますが、
Selectionプロパティから返されるオブジェクトは、その時々で変わります。
(だからこそ、戻り値が Variant/Object 型になっているわけで)
そして、Rangeオブジェクトを返す場合には、Row プロパティが参照できます。
> VB.NETでは Selectionオブジェクトに Rowプロパティがありません。
この部分に関しては、実行時バインディングを用いて下さい。
(本来は、Range 型にキャストできればよいのですが…)
つまり、Option Strict Off モードにしておいて、
Dim O As Object = 〜.Selection
Dim C As Integer = O.Row
のようなコードになりますね。
どうしても Option Strict On モードにしておかなければならないなら、
Dim O As Object = 〜.Selection
Dim C As Integer = CInt(CallByName(O, "Row", CallType.Get))
のように書く事もできます。
# CallByName を使った書き方は、VBA でも使えますね。
魔界の仮面弁士さん、特攻隊長まるるうさんご回答ありがとうございます。
CInt(CallByName(〜.Selection, "Row", CallType.Get))
上記の方法でうまくいきました。
ツイート | ![]() |