これまでで一番「情けなかったとき」はいつですか?

こんばんわ。
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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/08 18:18

こんな表現でもいいのかな???




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
    • good
    • 0
この回答へのお礼

ありがとうざいます。

お礼日時:2010/02/08 18:19

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



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
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/02/08 18:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報