• 締切済み

Excel VBAで自動見積を行いたいと考えています。ご教授下さい。

Excel VBAで自動見積を行いたいと考えています。ご教授下さい。 まだ、VBAを始めたばかりの初心者です。 下記の様な独立した2つのブックがあります。 実行したいのは 第一のブック(sheet1)のC列の品名を見て第二のブック(Sheet1)のC列の品名が一致する場合、 その行にある単価(F列)を第一のブックの単価欄(G列)にコピーしたいのです。 その作業を第一のブックの品名欄が空白になるまで繰り返し行い、合計値を算出したいと思っています。 また、見積依頼者が品名記載ミスをした場合に備え、類似品(上5桁程度で検索)も可能でしょうか? 第二のブックに該当品名が無い場合には(?)等を第一のブック価格欄に表示したいのですが・・・・ 初心者には、欲張り過ぎているため、作業スタートが出来ません。 ご教授頂きたくお願い致します。 見積部品シート(第1のブック/sheet1)     A   B     C    D     E    F   G    H I    J 1 記号  規格    品名  品番   メーカー  数量  単価   小計 2 R1  1W10Ω    AAAA  0123    あ    1 =F2*G2 3 C1  50V10μF  BBBB  4567    い    2  =F3*G3 4 D1  1S2000   CCCC  8901    う    1 =F4*G4 5 T1  10VA    DDDD  2345    え    2 =F5*G5 6 価格データベース(第2のブック/sheet1)    A       B     C    D     E     F    G I    J 1 名称      規格    品名   品番   メーカー  単価   2 抵抗      1W10Ω    AAAA  0123   あ     2 3 コンデンサー  50V100μF  BBBB   4567   い    20 4 ダイオード   1SS***   CCCC   8901   う    45 5 IC       XXXXD   DDDD 1245    え    100   

みんなの回答

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

VBAは忘れてしまったのでヒントのみ 完全一致または昇(降)順でよければ、VBAを使わずに関数で実現可能です。 例えば第一のブックのG2に  =VLOOKUP(C2,'第二のブックアドレス\[Book2.xls]Sheet1'!$C$2:$F$5,4,FALSE) のような指定をしておけば、そのまま単価が参照できるはず。 $C$2:$F$5の部分は参照されるテーブル範囲に名前をつけて定義しておくなどの方が便利でしょう。 VBAでも基本的に同じことです。 1)第二ブックを開いておく 2)第一ブックの品名の範囲を取得(以下その範囲内で繰り返し) 3)ブック二のC列から同じ品名を探す 4)見つかった場合はF列の値を、見つからなければ「?」などを返す 5)返された値をブック一のG列に記入(以上を繰り返す) 「類似品」の検索方法をどのようにするのかは、定型がないので自作しなければならないと思いますが、上記の 3)~4)の部分を別関数にしておいて(与えられた品名を探す関数)、見つかれば単価を、見つからなければ「?」などを返すようにしておけば全体を変えずに類似品を探すロジックだけ取り替えられるので便利かと… (そうすることで最初に作成する時も、とりあえず完全一致で作成しておいて、あとで類似検索のロジックをいろいろ試すことが可能になるかと思います) 実際には、品名だけでなく規格や品番、メーカーなども照合するほうがよさそうな…

iiji4547
質問者

お礼

自力で解決できました。 有難うございました。

iiji4547
質問者

補足

fujillinさんヒントを頂き有難う御座います。 その後、初心者成りに専門誌やWebを見ながら見よう見まねで作成してみました。現在、データが一致しているものも?が出てしまい正常に動いてくれません。どなたかアドバイスをお願いします Public Sub commandbutton2_Click() Workbooks.Open Filename:="D:\_マイ ドキュメント\000_顧客\_見積用部品構成表\部品表.xls" Workbooks.Open Filename:="D:\_マイ ドキュメント\401_見積アシスト\見積資料.xls" Dim MyParts As Range '見積型名(B列) Dim Cost As Range 'データベース価格(I列) Dim Parts As Range 'データベース型名(F列) Dim MyCost As Range '見積資料価格 (K列) Dim MyAd As String 'アドレス Dim MySh As Worksheet 'シート Set MySh = Workbooks("1006見積資料.xls").Worksheets("1006")'検索値をセットするシート With Workbooks("部品表.xls").Worksheets("リスト") For Each MyParts In .Range("B2", .Range("B65536").End(xlUp))'(1)検索するデータの場所 Set Cost = MySh.Columns(6).Find(MyParts.Value, , xlValues, xlWhole)'全ての値が一致するセルを検索します。 If Cost Is Nothing Then MyParts.Offset(, 9).Value = 0 '基準セルからの相対的な位置でセルを指定します。 End If Set Cost = Nothing Next MyParts For Each Parts In MySh.Range("F3", MySh.Range("F65536").End(xlUp)) '(2)検索す値とセットするチェック値の場所 Set MyCost = .Columns(2).Find(Parts.Value, , xlValues, _ xlWhole, xlByRows, xlPrevious) '全ての値が一致するセルを列の逆方向に検索します。 If Not MyCost Is Nothing Then MyAd = MyCost.Address 'セルのアドレス(セル番地)を取得する Do Set MyCost = .Columns(2).FindNext(MyCost) '条件に当てはまるセルを複数検索する If MyCost.Offset(, 9).Value = "" Then MyCost.Offset(, 9).Value = Parts.Offset(, 9).Value '基準セルからの相対的な位置でセルを指定します。 Exit Do End If Loop Until MyAd = MyCost.Address 'セルのアドレス(セル番地)を取得する Set MyCost = Nothing End If Next Parts On Error Resume Next 'エラーメッセージを出さない .Range("B2", .Range("B65536").End(xlUp)).Offset(, 9) _ .SpecialCells(xlCellTypeBlanks).Value = "?" '指定した範囲の中で条件を満たす全てのセルを参照します。 On Error GoTo 0 End With Set MySh = Nothing Workbooks("見積資料.xls").Close End Sub

関連するQ&A