『Variant/Object/Range とObject/Range の違い』(まさる)
$D$1から$D$148まで1つのセルごとに処理したかったので以下のようにしたのですが
For Each rng In Range(Range("D1"), ActiveSheet.UsedRange).Columns(Range("D1").Column)
Debug.Print rng.Address → $D$1:$D$148
Next
一回しかループが回りません。 いろいろ試して、だいぶ時間を使いましたが、以下のようにしたら思い通りに動作しました。 (ほかにもっといい方法があれば教えてください)
For Each rng In Range(Range(Range("D1"), ActiveSheet.UsedRange).Columns(Range("D1").Column).Address)
Debug.Print rng.Address → $D$1,$D$2・・・・$D$148
Next
ウォッチで型を確認しました。 Variant/Object/Range とObject/Range の違いって何でしょうか
Range(Range("D1"), ActiveSheet.UsedRange).Columns(Range("D1").Column)→Variant/Object/Range
Range(Range(Range("D1"), ActiveSheet.UsedRange).Columns(Range("D1").Column).Address)→Object/Range
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
ループしたいのは、D列ですかG列ですか?_
例えば
Range("D1:Z10").Columns(4) は、D列を起点に4番目の列なのでG列になります
D列をループしたいなら、
For Each Rng In Range(Range("A1"), ActiveSheet.UsedRange).Columns("D").Cells
Debug.Print Rng.Address
Next
です。
最後に .Cells をつける
>Range(Range("D1"), ActiveSheet.UsedRange).Columns(Range("D1").Column)→Variant/Object/Range
は、Columnsプロパティの4番目のアイテムですが、これが Variant/Object/Range になるようです
(´・ω・`) 2026/05/22(金) 10:36:40
$D$1から$D$148まで1つのセルごとに処理したかった
のであれば
For Each rng In Range("D1:D14")
と書けばよいだけですが、そのように複雑な書き方をしたい理由は何かあるのでしょうか?
(4xmy) 2026/05/22(金) 11:05:50
こんなテストプログラムをやってみたらなにかヒントになりますか?
Sub test()
Dim c As Range
For Each c In Range("A1:D5").Cells ' すべてのセルで繰り返し
Debug.Print c.Address
Next
Debug.Print "--------------"
For Each c In Range("A1:D5").Columns ' すべての列で繰り返し
Debug.Print c.Address
Next
Debug.Print "--------------"
For Each c In Range("A1:D5").Rows ' すべての行で繰り返し
Debug.Print c.Address
Next
Debug.Print "--------------"
For Each c In Range("A1:D5").Columns(2) ' 2番目の行で繰り返し
Debug.Print c.Address
Next
Debug.Print "--------------"
For Each c In Range("A1:D5").Columns(2).Cells ' 2番目の行のすべてのセルで繰り返し
Debug.Print c.Address
Next
End Sub (´・ω・`) 2026/05/22(金) 11:29:14
(´・ω・`)さん、ありがとうございます。
>ループしたいのは、D列ですかG列ですか?_ D列です。たまたま UsedRange が A列を含んでいたので気づきませんでした。
やろうとしていることは同じでしたね。
Range("D1:D100") をループさせると 1行から100行まで処理できるのは知っていたので
Range(Range("A1"), ActiveSheet.UsedRange).Columns(Range("D1").Column) を
Address でもう一度 Range で指定すれば行けると思ってやりました。
Columns(Range("D1").Column) と Columns("D")
Range(rng.address) と rng.Cells
結果同じになるこういうやり方が思いつきませんでした。
rows や Columns を使うと Variant/Object/Range になって Range や Cells を使った時は Object/Range になることがわかりました。
(4xmy)さん
>そのように複雑な書き方をしたい理由は何かあるのでしょうか?
最終行がわからないからなのですが、もちろん
For Each rng In Range("D:D")
としても構わないのですが、無駄な処理時間は使いたくなかったので
(まさる) 2026/05/22(金) 14:42:50
> rows や Columns を使うと Variant/Object/Range になって > Range や Cells を使った時は Object/Range になることがわかりました。 私はそんなこと書いてないです
For each var in ○○ を使うとき ・varがセル/行/列でループするかは、○○.△△ の△△プロパティが何かで決まる (○○はRnageオブジェクト、△△はCellsプロパティ、Columnsプロパティ、Rowsプロパティ、Areasプロパティなど) ・Range.Columns の型は、Object/Range ・Range.Columns(4) は Range.Columns.Items(4) と同じで、これの型は、Variant/Object/Range ・varがセル/行/列のいずれになるかは、○○の型がVariant/Object/Range なのか Object/Range に関係がない (´・ω・`) 2026/05/22(金) 15:03:15
横から済みません。ちょっと教えてください。
> ウォッチで型を確認しました。 > Variant/Object/Range とObject/Range の違いって何でしょうか
> ・Range.Columns の型は、Object/Range
変数の型定義を、Variantにしたか、Objectにしたか の違いしか私は考えられないのですが、 他に、Object/Range になるケースがあるんですか?(ある場合、変数の型は何にしたのですか?)
(半平太) 2026/05/22(金) 16:08:44
質問者さんの確認した方法について、想像ですがたぶん間違ってないと思います
例えばウォッチ式にRange("A1:B2").Columns と入れてください
または
Dim rng As Range
Set rng = Range("A1:B2")
として、ウォッチ式に rng.Columns と入れてください
変数 rng は Range/Rangeですが、
rng.Columns は Object/Ragen
Range("A1:B2").Columns は Object/Range になります
(´・ω・`) 2026/05/22(金) 16:22:46
(´・ω・`)さん
ありがとうございました。
Range("A1:B2").Columnsの型が、Object/Ragen になっているのを確認できました。m(__)m
(半平太) 2026/05/22(金) 16:40:54
>For Each rng In Range("D:D") としても構わないのですが、無駄な処理時間は使いたくなかったので
For Each rng In Range("D:.D")
↑
MS365でしか使わないなら、ドットを挿入すれば済むんじゃないですか?
(半平太) 2026/05/22(金) 16:44:13
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.