• ベストアンサー

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

  • VBAで、セル(Range)のオブジェクトが取得できない

    セルの情報を取得したいのですが、何故か以下のように書くと上手い具合に取得できません(A、B、Cは数値の変数)。 ------ Dim Rng As Range 'セル範囲を格納 Set Rng = Worksheets(1).Range(Cells(A, B), Cells(A, C)) ------ 以下のようにしてやると、何とか取得できます。 Worksheets(lngASNo + 1).Select Set Rng = Range(Cells(A, B), Cells(A, C)) どこが悪いのでしょうか? もし、判る方がいらっしゃいましたら、よろしくお願いいたします。

  • CountBlankの範囲指定について

    VBA勉強中の者です 変数にて指定した範囲の空白セルをカウントする為に、以下のコードを作成しました。 Sub test() Dim rng As Range Set rng = Range(Cells(1, 1), Cells(1, 10)) Dim CntBnk As Long '-------↓以下が認識されないコード-------------- CntBnk = WorksheetFunction.CountBlank(ActiveSheet.Range(rng)) '--------------------------------------------------- MsgBox (CntBnk) End Sub CountBlankの範囲指定の方法が間違っていると思われます。 簡単に CntBrk = rng.CountBlank と入力するなどしてみましたが、やはりダメでした。 自分なりに調べつつ改善してみたものの解決に至らず、どなたかご助力お願い致します。

  • 作成方法についての質問です。

    下記のマクロで実行すると添付画像[現状]のようになってしまいます。 私としては[こうなってほしい]の形にしたいのですが、どこに何を組み込めばよいかわかりません。 誰か教えてください。 Dim Matches As Object Dim Match As Object Dim i As Long, j As Long Dim a As Variant With CreateObject("VBScript.RegExp") Set rng = Range("A1", Cells(Rows.Count, 1).End(xlUp)) Application.ScreenUpdating = False For i = 1 To rng.Rows.Count If InStr(1, rng.Cells(i, 1).Value, "(", 1) > 0 Then .Pattern = "\(([A-z\d,]+)" Else .Pattern = "([A-z\d,]+)" End If .Global = True Set Matches = .Execute(StrConv(rng.Cells(i, 1).Value, vbNarrow)) If Matches.Count > 0 Then a = Matches(0).SubMatches(0) a = Split(a, ",") Cells(i, 2).Resize(, UBound(a) + 1).Value = a End If j = 0 Next End With Application.ScreenUpdating = True Set rng = Nothing End Sub

  • Excelオブジェクトの解放

    VBでExcelを編集しています。 下記コードを実行するとExcelがタスクに残ったままになります。 どうしたら解放されるでしょうか。 (処理は少し省略しています) Dim objExcel as Object Dim objExcelBook as Object Dim objExcelSheet as Object Set objExcel = CreateObject("excel.application") Set objExcelBook = objExcel.Workbooks.Open(パス, 0) Set objExcelSheet = objExcelBook .Sheets(シート名) With objExcelSheet.Range(Cells(1,2),Cells(3,2)).Borders(xlEgeBottom) .LineStyle = xlContinuous End With Set objExcelSheet = Nothing Set objExcelBook = Nothing Set objExcel = Nothing

  • For~Next ループ内でUnionメソッドを使うとエラーになります。

    下記の記述で2行おきのセル範囲から0以下のセルを除外したセル範囲を取得しようとすると Set Rng = Application.Union(r, Rng) の行でエラーが発生します。 'Set Rng = Range(Cells(12, 7), Cells(12, 7)) の行のコメントアウトをはずすと動きますが、 cells(12,7)の値が0以下だと本来の目的 である0以下のセル範囲を除外するという目的が果たせません。 Union(r,Rng)のRngがnothingになっているとエラーの原因になるのでしょうか? Private Sub test() Dim r As Range Dim Rng As Range 'Set Rng = Range(Cells(12, 7), Cells(12, 7)) For i = 12 To 27 Step 3 If Cells(i, 7) > 0 Then Set r = Range(Cells(i, 7), Cells(i, 7)) Set Rng = Application.Union(r, Rng) End If Next i Rng.Select End Sub 以上教えてください。 お願いします。

  • オブジェクト??

    またまた困っております inputboxで入力した日付を検索して複数選択しようとしたのですが unionの使い方がよくわかりません(・・;) どこが間違っているのかもしくは何が足りないのか教えてください<m(__)m> どうかよろしくお願いします! Option Explicit Sub グラフ() Const SH_NAME As String = "VBA" Dim art As String Dim i Dim ws As Worksheet Dim endrow As Long Dim msg As String Dim writerow As Integer Dim grahu As Chart Dim target As Range Set ws = ThisWorkbook.Worksheets(SH_NAME) writerow = 2 art = InputBox("日付を入力してください") With ws endrow = .Cells(Rows.Count, 2).End(xlUp).Row For i = 2 To endrow If art = .Range("A" & i) Then Set target = Union(target, "D" & i) Else If InStr(msg, .Range("A" & i)) = 0 Then msg = msg & .Range("A" & i) & vbCrLf End If End If Next i target.Select End With If msg <> "" Then MsgBox msg End If MsgBox "グラフベースを作成しました" End Sub Set target = Union(target, "D" & i) ↑ここでエラーが起きて 「オブジェクトが必要です」と言われました どうすればよいのでしょうか?

  • ExcelVBAのRangeで複数指定

    Excel 2003 のVBAで質問です。 以下のサンプルプログラムですが、最後の MsgBox で 1 になってしまいます。 3 が帰ってくるようにするには、Range でどのように指定すればよいのでしょうか。 宜しくお願いします。 〔Sheetの値〕 ┌─┬─┬─┬─┐ │*│A│B│C│ ├─┼─┼─┼─┤ │1│11│12│13│ ├─┼─┼─┼─┤ │2│21│22│23│ ├─┼─┼─┼─┤ │3│31│32│33│ ├─┼─┼─┼─┤ │4│41│42│43│ ├─┼─┼─┼─┤ │5│51│52│53│ └─┴─┴─┴─┘ 〔サンプルプログラム〕 Dim myArray1, myArray2 As Variant myArray1 = ThisWorkbook.ActiveSheet.Range("A1:C5") myArray2 = ThisWorkbook.ActiveSheet.Range("A1:A5,B1:B5,C1:C5") '指定が間違ってる? MsgBox UBound(myArray1, 1) '結果 5 MsgBox UBound(myArray1, 2) '結果 3 MsgBox UBound(myArray2, 1) '結果 5 MsgBox UBound(myArray2, 2) '結果 1 → 3になって欲しい

  • VBAのRangeオブジェクトについて

    いつもお世話になっております。 VBAのRangeオブジェクトについてご教示下さい。 例えば下記のPGを組みます。 Sub test() Dim r As Excel.Range Set r = Me.Range("A1") Debug.Print r.Cells.Count End Sub この時、Debug.Printには"1"と表示されます。 Debug.Printでブレイクを置き、ここでA列を削除するとDebug.printでエラーが出てしまいます。 Rangeオブジェクト生成後、もしも参照先のセルが削除してしまった場合、条件分岐の処理を入れたいのですが、どのように処理をいれればよろしいでしょうか? セル削除後、Rangeのプロパティを参照した時点でエラーが発生してしまいます。 Typeで確認するとRangeがちゃんと取れるのですが・・・。 "参照先のセルが消されたかどうか"を判別する方法はあるのでしょうか?

  • データ型とオブジェクト型 プログラムとしてどちらが適切なのか??

    Sub test1() Dim R As String R = Cells(1, 1) MsgBox R End Sub Sub test2() Dim R As Range Set R = Cells(1, 1) MsgBox R End Sub どちらも同じ結果が返ってきます。 プログラムとしてどちらが適切なのでしょうか? サンプルなどで多く見かけるのはtest2なのですが 気のせいでしょうか?

  • Objectで宣言するのとObject型で宣言する

    Objectで宣言するのとObject型で宣言するのではどちらがいいでしょうか? エクセルです。 VBAでコードを作るにおいて、どちらのほうがいいのでしょうか? どちらも同じ動きをします。 Sub Sample1() Dim buf As Range Set buf = Range("A1") MsgBox buf.Value End Sub Sub Sample2() Dim buf As Object Set buf = Range("A1") MsgBox buf.Value End Sub ご回答よろしくお願いします。