- 締切済み
ForEach...文でRows(1)を指定エラー
For Each element In group ...Next ステート文で、group に Rows(1) を指定し、セルのValueプロパティを取得しようとするとエラー「型が一致しない」が出る。指定した範囲内の1行目のセルの値を確認しようと以下のマクロを作り、実行するとエラーが出る。その理由をどなたか教えてください。 Sub testA() Dim r0 As Range Dim r1 As Range Dim cr As Range Dim i As Integer Dim result as Boolean Set r0 = Worksheets("Sheet1”).Range("B4:D5") Set r1 = r0.Rows(1) For Each cr In r1 Debug.Print cr.Value ‘*** (0) エラー発生 Next cr ‘*** 以下はうまくいく。 For Each cr In r1 Debug.Print cr.row ‘*** (1) Debug.Print cr.Column ‘*** (2) Next cr result = TypeOf r1 Is Range ‘*** (3) Debug.Print result ‘*** True ‘*** 確認したいことをFor Each … Next を使わないで, ‘*** セルを相対位置で指定すればうまくいく。 For i = 1 to r1.Columns.count Debug.Print r1.Cells(1, i).row Debug.Print r1.Cells(1, i).Column Debug.Print r1.Cells(1, i).Value ‘*** エラーなし Next i End Sub よく分からないのは(1)(2)(3) なのに なぜ Value プロパティ取得で(0)「型が一致しない(実行時エラー’13’)」になるところです。環境はExcel 2013, Windows 10です。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
- okormazd
- ベストアンサー率50% (1224/2412)
お礼
Realbeatin さん ありがとうございました。 例示いただいた3例のうち1例目と2例目は理解できましたので、利用させていただきます。3例目については調べてみます。 反省 (1)Range オブジェクト についての理解が全く浅はかであることがわかりました。 「>'Rows態'のRangeオブジェクト」「>'Cells態'のRangeオブジェクト」について、理解できるかわかりませんが、調べてみます。 (2)「For each… 」文についても、group が Range であれば Cell 単位でループすると思い込んでいました。 後悔 For Each cr In r1 Debug.Print cr.row ‘*** (1) Debug.Print cr.Column ‘*** (2) Next cr を実行すれば、1回しかループしないので行単位であることに気がついたかも? 実際は(2)の後に(0)を付けて実行したので無理でした。 Debug.Print cr.Value ‘*** (0) エラー発生 (3)「TypOf」について オブジェクトの型について知りたいとネットで検索すると例があったので使いました(対象がRange ではなかったかも)。「 TypeName 」関数をしりませんでした。調べてみます。 詳しい説明をいただき大変参考になりました。 いろいろ勉強になります。 本当にありがとうございました。