excelマクロはここ半年位やっています。
あるマクロ(VBA)を作ったのですが、表が大き過ぎて思うような処理スピードが出ません。ハードは富士通FMV6750CL7Sで750MのCPU速度です。OSはWINDOWS2000を使っています。環境的には問題が無いと思っています。
何か良い知恵がある方いらっしゃれば宜しくお願い致します。
(内容)
sheet1・sheet2・sheet3にそれぞれ、3000行の表があります。
三つの表には、受注番号と言う名前の識別項目が、それぞれ1列だけ用意されています。表は受注番号順にソートしています。
マクロはsheet1のある行の受注番号を見て、それと同じ受注番号をsheet2から検索して、該当する行を求めます。次にsheet2の受注番号からsheet3の受注番号を検索して、該当する行を求めます。
(実際にはもうちょっと複雑ですが・・・)
遅い部分を調べて見ますと、3000行の表から該当する行を検索する部分に時間が掛かっている所までは分かっています。
先頭行から順じ見に行って該当する行が見つかったら検索終了するようにはしています。
また、データの存在しない行を見に言ってはいないようです。
(検索部分はこんな感じです)
For Each objA In Worksheets(Sheet2).[A:A]
If objA.Text Like 受注番号 Then
intStr = objA.Row
End If
If objA.Text > 受注番号 OR objA.Text = ""Then
Exit For
End If
Next
Accessなどのデータベースを使えと言われそうですが、excel内で処理すると言う絶対条件がありますので、苦慮しております。
このようなご経験のある方宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
受注番号順にソートしてあるのなら、「二分探索方」が使えます。
私も以前数千件からの検索のマクロを組んで処理があまりにも遅かったため、
いろいろ試してみて結局これが一番高速だったことがあります。
方法ですが、最初に検査値と全データの真ん中の値をくらべ、検査値が大きいときは、次に上半分の真ん中と比較し、検索値が小さいときは下半分の真ん中と比較します。これを繰り返していき、検索範囲を縮めていくと、3000件程度のデータなら10回程の比較でみつけることができます。
プログラム上追加で用意する変数は次の3つになります。
・比較対照の最小値を入れる変数、初期値は先頭行
・比較対照の最大値を入れる変数、初期値は最下行
・検索位置を格納する変数、初期値は真ん中の行
もし検索データが存在しないときの判断は、最小値変数が最大値変数より大きくなった場合で判断します。
説明が下手で分りにくいかもしれませんが、有名で一般的な検索方なので、どこかに説明のサイトがある気がします。
もしどうしても分らないようであれば、サンプルソースを作りますのでおっしゃってください。
No.3
- 回答日時:
初めまして。
私ならば、Findメソッドを利用すると思います。ヘルプで確認して使用されてみてはいかがでしょうか。
No.1
- 回答日時:
この受注番号がどういう形式かわからないのですが、単なる数字の羅列(ハイフンとか
アルファベットが入っていない)とします。
そうしたら、15行なり20行なりずつ飛ばして検索したらいかがでしょうか?
で、検索をした受注番号が欲しい番号を超えていなければ次を検索、超えていたら
その番号までの15行あるいは20行を再検索するのです。そうしたら、
いままでのプログラムで検索する場合最大3000回のループを通していたところを、
最大でも34回のループですむと思うのですが。いかがでしょうか。
あとはマクロを動かしている途中、画面更新をさせないと多少速くなりますね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Visual Basic(VBA) ユーザーフォームの表示を追加したい 2 2023/03/26 23:18
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/20 16:59
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「直需」の意味を教えてください
-
作番ってどういう意味でしょうか?
-
「失注」の意味を教えてくださ...
-
受注受付期間とはなんですか?...
-
製造業向け受注生産型生産管理...
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Oracle 2つのDate型の値の差を...
-
Accessのフィールド数が255しか...
-
Accessでテーブル名やクエリ名...
-
Access テキスト型に対する指定...
-
【Access】フォームで自動計算...
-
ACCESSのクエリで集計で、先頭...
-
Excel→Accessへ貼り付けがおかしい
-
Accessでテーブルの値をテキス...
-
変数が選択リストにありません
-
Accessクエリーで両方のテーブ...
-
access テーブル内のレコード...
-
FROM の中で CASE を使えるでし...
-
Vbaでアクセスからエクセルにリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「直需」の意味を教えてください
-
作番ってどういう意味でしょうか?
-
「失注」の意味を教えてくださ...
-
アクセスで営業日を計算させる...
-
受注受付期間とはなんですか?...
-
Access:サブフォームのレコー...
-
マクロ転記で指定した列の最終...
-
ACCESSで、DMax関数の条件の書き方
-
access 1対1と1対多のテーブ...
-
フォームにレコード数を表示したい
-
VBA でvlookup エラーなどは削...
-
アクセスのクエリで、前回に入...
-
データシート形式のサブフォー...
-
ACCESS 受注数の集計について
-
Accessの受注発注について
-
ACCESS 選択した値を別...
-
excelマクロの処理を早くしたい...
-
ACCESSの同時にデータ入力★初心...
-
Excelにて複数の受注残を計算す...
-
ACCESS2000の帳票フォーム詳細...
おすすめ情報