- ベストアンサー
rangeオブジェクトについて
こんばんわ。 rangeオブジェクトの行数と列数を出したいのですが、やりかた教えていただけませんでしょうか。 以下のように、方法1と方法2を試しましたが、「オブジェクトが必要です」というエラーになります(;;)ついでに、以下2つがなぜだめかも後学のために教えてください(;;) よろしくお願いします。 方法1-- dim rng as range set rng = range(cells(1,1),cells(2,2)) with rng msgbox .columns(.columns.count).column end with 方法2-- dim rng as range set rng = range(cells(1,2),cells(2,2)) msgbox ubound(range,1) -- エクセル2003
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 Excel VBAは、特殊な部分があって、ローカルモジュールは、イベント・ドリブン型などの明確な目的がなければ、標準モジュールを使うことになります。標準モジュールなら、最初のコードは通ります。以下は、掲示板掲載の時に、失敗が少ない書き方で、モジュールの違いの認識があれば、必ずしも、With ActiveSheet ~ End With は必要ではありません。 2番目のマクロは、Range型のオブジェクトからは配列は取得出来ません。 なお、「rangeオブジェクトの行数と列数を出したいのです」という目的では、Test1 の意味は違います。範囲の最終列を知りたいという意味だと思います。 その目的なら、基本的には、rng.Columns.Count, rng.Rows.Count です。 '------------------------------------------- Sub Test1() Dim rng As Range With ActiveSheet Set rng = .Range(.Cells(1, 1), .Cells(2, 2)) End With With rng MsgBox .Columns(.Columns.Count).Column End With End Sub '------------------------------------------- Sub Test2() Dim rng As Range With ActiveSheet Set rng = .Range(.Cells(1, 2), .Cells(2, 2)) End With MsgBox UBound(rng.Value, 1) MsgBox UBound(rng.Value, 2) End Sub
その他の回答 (2)
- tom11
- ベストアンサー率53% (134/251)
こんな表現でもいいのかな??? Public Sub f() Dim r As Range Set r = Range(Cells(10, 10), Cells(20, 20)) Debug.Print r.Column + r.Columns.Count - 1 Debug.Print r.Row + r.Rows.Count - 1 End Sub 実行結果 20 20
お礼
ありがとうざいます。
- seastar3
- ベストアンサー率69% (99/142)
モジュールでレンジを指定しているから、どのシートのセルかを特定できないのではないかと推測します。 Sheets(1).Activate のようにActivateメソッドを使えば反応するでしょう。元ソースでシート2を操作し、シート1に戻るようにするコードは以下のようになります。 Public Sub cell_check() Dim rng As Range Sheets(2).Activate Set rng = Range(Cells(1, 1), Cells(2, 2)) With rng MsgBox .Columns(.Columns.Count).Column End With Sheets(1).Activate End Sub
お礼
ありがとうございます。参考にさせていただきます。
お礼
詳しい解説ありがとうございます。