• ベストアンサー

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