- ベストアンサー
データ検索ネスト Excel VBA
excel2003でデータ検索の処理をするというマクロをVBAで作成したいのですが、うまく動作しません。自作のVBAを記載してみましたので何が原因なのか教えてください。初心者です、よろしくお願いします。 Sub データ検索() Dim i As Integer, j As Integer, k As Integer, l As Integer Dim myRange As Range Dim IngLastrow As Long IngLastrow = Range("A65536").End(xlUp).Row For i = 3 To IngLastrow For j = 3 To 25 For k = 8 To 53 For l = 3 To 9 Set myRange = Worksheets("データベース").Cells(i, "o").Find(what:=Worksheets("コード").Cells(j, "o").Value, _ LookIn:=xlValues) If Not myRange Is Nothing Then Worksheets("予定").Cells(k, l).Value = myRange.Offset(, -12).Value End If Next l Next k Next j Next i End Sub
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 仕様がまったく理解出来ません。 各シートのセル○○~○○にどんなデータが入っているか? 日付や時刻ならばシリアル値か? (セルの書式設定で表示形式を標準にした場合に、数値になってしまうか?) > コード:O3:O25 30分間隔で時間を入力しています > > 9:00 > 9:30 > 10:00 ・・・のように セルO3 に 9:00、O4 に 9:30 ・・・ O25 は 20:00 ですか?※1 「コード」シートの必要性もいまいち理解出来ませんけど、、、 > データベース:C列 仕事内容 > O列 予定時間 O列の予定時間に、実際にはどんなデータが入っているのでしょう? シート「予定」には日付と時間の概念がありますが、シート「データベース」には日付の説明がありません。 セルO3 には日付+時間、具体的には「2008/4/25 8:30:00」のような入力値ですか? セルO3 に上記データが入力されている場合、セルの書式設定で表示形式を標準にすると 「39563.3541666667」になりますか? 2008/4/25 8:38:00 のように一致しない場合があるのか? D列~N列までは不要なデータ? > 予定シート A7:I7 1週間分の日付が入力してあります。 > B8:I53 30分間隔で時間が入力されています。 セルA7 に 4/20 、セルB7 に 4/21 と入力されているとして、セルI7 は 4/28 になります。 これでは一週間以上の日付になっています。 セルA7 に 4/20 で セルA8:A53 は空白? セルB7 に 4/21 で セルB8 に 9:00 、B9 に 9:30 ・・・B53 に 8:00 ? ・ ・ セルI7 に 4/28 で セルI8 に 9:00 、I9 に 9:30 ・・・I53 に 8:00 ? これでは1日以上の時間になってしまいますし、上記の※1とも対比する時間が異なります。 --- 多分こんなんじゃないと思いますけど、、、 動かないコードでどこが悪いか問うても、どういう仕様でどう動くべきかの説明がなければ回答者には答えられません。 百聞は一見にしかず、、、 ひと目でわかる内容でも、細かすぎるくらいの説明じゃないと文章ではなかなか伝わりません。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
私も#1の最初の部分の、ご意見に同感。 自分流のコードを長々と挙げて(今までの例では我流が多い)、読者回答者に読ませ、読解させ、うまく動作しません1ことで、ずばり原因を指摘してくださいでは困る。回答者は家庭教師や添削者じゃない。 プログラムロジックも文章で説明も添えるとか データ模擬実例も挙げるのが良い。 ーーーー 質問に関し、推測で言えば 1語(1列)の検索(例えばA列が東京の行)で見つけて終わりというのなら、VBAはFindなどで簡単でしょう。 該当が複数ある場合もFindNextなどを使って、なんと言うことは無い。 ーー 2条件(例えばA列東京、B列年齢30歳以上)など該当を探し出すとなると、ループのネストだけでは出来ない。 ワークエリアに東京該当のレコードを溜め込み、溜め込んだレコードから、30歳以上を探す(以下C列も条件あれば繰り返し)様なことを やらないといけないが、それをやっていないようだが、私の言うことはピンとハズレかな。 またはA+B列ソートして、東京+年齢が固まるので、そこでは1回読みで済ませられる。 そのほかに質問には関係ないが、検索用にデータ構造を本格的に構築するとかある。 むしろアクセスなどのSQLに持ち込んで処理する人も居るとおもう。 SQL文の記述は条件が増えても簡単で済む。この面でSQLの威力はすごい。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 Nest を4層にして、ざっとみても、5万回以上、Find メソッドを繰り返すというのは、コードがおかしいです。これだけすると、メモリが逃げないので、動かないというよりも、ハングしませんかしら。 Find メソッドは、セルに対しては行いません。 ×Worksheets("データベース").Cells(i, "o").Find #1,2 さんで出来ていればよいのですが、一度、自分がこうしたいのだ、という説明をしていただいたほうがよいですね。 この意味が分かりません。 For k = 8 To 53 For l = 3 To 9 If Not myRange Is Nothing Then Worksheets("予定").Cells(k, l).Value = myRange.Offset(, -12).Value End If Next Next C8:I53 までの範囲を、見つけたセルのD列目のひとつのデータを埋め尽くすということでしょうか。
- papayuka
- ベストアンサー率45% (1388/3066)
#1です。 完全に憶測ですが、 「コード」シートのO3:O25 にある値が「データベース」シートのO列にあるか順番に調べる。 見つかった場合は「データベース」シートの同行 C:I列を「予定」シートのC列最終行に転記する。 って意味と捉えてサンプルを書いてみました。 Sub Test() Dim j As Long, myRange As Range For j = 3 To 25 Set myRange = Worksheets("データベース").Columns("O:O").Find _ (what:=Worksheets("コード").Range("O" & j).Value, lookat:=xlWhole) If Not myRange Is Nothing Then myRange.Offset(0, -12).Resize(1, 7).Copy Worksheets("予定").Range("C65536").End(xlUp).Offset(1, 0). _ PasteSpecial xlPasteValues End If Next j Application.CutCopyMode = False End Sub
- papayuka
- ベストアンサー率45% (1388/3066)
何をされたいのかと、サンプルデータをまじえてデータの構造など提示された方が良いと思います。 シート名「コード」の O3~Oxx シート名「データベース」の O3:O25 シート名「予定」の C8:I53 これらの関連が見えませんし、何をしたいのかも見えません。 シート名「コード」の O3:O25 をデータベースのO列から探すのに「データベース」のO列をループする必要があるのか? 見つかった場合に「予定」にC列~I列に同じデータを書き込む? やりたい事を実現するのに、はたしてこんなにネストが必要な処理なのかなと思います。
補足
>「コード」シートのO3:O25 にある値が「データベース」シートのO列にあるか順番に調べる。 見つかった場合は「データベース」シートの同行 C:I列を「予定」シートのC列最終行に転記する。 ありがとうございます。 すみません、大体が察しのとおりなのですが、一部説明の訂正補足します。 シート:「コード」「データベース」「予定」の3種類です 「コード」O3:O25 にある30分間隔の時間が「データベース」O列と一致したら「予定」C:I列に「データベース」C列の仕事内容を転記する。 コード:O3:O25 30分間隔で時間を入力しています 9:00 9:30 10:00 ・・・のように データベース:C列 仕事内容 O列 予定時間 予定シート A7:I7 1週間分の日付が入力してあります。 B8:I53 30分間隔で時間が入力されています。 要は、「データベース」内のスケジュール内容を「予定」シートに転記するという内容なのですが、初心者にはちょっと難しすぎでしょうか?