シリアル番号検索を早くする方法

このQ&Aのポイント
  • シリアル番号を手入力すると間違えるため、ORACLEからシリアル番号と工事名称をexcelへインポートし、作業工程のデータを作成します。
  • 登録されているシリアル番号の数が多いため、先頭の文字列を抽出してシリアル番号を絞り込み、プルダウンメニューで対象のシリアル番号を特定します。
  • プルダウンメニューから文字を選択する度にマクロが動作して時間がかかるため、マクロの手動実行や手入力による検索ができるようにしたいです。
回答を見る
  • ベストアンサー

シリアル番号検索を早くする方法

office2016 (1)ORACLEからシリアル番号とその工事名称をexcelへインポート (2)シリアル番号に対する工事名称を確認して、作業工程のデータを作成 (3)作成した作業工程のデータをORACLEへ登録 というデータ作成をしています。 もともとは、(1)、(2)は無しで対応していたのですが、シリアル番号を手入力すると間違えるので、(1)、(2)の内容を追加しました。 登録されているシリアルの数が多い(4万件ほど)ので、先頭1桁目の文字列、先頭2桁目の文字列抽出、先頭3桁目の文字列抽出、先頭4桁目の文字列抽出をし、 あとは、先頭4桁で絞ったシリアル番号の集まりにして、その中からプルダウンメニューで対象のシリアル番号を特定させるという構成にしています。 シリアル番号の桁数は8桁。先頭4桁は英数文字、後半4桁はほぼ数字。若干英文字混じる。 MENUシート 工事番号の絞り込みとその工事番号の名称表示を実施 A13セル:シリアル番号1桁目を表示。入力規則 =SERIAL!$H:$H B13セル:シリアル番号2桁目を表示。入力規則 =SERIAL!$iI$I C13セル:シリアル番号3桁目を表示。入力規則 =SERIAL!$J:$J D13セル:シリアル番号4桁目を表示。入力規則 =SERIAL!$K:$K E13セル:8桁のシリアル番号表示。入力規則 =KOJI!$A:$A SERIALシート ORACLからインポートしたデータ表示 A列:シリアル番号 B列:工事名称 C列:シリアル番号の1桁目表示 D列:シリアル番号の2桁目表示 E列:シリアル番号の3桁目表示 F列:シリアル番号の4桁目表示 G2セル:MENUシートで先頭4桁の番号表示 =MENU!A13&MENU!B13&MENU!C13&MENU!D13 H列:インポートしたシリアル番号の先頭1桁目に使用されている文字列表示 I列:インポートしたシリアル番号の先頭2桁目に使用されている文字列表示 J列:インポートしたシリアル番号の先頭3桁目に使用されている文字列表示 K列:インポートしたシリアル番号の先頭4桁目に使用されている文字列表示 KOJIシート 先頭4桁で絞り込んだシリアル番号の集まりを表示する マクロ MENUシート Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column = 1 Or Target.Column = 2 Or Target.Column = 3 Or Target.Column = 4) And Target.Row = 13 Then chushutsu Else End If 標準モジュール Sub chushutsu() Application.ScreenUpdating = False Sheets("KOJI").Select Columns("A:B").Select Selection.ClearContents Sheets("SERIAL").Select Range("G1") = "SERIAL" Range("G2") = "=MENU!R[11]C[-6]&MENU!R[11]C[-5]&MENU!R[11]C[-4]&MENU!R[11]C[-3]" ' Columns("A:B").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ Range("G1:G2"), Unique:=False ' Cells.Select Selection.SpecialCells(xlCellTypeVisible).Select Selection.Copy Sheets("KOJI").Select Range("A1").Select ActiveSheet.Paste ActiveWorkbook.Worksheets("KOJI").Sort.SortFields.Clear ActiveWorkbook.Worksheets("KOJI").Sort.SortFields.Add Key:=Range("A:A"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("KOJI").Sort .SetRange Range("A:B") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Sheets("SERIAL").Select ActiveSheet.ShowAllData Sheets("MENU").Select Application.ScreenUpdating = True End Sub 問題なのは、MENUシートのA13,B13,C13,D13セルでプルダウンメニューから文字を選択する度にマクロが動作するのに、若干時間がかかること。 シリアル番号を検索するのに、基本、先頭1桁目から順番に絞り込みます。 なので計算方法を手動にしておき、先頭1桁目から3桁目まではマクロ動作させず、4桁目を指定した後にマクロ実行するという手もありますが、後から2桁目の文字だけ変更して別のシリアル番号検索という場合もあるので対応できません。 CTRL+Fで工事番号を手入力して検索したらすぐに探せますが、手入力は面倒なので、先頭4桁の文字をプルダウンで特定して絞り込むという構成のままで検索時間の短縮が図れる構成としたいです。 マクロに関してはベタで教えていただきたく。

質問者が選んだベストアンサー

  • ベストアンサー
  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.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

3620313
質問者

お礼

回答ありがとうございます。 とても参考になりました。 やはり、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") です。 好きな桁数の文字列で検索できるので、次の工事番号検索も簡単に早く出来るさまになりました。

その他の回答 (1)

  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.1

>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 が起動する。というコードにすれば、 期待の動作になるものと思いますがいかがでしょうか?

3620313
質問者

お礼

回答ありがとうございます。 考え方、参考になりました。 しかしながら、最初A13,B13,C13,D13が空欄はよいのですが、次にそのまま継続する時は、A13,B13,C13,D13は空欄になっていません。 この状態でC13を変更し、B13を変更とすると、時間がかかってしまいます。

関連するQ&A

  • マクロでシリアル値を文字列にしたい。

    マクロでシリアル値を文字列にしたい。 すみません、マクロでシリアル値を文字列に変えたいと思っています。 Range("A1").Value = Format(Now,"yyyy年") とすれば現在の日付のデーターが文字列になるのですが、これを例えば、B2にシリアル値で日付が入力されていてA1文字列に置き換える方法はあるのでしょうか?出来れば記述の仕方を教えていただきたいのですが宜しくお願いします。

  • シリアル番号について

    パソコンリカバリをしてセキュリティーゼロを再インストールすると シリアル番号21ケタ入力のさい、すでに使われてると表示され インストール出来ません。 アドバイスお願いします。 ※OKWAVEより補足:「ソースネクスト株式会社の製品・サービス」についての質問です。

  • 郵便番号から住所を自動表示

    お世話になります。 Excel 2016を使用して、A列のセルに郵便番号を入力すると、B列のセルにその住所を表示するようにしたいと思います。Webから検索した次のようなVBAをSheet1のシートモジュールとして貼り付けました。 Private Sub Worksheet_Change(ByVal Target As Range) '範囲は、A2~A100 に郵便番号を入力する場合 If Intersect(Target, Range("A2:A100")) Is Nothing Then Exit Sub If Target.Count > 1 Then Exit Sub Application.ScreenUpdating = False Application.EnableEvents = False With Target.Offset(0, 1).Validation .Delete .Add Type:=xlValidateInputOnly .IMEMode = xlIMEModeHiragana End With If Target Like "###-####" Then Target.Offset(0, 1).Select SendKeys Target.Value SendKeys "{ }" SendKeys "{ENTER}{ENTER}" SendKeys "{Left}" End If Application.EnableEvents = True Application.ScreenUpdating = True End Sub この結果自分の住所の郵便番号の場合はうまく表示されました。そのほかの番号の場合は、 瞬間的に何か表示されたような気はしますが、結果的には列に入力した番号が表示されます。 またうまく表示されないB列の郵便番号を変換キーで住所に変換する作業を3~4回繰り返した後にこの番号をA列に入力するとB列にこの住所が表示されます。「学習した番号については、うまくいく」ような感じです。 何か解決する方法はないでしょうか。 よろしく願いします。

  • エクセルの郵便番号検索

    こんにちは。 いろいろ探したのですが皆様のお知恵をお借りしたく お願いいたします。 エクセルのA列に郵便番号ハイフン(-)付で7ケタの番号があるとします。 そこで同一の5ケタが何件あるかB列に5ケタの番号とC列に件数を出したい場合は どうすればよろしいでしょうか? よろしくお願いいたします。

  • 切り替わったシリアルナンバーを入れる画面に移動できる方法を教えてください

    ソースネクストの16桁のシリアルナンバーが新しいもの(最初の五文字がアルファベットの21桁)に切り替わったのですが、パソコンの再インストール後その際、そのナンバーを入れるための画面に移動できません。16桁の番号を入れる画面にはなるのですが、21桁の番号を入れる画面になりません。アップデートができなくて、困っています。誰か教えて下さい そのときに 「利用開始の手続きに失敗しました。 シリアル番号の有効期限が切れています」 と、画面に出ます。

  • 【VBA】 通し番号の入力について

    こんばんは。 こちらの識者の方々にはいつもお世話になっています。 VBAの件で質問があります。 B列の最終行までA列に001から文字列で連番を振りたい場合、どのような構文になりますでしょうか。 Range("A1:A" & Range("B" & Cells.Rows.Count).End(xlUp).Row).Value = Format(row, "000") は通らなかったのですが、なにかいい構文はありますでしょうか。 データは必ず1000行以下ですので、番号は3桁で大丈夫です。 よろしくお願いいたしますm(_ _)m

  • VBAでタイムシリアル値から日付のみ抜き出す方法について

    VBAでアプリケーションを作っています。 要件 1.yyyy/mm/dd/hh:mm形式のA列があり、その列をもとにB列に日の部分だけ表示したい。たとえば、9/22日の場合は22という風に数値型で表示。 2.B列の値を使ってソートするため、タイムシリアル値の表示形式をNumberFormatなどで変換するのではなく、VBAの処理でタイムシリアル値から日を求めたい。 3.A列の行数は毎月異なる。 要件3の部分は、while文でA列が空白になるまでループさせることで解決しました。(数千行あるので、もう少し効率化できたらいいのですが) 今、要件2の部分でつまづいています。 はじめはA列をコピーしてB列にペーストしたのですが、それでは当然実データがタイムシリアル値のためソートするとおかしくなりました。 なのでA列から日のみを抜き出してB列に入れる処理を作成中なのですが、 Dim cnt As Integer Dim day1 As Date Dim day2 As Integer cnt = 3 Do While ActiveCell.Value <> "" Range("A" & cnt).Select day1 = day(Selection.Value) day2 = CInt(day1) Range("B" & cnt).Value = day2 cnt = cnt + 1 Loop これで元データ(8/1 0:00~8/31 23:55まで昇順)で試すと、 8/1は普通に1が入るのですが、8/2以降は1900/1/2といった 形式のデータがB列に入ってしまいます。 初心者で申し訳ないのですが、どうしたらいいのかわからないので教えてください。 また、要件3はループだと8000回以上繰り返すことになるのですが、 もっと効率のいい方法があれば知りたいです。

  • 特定範囲の合計を求める方法

    OFFICE2010 A列に題目の文字列(文字列の長さは不定) B列に価格としての数値データ が入ったリストがあります(5000行くらい) それぞれの題目の先頭には空白行が3桁入ったものと、6桁入った題目が存在している。 題目先頭空白3桁のものは、題目先頭空白6桁のもので構成されているイメージ。 このリストで、それぞれの題目先頭空白3桁のものの金額を算出したい。 合計金額の表示はC列で、題目先頭空白3桁と同行に配置したい。 下記の様なリストがあったとして 題目      価格  A001    b001    100    c001     50   B001    d002    300    e004    500    J009    1000 下記の様に合計を表示したい 題目      価格   合計  A001          150    b001    100    c001     50   B001         1800    d002    300    e004    500    J009    1000 対応方法は、関数でもマクロでもどちらでも可です。 よろしくお願いします

  • (セルに)1文字入力される度に検索したい(エクセル

    Private Sub Worksheet_Change(ByVal Target As Range) 'A1が変化したら If Target.Row = 1 And Target.Column = 1 Then Call Samplex End If End Sub 今は、上記プログラムで、A1に変化があったとき(文字を入力してエンターを押したとき)に、A列の各行の文字列を検索し、該当した行を表示させています。 これを、エンターを押さなくても、1文字入力するたびに、自動で検索結果が表示されるようにしたいです。 例 A1に「あ」と入力 あ あい あいう という文字列のある行が表示され さらに「あい」と入力すると、 あい あいう という行が表示される。 どなたかよろしくお願いします。

  • VBAでの「番号」の検索について

    お願いします。エクセルで注文書発行とその受入処理を作成してます。 注文書の明細を作成し、個々にID番号をつけてます。1、2、3・・・・連番です。受入処理で発行日付で注文データを検索しヒットしたものを別シートに縦に表示させ、「先頭」「次」「前」「最終」ってかんじのボタンをつけてデーターがくるくる変わるようにしてあります。この中の番号「1」の注文データを受入処理(受入済とあるセルに入力)し、注文履歴のシートに同じ番号を検索して上書きさせます。ところが、番号「1」なのに「10」のところを上書きします。ほかの番号は異常ないのですが・・・ マクロは '入力したデータをコピー Range("c5:c24").Copy '[T_注文]シートを選択 Sheets("T_注文").Select '最終行番号を取得 z = Range("a1").End(xlDown).Row '[番号]を検索 Set x = Range("a2:a" & z).Find(Range("T_受入処理!c5").Value) '既存データの修正 x.PasteSpecial _ Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=True 'コピーモードを解除 Application.CutCopyMode = False MsgBox "この品目の受入処理を完了しました。", vbOKOnly, "オービットベース:受入処理完了" です。どうしたらよいかおしえてください。

専門家に質問してみよう