• ベストアンサー

Excel のマクロでの在庫検索

ExcelVBAをもちいて、在庫の確認をしたいのですが、できるのでしょうか。 具体的には、在庫一覧のシートと注文一覧のシートをつくり、その二つのシートから一致した商品をさらに別のシートに取り出すという作業がしたいです。 一個の注文が着たときは、なんとか対応できるのですが、まとまった注文が来たときのいい対応方法を探しています。 よろしくお願いします。

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

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.4

Public Enum SearchPatternEnum  完全一致 = 0  先頭一致 = 1  後方一致 = 2  部分一致 = 3 End Enum Public Function SearchData(検索値 As Variant, 検索範囲 As Range, Optional 列番号 As Long = 1, Optional 検索方法 As SearchPatternEnum, Optional 出力セル範囲 As Range = Nothing) As Variant  Dim RNG As Range  Dim SearchRng As Range  Dim SrchStr As String  Dim MaxRow As Long  Dim OutputRNG As Range  Dim MaxOutputPos As Long  Dim OutputPos As Long  If TypeOf 検索値 Is Range Then   SrchStr = 検索値.Value  Else   SrchStr = CStr(検索値)  End If  Select Case 検索方法   Case SearchPatternEnum.完全一致    '処理を行わない   Case SearchPatternEnum.先頭一致    SrchStr = SrchStr & "*"   Case SearchPatternEnum.後方一致    SrchStr = "*" & SrchStr   Case SearchPatternEnum.部分一致    SrchStr = "*" & SrchStr & "*"  End Select  If 出力セル範囲 Is Nothing Then   SearchData = CVErr(1)  Else   出力セル範囲.Clear   MaxOutputPos = 出力セル範囲.Cells.Count   OutputPos = 1  End If  For Each RNG In 検索範囲.Cells   If RNG.Value Like SrchStr Then    If MaxOutputPos = 0 Then     SearchData = Cells(RNG.Row, RNG.Column + (列番号 - 1))     Exit For    Else     出力セル範囲.Cells(OutputPos) = Cells(RNG.Row, RNG.Column + (列番号 - 1))     OutputPos = OutputPos + 1     If OutputPos > MaxOutputPos Then      Exit For     End If    End If   End If   If RNG.Row > RNG.Worksheet.UsedRange.Rows.Count Then    Exit For   End If  Next RNG End Function

Imprezza
質問者

お礼

非常に丁寧な解答ありがとうございました。 これを見た瞬間、正直いって驚かされました。 ARCさんの回答を利用させていただきます。 あっという間に解決できそうです。 ほんとうにありがとうございます。

その他の回答 (3)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.3

可能か不可能かってことでしたら、可能です。 部分一致を判定するためには、 Like 演算子を使います。 今回のご質問にはちょっと興味を惹かれましたので、暇つぶしに作ってみました。 参考にするなり、適当に改造するなりしてみてください。 解説が必要でしたら、補足をお願いします。 使い方 SearchDate(検索値, 検索範囲, 列番号, 検索方法, 出力セル範囲) 検索値: 略 検索範囲: 略 列番号: どの列を返すか。 1を指定すると、検索されたセルの内容を返す 2なら検索されたセルの右隣のセル内容、3なら更にその右隣のセル… 検索方法: 以下の値を数値で指定(完全一致=0, 先頭一致=1, 後方一致=2, 部分一致=3) 出力セル範囲: 検索した結果を書き出すセルの範囲 例: F1:F10 使用例:(A列に商品名,B列に価格が入力されている場合) ・適当なセルに =SearchData("あ",A:B,2,3) と記述(最初に検索された"あ"を含む商品の価格を表示する。) ・モジュールに call SearchData("あ",Range("A:B"),1,部分一致 ,Range("F1:F100")) call SearchData("あ",Range("A:B"),2,部分一致 ,Range("G1:G100")) と記述(F1:F100の範囲に、"あ"を含む商品の一覧を出力,G1:G100に、その商品の価格を出力)

  • taneyan
  • ベストアンサー率33% (73/215)
回答No.2

VBAがお解りになるなら、そんなに難しくはありません。定期的に行う必要があるようでしたら、VBAでプログラム化したほうがべんりですよね。 私は、同じようなことをVBAでやっています。 在庫表と注文表は別のブックにして、同時に両ブックを開き、照合もしています。 VBAなら、コマンドボタンにプログラムを貼り付けてやれば簡単です。

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

マクロを使わなくても、関数だけで可能みたいですね。 ・Sheet2のA列に商品コード、B列に商品名、C列に在庫が入力されているものとします。 ・Sheet1のA列に商品コードを入れると、B列、C列に該当する商品の名称、在庫を表示するものとします。 1:Sheet1のB2のセルに =VLOOKUP($A$2,Sheet2!$A:$C,2) と入力 2:Sheet1のC2のセルに =VLOOKUP($A$2,Sheet2!$A:$C,3) と入力 3:B2,C2のセルを下のほうまでコピー 以上の操作でOKな筈です。 不明点とかありましたら、補足してください。

Imprezza
質問者

補足

これで、商品名の部分検索とかはできるのでしょうか? 商品名のはじめの5文字で検索とか含まれるものとか ということです。 というのも商品コードがあるとなんとかなるのですが、 注文と在庫の一覧には商品コードがないんです。 (ちなみに当方、古書店です。書籍コードがない場合、 お客様が知らない場合があります。) おそらく答えるのに、えらい長い行数がいると 思いますので、できる可能性があるかどうか教えて いただければ、いいです。 できそうなら、自分でがんばってみたいです。 お手数かけまして申し訳ないです。

関連するQ&A

  • エクセルでの在庫管理について教えて下さい!

    エクセルを使って在庫管理しているのですが、一番最新の在庫量(箱数、端数、総数)を示す、 最終行の内容だけを、別のsheetに作成した一覧リストで参照することって可能なのでしょうか。 もし、分かる方がおられたら、ご教授お願い致します。

  • Excelでの在庫管理

    鋼材を扱う倉庫で、鋼材の入出荷の在庫帳をExcelで管理しています。 ひとつのファイルにサイズごとのシートを作り在庫数の管理をしています。(ファイルは一月毎にしています) シート枚数が多いため目的のシートの選択や翌月への繰越作業などが大変です。(似たサイズがある為間違えることも多いです) シート選択を間違えずに簡単に出来る方法があればどなたか教えてください。 また、出来れば一枚のシートにて全てのサイズを管理したいのですが その方法もあれば教えてください 各サイズごとに在庫数等の合計と入出荷をリスト状にして検索・入力が出来るようなものを作りたいと考えています。 よろしくお願いします

  • excelで在庫管理

    仕事で在庫管理表を作ることになってしまいました・・・。 シート1 商品コード、アイテム名、昨日在庫数 を羅列したリストを貼り付けてシート2の在庫管理表に反映させてその日の在庫数をチェックします。 シート2 商品コード、型番、アイテム名、在庫数 を表示しています。 毎日上書きして在庫管理するリストなので、シート1の変動もあり、なかなか使えるものができません。 簡単にシート1の在庫をシート2に反映させられる関数はありませんか? excel初心者で何もわからないので教えて下さいm(_ _)m

  • エクセル あいまい検索 

    sheet1   sheet2 A列    A列 400          '400-a 13394      '13394-d 1286       '1286-a ○sheet2の列の中から”400”を含むものを検索したいです。 vlookupでsheet2のB1= vlookup("*"&sheet1!a1&"*",a1:a10,1,0) とあいまい検索できるか試してみたのですが上手くいきません。 期中で在庫システムを変更して変更後のデータがsheet2なのですがなぜかアポストロフィのようなものと-がついてしまい、なんとか新旧の在庫の製品コードが一致していることを確認したいのです。 よろしくお願い致します。

  • 在庫表の管理をエクセルで行うに当たって、教えてください。

    エクセルのシート2に在庫表があります。 在庫表には、仕入日、仕入先、整理番号、メーカー、商品分類、モデル名、車体番号、仕入金額、が 右並びに書いてあります。 整理番号は、データを入れる時に、4桁の数値で各車に、つけます。(整理番号で管理している) メーカー数は、10件のメーカー数があります。 商品分類はA-1,A-2,B-1,B-2,C-1.,C-2,C-3の7項目があります。 シート1を新規に仕入れた商品のデータインプット用とし、これに、インプットすると、 シート2の在庫表が、メーカー別、商品分類別になっているため、(別の言い方:メーカー:10×分類:7で70の在庫グループがある) その(在庫グループ)の最終行に、自動的に転記されるようにしたいのです。(別の言い方:整理番号が昇順) 同様に、売上た商品も、シート1で、売上日、売上先、整理番号、メーカー、商品分類、モデル名、車体番号、売上金額、をインプットすると、自動的に在庫表から削除されて、その行が詰まるようにしたいのです。 よろしくお願いします。

  • エクセル、VBA、抽出複数検索について

    エクセル、VBA、VLOOKUP、MATCH関数等について出来る方法があれば教えてください。 インチごとに分けてあるシートがあり、(在庫表です) これを参照して、別ブックへVLOOKUP等を使って、サンプルデータのシート4のように表示させたいのですが、 何か方法を使って出来ることは可能でしょうか? 問題点が複数あります 1、VLOOKUPの範囲について、B列が結合されていて、C列は複数行あるため、商品名が入ってきません。 C列については、何千件とデータがあるため、結合することは不可能です。 一致している条件としては商品コードが必ずあり、商品名には「/」が入っております。 =CONCATENATEとVLOOKUPは一緒に使うことは可能ですか? もしくはINDEX関数やIF、SUMPRODUCT等を使うのでしょうか? シート4のような形に出来る方法があれば、教えてほしいです。 VBAは詳しくはないのですが、VBAで出来るのであれば、教えてほしいです。 在庫表はとても作り方が悪いのですが、これを作り直すと言うことは、不可能です。 グループ会社で使っているため、なんとかこの在庫表を使いたいです。 VBAでA列をA5からA100にコードのみ入れた場合、B列に商品名が入るようにVBAで作ることは可能でしょうか? もしくは、検索条件を2つ使って、一つは商品コード完全一致+あいまい検索で【/】で商品名を入れることは可能でしょうか? 関数は調べたのですが、関数では難しいのかなと思います。 宜しくお願い致します。

  • エクセルのマクロについて教えて下さい。

    添付した画像の様な注文管理シートがあります。 バーコードリーダーを使ってバーコードのJANを読み取り、該当する商品を検索したいです。 商品コードは 自社コード/JAN の形式になっています。 入荷した商品のバーコードを読み取ると、該当する商品のD列に読み取った日付を自動的に入力したいです。 その際に、既に入荷している商品はスキップして、未入荷の商品を検索する方法を教えて下さい。 例えば、 JAN 49000001 のバーコードを読み取った場合、D10に本日の日付を入力したいです。 また、バーコードを読むと、該当するセルにカーソルが移動する方法も合わせて教えて頂きたいです。 こちらも既に入荷している商品はスキップして、未入荷の商品を検索したいです。 例えば、 JAN 49000002 のバーコードを読み取った場合、A12にカーソルが移動する様にしたいです。 関数やマクロ等を使用して、これらを行う方法を教えて頂きたいです。 よろしくお願いします。 動作環境 windows 7 PRO エクセル2010 バーコードリーダー BC-BR900L 補足 出力用のデータの入力先はセルにしたいと思います。 特にセルでなくてはならない理由は今の所ありませんが、空いた列を使用したいです。 この例だとE列でお願いします。 カーソルの移動の理由ですが、作業の工程が違うので、カーソル移動が必要です。 日付を入れる方は、商品の荷受け作業の際に使用します。 バーコードを読んで、どの注文分の商品が該当するかを付け合わせる際に使用したいです。 カーソルの移動は、発送作業の際に使用します。 バーコードを読んで、どの発送分かを確認する際に使用したいです。 実際のシートには、顧客情報や注文番号などのセルが存在しています。 それらの情報を確認する際に使用したいです。 わかりにくい説明で申し訳ありませんが、どうかよろしくお願いします。

  • ネット注文 在庫切れで発送はしばらくかかるらしいです。どのくらいかかるのでしょうか?

    本来なら7~10日ぐらいかかるそうなんですが、今日(注文してから5日目)に別の用事でコールセンターに問い合わせたときに聞いたのですが、注文してる商品は在庫切れで、もうすこし発送が遅くなるかもしれないといわれました。 商品は、通信の教材なんですが、人気なのかどうかはわかりませんが、在庫切れでした。 コールセンターの人も具体的な日はわからないといってましたが、だいたい常識的にどのくらいかかるものなんでしょうか? (場合によっては1ヶ月以上かかるとかっていうこともあるのでしょうか?) そもそも注文するときには在庫切れとか出てたわけではないのになぜこんなことがおきるのかも不思議ですが・・・ (在庫切れなら在庫切れと書いておいてほしかったです。)

  • エクセルマクロで一致データを検索

    エクセルのマクロを使用して以下のことを行いたいです。 (※VBA初心者なので解説を書いていただけるとありがたいです。) ・商品マスタのCSVを読み込む。  30万件以上あるので、エクセルでは表示できません。 ・読み込んだ商品マスタに記載されている商品コードを、  商品データ一覧のエクセルファイルに自動で転記したい。    商品データ一覧のエクセルファイルには、「商品番号」「色」「サイズ」があります。  この3条件が商品マスタのものと一致する商品マスタのコードを転記したいです。 量が膨大なうえ、急ぎの作業なため、何卒よろしくお願いいたします。

  • 【Excel】在庫管理 VBA 関数

    在庫・販売管理用のファイルをExcelにて作成しています。 仕様 ・仕入管理/在庫管理/販売管理の3シート ・商品データは在庫管理シートに記録 ・商品にはそれぞれ商品番号をつけ管理 まだ運用前なのですが、以下のような運用方法を考えています。 それにあたって、自動化したい作業があるのですが、なかなかできず…。 VBAの知識をお持ちの方,お力をかして頂けないでしょうか? もしくは関数で同じような動作が実行可能なら、そちらでも構いません。 <仕入れがあった場合> (1)在庫管理シートに商品を登録(以前に取り扱ったことのある商品の場合は省略) (2)仕入管理シートに商品の仕入数を記録(VLOOKUP関数で在庫管理シートから商品名等を呼び出します) (3)在庫管理シートに(2)で入力した仕入数反映(在庫管理シートにプラス) ← ここを自動化したいです <販売した場合> (1)販売管理シートに販売した商品、価格、個数、販売相手などを記録(同じく在庫管理シートから商品詳細を呼び出します) (2)在庫管理シートに(1)で入力した販売数を反映(在庫管理シートからマイナス) ← ここを自動化したいです この自動化ができれば在庫管理シートがリアルタイムの在庫を表示するようになるので、とても便利なのですが、今現在の状態だと、この「自動化したい部分」を手作業にてやる予定です。 現在は商品の出入がとても少ないので、手作業でも問題ないのですが、今後商品が増えることを考えると実用的ではなく…。 できれば、「入力してすぐ反映」というシステムより、「入力後確認→確定→反映」というシステムにしたいのですが…。(ワガママで申し訳ないです) 私は関数はある程度扱えますが、VBAについては初心者の状態から今勉強中といったところです。 是非皆様のお力を貸して下さい!よろしくお願い致します。

専門家に質問してみよう