[[20260522100956]] 『Variant/Object/Range とObject/Range の違い』(まさる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『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.