- ベストアンサー
Excel のマクロでの在庫検索
ExcelVBAをもちいて、在庫の確認をしたいのですが、できるのでしょうか。 具体的には、在庫一覧のシートと注文一覧のシートをつくり、その二つのシートから一致した商品をさらに別のシートに取り出すという作業がしたいです。 一個の注文が着たときは、なんとか対応できるのですが、まとまった注文が来たときのいい対応方法を探しています。 よろしくお願いします。
- みんなの回答 (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
その他の回答 (3)
- ARC
- ベストアンサー率46% (643/1383)
可能か不可能かってことでしたら、可能です。 部分一致を判定するためには、 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)
VBAがお解りになるなら、そんなに難しくはありません。定期的に行う必要があるようでしたら、VBAでプログラム化したほうがべんりですよね。 私は、同じようなことをVBAでやっています。 在庫表と注文表は別のブックにして、同時に両ブックを開き、照合もしています。 VBAなら、コマンドボタンにプログラムを貼り付けてやれば簡単です。
- ARC
- ベストアンサー率46% (643/1383)
マクロを使わなくても、関数だけで可能みたいですね。 ・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な筈です。 不明点とかありましたら、補足してください。
補足
これで、商品名の部分検索とかはできるのでしょうか? 商品名のはじめの5文字で検索とか含まれるものとか ということです。 というのも商品コードがあるとなんとかなるのですが、 注文と在庫の一覧には商品コードがないんです。 (ちなみに当方、古書店です。書籍コードがない場合、 お客様が知らない場合があります。) おそらく答えるのに、えらい長い行数がいると 思いますので、できる可能性があるかどうか教えて いただければ、いいです。 できそうなら、自分でがんばってみたいです。 お手数かけまして申し訳ないです。
お礼
非常に丁寧な解答ありがとうございました。 これを見た瞬間、正直いって驚かされました。 ARCさんの回答を利用させていただきます。 あっという間に解決できそうです。 ほんとうにありがとうございます。