- ベストアンサー
シリアル番号検索を早くする方法
- シリアル番号を手入力すると間違えるため、ORACLEからシリアル番号と工事名称をexcelへインポートし、作業工程のデータを作成します。
- 登録されているシリアル番号の数が多いため、先頭の文字列を抽出してシリアル番号を絞り込み、プルダウンメニューで対象のシリアル番号を特定します。
- プルダウンメニューから文字を選択する度にマクロが動作して時間がかかるため、マクロの手動実行や手入力による検索ができるようにしたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
修正してみました。 多分、AdvancedFilterかSortの所で時間がかかっていると思うので、速度的にはあまり変わっていないかも知れませんが。 気になった点としては ・毎回selectするのは無駄です。時間がかかるだけでなく、エラーの遠因にもなります。 今回は違うでしょうが、セルへの書き込みも結構時間がかかります。 ・セル範囲の指定は、できれば1回だけにしたいです。作る時も修正する時も大変ですし、エラーの原因になります。 ・画面更新だけではなく、イベントや自動計算も停止しておくと、早くなる事があります。 ・どこで時間がかかっているかを調べれば、どこに注力して修正すればいいのか分かります。一度Timerを使って調べてみては? 以上です。 後、4文字全てではなく、一部分だけ指定して抽出できるようにしました。 (例えば、1文字目に1、4文字目にAを設定すると、111A、12BA、1C4A等が全てヒットする) >後から2桁目の文字だけ変更して別のシリアル番号検索という場合もある イベントで実行するのではなく、抽出条件の設定が終わったらボタンを押してマクロを走らせる、という方法もありますね。 或いは、4文字全てが入力されていなければマクロが走らないようにする、という方法もあります。 Sub chushutsu() Dim i As Integer Dim myStr As String Dim wsMENU As Worksheet Dim wsSERIAL As Worksheet Dim wsKOJI As Worksheet Dim rangeInput As range 'MENUシートに入力するセル範囲 Dim rangeCriteria As range 'SERIALシートにてフィルタ条件を設定するセル範囲。 Dim rangeFilter As range 'SERIALシートにてフィルタをかけるセル範囲。 Dim rangeSort As range 'KOJIシートにて抽出した文字列を出力し、ソートするセル範囲。 '作業対象セル範囲を設定 Set wsMENU = ActiveWorkbook.Worksheets("MENU") Set wsSERIAL = ActiveWorkbook.Worksheets("SERIAL") Set wsKOJI = ActiveWorkbook.Worksheets("KOJI") Set rangeInput = wsMENU.Cells(13, 1).Resize(1, 4) Set rangeCriteria = wsSERIAL.range("G1").Resize(2, 1) Set rangeFilter = wsSERIAL.range("A1", wsSERIAL.Cells(wsSERIAL.Rows.Count, 2).End(xlUp)) Set rangeSort = wsKOJI.range("A:B") 'コンストラクタ Application.EnableEvents = False Application.ScreenUpdating = False Application.Calculation = xlCalculationManual 'フィルター用文字列を設定 For i = 1 To rangeInput.Count If IsEmpty(rangeInput(i)) Then myStr = myStr & "?" Else myStr = myStr & rangeInput(i).Value End If Next i rangeCriteria(1).Value = "SERIAL" rangeCriteria(2).Value = myStr '抽出先を先にクリア rangeSort.Clear 'Autofilterで抽出したデータをKOJIに張り付け。 rangeFilter.AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=rangeCriteria, _ CopyToRange:=rangeSort(1), _ Unique:=True 'KOJIをソート With wsKOJI.Sort .SortFields.Clear .SortFields.Add Key:=rangeSort(1), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal .SetRange rangeSort .Header = xlYes 'タイトルあり .MatchCase = False '大文字と小文字を区別しない .Orientation = xlSortColumns '列方向で並べ替える .Apply End With 'デストラクタ Application.EnableEvents = True Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub
その他の回答 (1)
- HohoPapa
- ベストアンサー率65% (455/693)
>A13セル:シリアル番号1桁目を表示。入力規則 =SERIAL!$H:$H >B13セル:シリアル番号2桁目を表示。入力規則 =SERIAL!$iI$I >C13セル:シリアル番号3桁目を表示。入力規則 =SERIAL!$J:$J >D13セル:シリアル番号4桁目を表示。入力規則 =SERIAL!$K:$K これら4つのセルの何れかが書き換わると chushutsu が起動する という動作になっているものと理解しました。 例えば、 課題ブックが開いたとき、あるいはMENUシートが選択された時に マクロが、A13,B13,C13,D13を空欄にする (この動作ではchushutsu が起動しないように制御します。) その後 A13,B13,C13,D13の何れかが書き換わり、 かつ、 A13,B13,C13,D13の何れもNull(空欄)ではないときに chushutsu が起動する。というコードにすれば、 期待の動作になるものと思いますがいかがでしょうか?
お礼
回答ありがとうございます。 考え方、参考になりました。 しかしながら、最初A13,B13,C13,D13が空欄はよいのですが、次にそのまま継続する時は、A13,B13,C13,D13は空欄になっていません。 この状態でC13を変更し、B13を変更とすると、時間がかかってしまいます。
お礼
回答ありがとうございます。 とても参考になりました。 やはり、4文字それぞれで検索するのは時間かかってしまいます。 イベントで実行するのではなく、抽出条件の設定が終わったらボタンを押してマクロを走らせる、という方法もありますね。 或いは、4文字全てが入力されていなければマクロが走らないようにする。 を参考にさせていただき、E10セルに工事番号を手入力で対応する構成としました。 工事番号を検索するのに、後方4桁の数字部分が2000くらいある場合、プルダウンで下まで探すのが面倒だとの意見があり、工事番号は手入力で好きな桁数だけ入れてE10セル値変更で実行する様にしました。 For i = 1 To rangeInput.Count If IsEmpty(rangeInput(i)) Then myStr = myStr & "?" Else myStr = myStr & rangeInput(i).Value End If Next i の部分を myStr = Range("E10") です。 好きな桁数の文字列で検索できるので、次の工事番号検索も簡単に早く出来るさまになりました。