• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 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

lelion1000
質問者

お礼

詳しい解説ありがとうございます。

その他の回答 (2)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

こんな表現でもいいのかな??? 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

lelion1000
質問者

お礼

ありがとうざいます。

  • seastar3
  • ベストアンサー率69% (99/142)
回答No.1

 モジュールでレンジを指定しているから、どのシートのセルかを特定できないのではないかと推測します。 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

lelion1000
質問者

お礼

ありがとうございます。参考にさせていただきます。

関連するQ&A