
エクセルVBAで何度もお世話になってます。目的のものほぼ完成いたしましたが,少しずつ改良してま
す。
いろいろ検索してますと,For Next の処理よりも,For Each Nextの処理が早いとあります。
そこで,For Each Nextを使ったものを他サイトを参考に,下記のように作成しました。
Dim Kensaku_hani As Range
Dim colRng As Collection
Set colRng = New Collection
colRng.Add Worksheets("処理記録y").Range("G2:G10")
For Each Kensaku_hani In colRng
MsgBox Worksheets("処理記録").Cells(Kensaku_hani.Row, Retu).Value
Next
動かしてみると,ループが一回シカ回りません。それと Kensaku_hani.Value も取得できません。
シートをアクティブにしてしまえば,Collctioon を使わずともできるのですが,Collectionを
使うとうまくいきません。アドバイスをお願いできればと思います。実際の運用では,
MsgBoxのところで,検索,転記を行います。
No.4ベストアンサー
- 回答日時:
No.1です。
Collection ではなく Dictionaryオブジェクトなら、
Dim myDic As Object
Dim r As Range
Set myDic = CreateObject("Scripting.Dictionary")
Set myDic("範囲") = Worksheets("Sheet1").Range("A1:A5")
For Each r In myDic("範囲")
Debug.Print r.Value
Next
Set myDic = Nothing
こんな感じでも行けましたけど?
No.6
- 回答日時:
No.5のお礼について。
>最初の質問のマクロに,抜けていた部分があり,
いえ、抜けてませんよ。
私が試したのはRangeオブジェクトを変数に入れるにはNo.5の
>Set myDic("範囲") = Worksheets("Sheet1").Range("A1:A5")
のようにSetステートメントでやらないとダメみたいって感じがしたと言う事です。
Collectionは .Add で値を入れていくみたいなのでSetステートメントを使おうとしてもエラーばかりでした。
単純に方法を見つけられないだけだったのかもしれませんけど。
No.5
- 回答日時:
初級者の検証なので間違いは確実かもですが。
CollectionってSetステートメントが使えないのではないかなと。
いくつか試しましたがエラーになってしまいました。
検証ありがとうございます。
最初の質問のマクロに,抜けていた部分があり,
Dim colRing As Collection
Set colRing=New Collection
みたいにするみたいでした。
何度もありがとうございました。
No.3
- 回答日時:
こんばんは、
New Collection
colRng.Add の内容(意味)item.keyをご確認ください。
For Each Kensaku_hani In colRng.Item(1)
If Not Kensaku_hani Is Nothing Then
MsgBox Worksheets("処理記録").Cells(Kensaku_hani.Row, Retu).Value
Next
違っていたら、ごめんなさい。
アドバイスありがとうございます。
>colRng.Add の内容(意味)
最初ここがよく分かりませんでしたが,
ネットでくぐってみて,やっと意味が分かりました。
範囲を入れれば,範囲の間のものが自動で入る,みたいに
思っておりました。
アドバイスありがとうございました。
No.2
- 回答日時:
>colRng.Add Worksheets("処理記録y").Range("G2:G10")
上記文は、コレクションにRangeオブジェクトを1個追加しただけなので、ループは1回しか回らないし、Kensaku_haniはRangeオブジェクトです。
colRngをウォッチすれば、分かりやすいです。※添付画像参照。
高速化目的なら、Range.GetData()を呼び出して値を配列化する手を使うとか。

アドバイスありがとうございました。
あるサイトに載っていたもの疑わずに使いました。
いろいろくぐってみると,要素を追加する必要があるようで,
勉強になりました。
下記のように,要素を追加したら,うまく行きました。
For k=2 To 最終行
colRing.Add WorkSheets("処理記録").Cells(k,5)
Next
これでいいのかどうか解りませんが。
それから,Range.GetData() を使うと高速化がはかれるとの
ことですが,どのようにしたらいいのかはまだ,解りません。
いろいろ勉強になるアドバイスありがとうございました。
No.1
- 回答日時:
普通
Dim Kensaku_hani As Range
Dim colRng As Range
Set colRng = Worksheets("処理記録y").Range("G2:G10")
For Each Kensaku_hani In colRng
MsgBox Worksheets("処理記録").Cells(Kensaku_hani.Row, Retu).Value
Next
ともにRangeにするとかでは?(Retu ってなに?)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
For ~ Next文
-
どう増強すべきか
-
特定の名前のオートシェイプの...
-
VBA Vlookup #N/A表示させない方法
-
winsockの非同期処理について
-
【C#】Page_Loadさせない方法に...
-
Functionで戻り値を複数返す方法
-
ExcelのVBAで、選択したファイ...
-
Excel VBA セルの名前があるか...
-
IF文に時間(何時から何時ま...
-
VBAで組み合わせソフトを作ろう...
-
エクセルVBAでプロシージャ名を...
-
複数個のTextBoxでいずれかの内...
-
パソコンへの「Dropbox...
-
VBA シートのボタン名を変更し...
-
コントロールの存在確認
-
VBAでオプションボタンによって...
-
「Columns("A:C")」の列文字を...
-
ユーザーフォームを表示中にシ...
-
VBAがブレークモードになっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
vbaのエラー対応(実行時エラー...
-
シグナル 6(SIGABRT)とは?
-
IF文に時間(何時から何時ま...
-
マクロで、次のコードへ行く前...
-
Excel VBA セルの名前があるか...
-
どう増強すべきか
-
特定の名前のオートシェイプの...
-
途中で処理を中断させたい (ア...
-
特定のファイルを他のプロセス...
-
順番に処理させたい
-
Word VBA。各マクロの間に待ち...
-
StatusStripの表示が更新されな...
-
ドリブン??
-
ExcelのVBAで、選択したファイ...
-
RaiseEventのメリット
-
【VBA】エラー処理で別プロシー...
-
エクセルVBAでロックをかけたい
-
どうやってもFor文を抜けてしま...
おすすめ情報