プロが教える店舗&オフィスのセキュリティ対策術

ExcelVBAをもちいて、在庫の確認をしたいのですが、できるのでしょうか。

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

よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

非常に丁寧な解答ありがとうございました。
これを見た瞬間、正直いって驚かされました。

ARCさんの回答を利用させていただきます。
あっという間に解決できそうです。

ほんとうにありがとうございます。

お礼日時:2001/02/07 16:20

可能か不可能かってことでしたら、可能です。



部分一致を判定するためには、 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に、その商品の価格を出力)
    • good
    • 0

VBAがお解りになるなら、そんなに難しくはありません。

定期的に行う必要があるようでしたら、VBAでプログラム化したほうがべんりですよね。

私は、同じようなことをVBAでやっています。
在庫表と注文表は別のブックにして、同時に両ブックを開き、照合もしています。
VBAなら、コマンドボタンにプログラムを貼り付けてやれば簡単です。
    • good
    • 0

マクロを使わなくても、関数だけで可能みたいですね。



・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文字で検索とか含まれるものとか
ということです。

というのも商品コードがあるとなんとかなるのですが、
注文と在庫の一覧には商品コードがないんです。
(ちなみに当方、古書店です。書籍コードがない場合、
お客様が知らない場合があります。)

おそらく答えるのに、えらい長い行数がいると
思いますので、できる可能性があるかどうか教えて
いただければ、いいです。
できそうなら、自分でがんばってみたいです。

お手数かけまして申し訳ないです。

補足日時:2001/02/03 20:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!