- 締切済み
データ抽出に時間がかかり困っています
皆様大変お世話になっております。ところで、データ抽出の件で大変困っておりまして、ご教授いただきたくご連絡差し上げました(使用OSはXP、エクセルは2007です。)。企業の決算期データを抽出したいのですが、毎年度決算月のみのデータを月次データからどのようにすれば速く抽出できるかで悩んでおります。データの構成は:A列に年度・決算月(例えば、1978/03)、B列に企業コード、C列に年度・月(例えば、1984/01)、D列に企業コード、E列にはC・D列に対応した月次データが入力されております。A・B列は(各企業の年毎の決算月)各70698行、C・D・E列は(各企業の月次毎データ)各248964行となっております。ここで、A・B列に等しいC・D列のセルをみつけ、その横のE列の値を当該A・B列に対応した行のF列に書き出させたいのです(回りくどい説明で申し訳ありません。)。初心者ながら、いろいろなVBA説明ページを参照しつつ、以下のコードを作成しました: Sub Sorting01() Dim ra As Long, rc As Long Application.ScreenUpdating = False For ra = 3 To Range(A70698).End(xlUp).Row If Cells(ra, 1) <>"" Then For rc = 3 To Range(C248964).End(xlUp).Row If Cells(rc, 3) <>"" And Cells(ra, 1).Value = Cells(rc, 3).Value And Cells(ra, 2) = Cells(rc, 4) Then Cells(ra, 7).Value = Cells(rc, 5).Value Exit For End If Next rc End If Next ra MsgBox Done End Sub データの一部(100行分)を別のシートに貼り付けて動くかどうか試したところ、問題ありませんでしたが、元のデータに適用したところ、とてつもなく時間がかかっております。上述のコードが非常に非効率的なものではないかと考えております。初心者で誠に恥ずかしい限りですが、きわめて急いでいることもありご連絡差し上げました。時間短縮のため、効率的なコード、または他の方法(関数)がありましたら、教え願いたく存じます。重ねながら、どうぞ宜しくお願いいたします。 追伸:A列・C列の/は取り除き数字の状態に変えてあります(例えば、1977/01 =>197701)。一点、申し上げておきたいことは、B列に出てくるコードがD列に必ずしもあるわけではありません。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- iriyak
- ベストアンサー率48% (40/82)
お身体をお大事に! Awk の件ですが、Windows プラットフォームでは gawk.exe (Awk 拡張) を使用可能です。Windows で使用する際、コマンドプロンプト (cmd.exe) 上で操作するのに若干の慣れが必要ですが、余りあるメリットを享受できると思います。ぜひトライください。 (gawk.exe に関する情報満載のサイト) http://www.kt.rim.or.jp/~kbk/gawk-3.1/ (iriyak Awk 関連回答QNo) QNo.4160141 テキスト編集 http://okwave.jp/qa4160141.html QNo.431310 awkという言語について http://okwave.jp/qa431310.html QNo.3865890 shell(awk)でファイル内の同一キーをグループ化 http://okwave.jp/qa3865890.html QNo.4138535 複数のテキストから同じ行数の文字列を抽出し,別のテキストに出力する方法 http://okwave.jp/qa4138535.html QNo.4130570 awk と gawk の書き方の違い http://okwave.jp/qa4130570.html QNo.4073795 awkの処理速度を改善したい http://okwave.jp/qa4073795.html QNo.4067666 awk in csh http://okwave.jp/qa4067666.html QNo.4064522 awkを使って文字列処理の問題 http://okwave.jp/qa4064522.html QNo.4040998 バッチ処理でテキストから数値を取り出し、CSVにしたい http://okwave.jp/qa4040998.html
- iriyak
- ベストアンサー率48% (40/82)
こんにちは。 目的達成のために Excel VBA を使用する、という条件を緩くすることは可能でしょうか。例えば、テキスト処理言語 Awk を適用するなど。 (回答者のコメント) 回答者も同様の実務にトライしたいことがあり、結論として Awk に切り替えました。計算の核となるところは。
お礼
iriyak様、ご連絡が遅くなり大変申し訳ありません。体調不良により倒れておりました。無礼をお許しいただければ幸いです。併せて、Awkの存在をお知らせ頂き、誠にありがとうございます。勉強を始めようと思います。 現状ですが、結局、6日間PCを動かし続けて、データの整理を終えました。(私見ですが)非効率的なコードながら、どうにか正しい整理が出来たようです。 今後とも、どうぞ宜しくお願い致します。取り急ぎ、ご連絡まで。
- tomo316
- ベストアンサー率35% (51/142)
248964件からの抽出はエクセルではきついと思います。 以下の構成に変更をお勧めします。 エクセル 現在のシート ↓(アクセスでインポートORテーブルのリンク) アクセス 抽出(クエリー) ↓(アクセスでエクスポート) エクセル 表示
お礼
tomo316様、 ご回答頂き、感謝しております。ありがとうございます。併せて、ご連絡が遅くなり誠に申し訳ありません。ご寛恕頂ければ幸いです。 データの量に応じて抽出処理のスピードがかなり落ちるのですね。エクセル初心者のため全く想定しておりませんでした。お恥ずかしい限りです。アクセスでの対応をお教えいただき、ありがとうございます。また一から勉強しないと、ですね。 今後ともどうぞ宜しくお願い致します。取り急ぎ、ご連絡まで。
- higekuman
- ベストアンサー率19% (195/979)
値が一致するかどうかを調べるときにもForループを使っていますが、Findメソッドを使ってみてはいかがでしょうか? このコードを書けるくらいなので、このヒントだけでも大丈夫だと思っています。
お礼
higekuman様、迅速なご回答ありがとうございます。小生、理解度の低い初心者ですが、今後ともどうぞ宜しくお願いいたします。ところで、Findメソッドについては自分なりに調べてみますが、かなり切羽詰まっております。手前勝手な考えですが、見本コードがあれば、それを基に理解が速くなるかなと期待しています。重ねながら、ご回答ありがとうございました。
お礼
iriyak様、ご親切な対応に心より感謝いたします。ありがとうございました。 今後とも、問題のある時にはこちらのコミュニティーにお世話になる所存です。その折にも、どうぞ宜しくお願い致します。 重ねながら、ありがとうございました。