- 締切済み
VBAでの1列すべての指定方法について。
こんにちは。 VBAでの1列すべての指定方法についてお伺いします。 Columns(1).Select For Each MyObj In Selection x = MyObj Next というようにA列を検索させていますが、 Select使わないでRange("A:A")と言う形で 指定させようと思っています。 (シートの切り替えをしたくないので。) For Each MyObj In Range("A:A") x = MyObj Next しかし、任意の列に対して数列ごとに飛ばしながら 実行していますので、列の指定の方法は英数ではなく 数値で行いたいです。 For Each MyObj In Columns(1) x = MyObj Next と指定が出来れば良いのですが、上手く動きません。 1⇒Aと変換できる関数でも構いませんので、 良い指定方法あれば、宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- KenKen_SP
- ベストアンサー率62% (785/1258)
#2です。補足します。ちゃんと例外処理すれば、こんな感じ。 Sub SampleCode() Dim SH As Worksheet Dim rngC As Range Dim rngTARGET As Range Set SH = ThisWorkbook.Sheets("Sheet1") Set rngTARGET = Intersect(SH.Columns(1), SH.UsedRange) If Not rngTARGET Is Nothing Then MsgBox "処理範囲は" & rngTARGET.Address For Each rngC In rngTARGET ’処理内容 Next rngC Else MsgBox "A列にはデータがないです" End If Set rngTARGET = Nothing Set SH = Nothing End Sub
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 > (シートの切り替えをしたくないので。) ならば、シートを指定しなければならないと思います。 それから、 For Each MyObj In Columns(1).Cells でも良いのですが、65536回ループすることになりますので、私は よく Intersect と UsedRange で処理範囲を限定させる方法を使って います。 Dim SH As Worksheet Dim MyObj As Range Dim i As Long Set SH = ThisWorkbook.Sheets("Sheet1") For Each MyObj In Intersect(SH.Columns(1), SH.UsedRange) i = i + 1 Next MyObj Set SH = Nothing MsgBox i 例えば、 For Each C In Selection といったコードは良くありますが、これだとユーザーが全セルを 選択した場合、莫大なループになってしまいます。大抵の処理は セルになんらかのデータがある範囲に限られるはずなので、 例えユーザーが全セルを選択したとしても、 Set rngTARGET = Intersect(Selection, Activesheet.UsedRange) としてループの範囲を狭めています。
- masa_019
- ベストアンサー率61% (121/197)
>For Each MyObj In Columns(1) これを For Each MyObj In Columns(1).Cells としてみれば?
お礼
有難う御座います。 期待したとおりの回答でした。
お礼
有難う御座います。 UsedRangeはいいですね。 私も使わせてもらいます。