また、以前の商品名、もしくは商品コードの単価から今回入力分の単価が自動的に入るような仕組みは簡単にできるものでしょうか?
できる限り簡単なやり方だとありがたいのですが。ちなみにちょっとマクロをいじれる程度のレベルでできればうれしいです。
マクロは必要ありませんよ。
VLOOKUPという関数を使えば出来ます。
http://www.excel.studio-kazu.jp/lib/e1tw/e1tw.html
>また、以前の商品名、もしくは商品コードの単価から今回入力分の単価が自動的に入るような仕組みは簡単にできるものでしょうか?
これは特に設定しなくても出来ていると思うのですが?(ひょっとしたら私が質問の意図を取り違えているかも?)
こういうときは、Vlookupを使えばいいでしょう。
http://www.excel.studio-kazu.jp/lib/e1tw/e1tw.html
http://www11.plala.or.jp/koma_Excel/contents3/mame3023/mame30230...
まずSheet1の商品表の情報をSheet2の入力情報に反映する件ですが、
商品名、商品コード、のどちらを入力するかを決め、
入力する項目をSheet1の表のA列に設定して一覧表を作成します。
ここでは商品コードを入力すると仮定します。
まず、Sheetに
A列=商品コード
B列=商品名
C列=商品単価
として表を作成します。
商品コード | 商品名 | 商品単価 |
---|---|---|
123465 | はてな | 3000 |
一覧表の作成が終わったら、A-C列を列選択して、
左上にある名前ボックスに「商品データ」と入力してエンターします。
これで一覧表に「名前」が設定されます。
次にSheet2のA列に商品コードを入力するとして、
B列=商品名
にそれぞれの情報を自動表示するために数式を入力します。
1行目を項目行として、
B2=IF(ISERROR(VLOOKUP($A2,商品データ,2,0)),"",(VLOOKUP($A2,商品データ,2,0)))
と入力します。
この数式のうち「2」はもとの一覧表の商品コードから数えて何列目を参照するかを指定しているので、
商品単価の場合は「3」に書き換えればいいだけです。
後は該当行までコピーしてください。
既存の商品データを入力に反映していきたいという件は、
一覧表を作らずに、ということでしょうか。
既存のデータから一覧表を作成する方法が色々ありますので、
一旦一覧表にまとめてしまえば、前述の方法で自動表示できますが、
それとはまた違ったことをお考えなのでしょうか。
コメント欄を開放それていればコメント欄にて補足いたします。
以上ご参考まで。
VLOOKUPについては解決していると思いますが、
>以前の商品名、もしくは商品コードの単価から今回入力分の単価が自動的に入るような仕組み
これなんですけど、
私の解釈では、例えばA2に"えんぴつ"と入力して、A3, A4・・・と入力を続けて、A7に来てまた"えんぴつ"を入力しようとした・・・・
このとき、"え"を入力するだけで、エクセル側が「過去に入力した"え"から始まる言葉」を探してきて、候補として現れる。
見た目的にちょっと違うんですけど、携帯電話でメール書いてるときの「過去に入力したやつがぱっと出てきてくれる」のと似た感じです。
あ・・・・
いまちょっと調べました。
調べたらやっぱり設定があるようです。ごめんなさい。
[ツール] メニューから > [オプション] を選択 > 表示された [オプション] ダイアログボックスの中の [編集] タブをクリック > 下のほうにある [オートコンプリートを使用する]
にチェックを入れる。
これでできると思いますが、どうでしょうか?
関数vlookup でできます。
例として簡単にさせてもらいます。
Sheet1
商品名 A列
商品コード B列
商品単価 C列
商品名のデータは行1から行100までの100個
Sheet2
列Aに入力する商品名、列Bに商品コード、列Cに対応する単価
としますね。
まず、シート1のA,B,Cを選択、A列を優先して並べ替えします。
次にSheet2で
列Bの1行目に
=VLOOKUP(A1,Sheet1!$A$1:$C$100,2)
列Cの1行目に
=VLOOKUP(B1,Sheet1!$B$1:$C$100,2)
といれます。
これでSheet2のA1に商品名を入力すると商品コードと単価が現れます。
B1に商品コードを入れると単価が現れます
http://dummy ダミーです
VBAで考えてみました。
>Sheet1に商品名、商品コード、商品単価の表を作り、Sheet2の受注商品表に商品名、もしくは商品コードから自動的に単価を入れる仕組みはできるのでしょうか?
Sheet2でSheet1のセルを参照するには
Cells(r2, c2) = Sheets("Sheet1").Cells(r1, c1)
で可能です。
一番の問題はSheet1にある商品をどう指定するかです。
商品名の一部を入力する方法が考えられますが漢字変換はさほどいい入力方法とは思えません。
商品コードによる入力も商品点数があまり多くない、商品の変動が多くないなどでないと実用ではないように思います。
以前にした方法は商品に読み(あるいは副キーのようなもの)を設定してその読みによってマッチする商品名をいくつか表示し、目視で該当するものを指定するというものでした。この方法の問題は商品に対してどのような読みが設定されているのかわかりにくいことですが、規定を設けることである程度は軽減できると思います。
Sheet1には商品コード、商品名、単価、読みの順に登録するとします。2行目より。
Function QuaryName(name As String) Dim last last = Cells.SpecialCells(xlCellTypeLastCell).Row For r = 2 To last If StrComp(name, Cells(r, 4)) <= 0 Then QuaryName = r Exit Function End If Next QuaryName = last End Function
QuaryNameはnameに近いものをSheet1から探してその行を返します。
ここではシーケンシャルに検索していますがバイナリーサーチにした方がいいでしょう。いずれにしろSheet1は読みでソートしておく必要があります。
Sheet2では商品名、数量、単価の項目をB5の位置からを想定しています。Cellの内容が変更されたかをキャッチするいい方法が解らないのでSelectionChange()を使っています。そのためオプションの入力後にセルを移動するを右にしておく必要があります。
制御を簡略化しているため動作に支障があるかもしれません。
Dim Master_Current_Row As Integer Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Target.Count = 1 And 4 < Target.Row And Target.Row < 11 Then If Target.Column = 3 Then Application.EnableEvents = False Dim name As String, s As String, r As Integer name = Cells(Target.Row, 2).Value s = Left(name, 1) If Cells(Target.Row, 2).Value = Cells(20, 2) Then Cells(Target.Row, 3).Select ElseIf "0" <= s And s <= "9" Then r = Master_Current_Row + Val(s) Cells(Target.Row, 2) = Sheets("Sheet1").Cells(r, 2) Cells(Target.Row, 4) = Sheets("Sheet1").Cells(r, 3) Else Master_Current_Row = Sheets("Sheet1").QuaryName(name) r = Master_Current_Row Cells(Target.Row, 2) = Sheets("Sheet1").Cells(r, 2) Cells(Target.Row, 4) = Sheets("Sheet1").Cells(r, 3) For i = 20 To 29 Cells(i, 2) = Sheets("Sheet1").Cells(r, 2) r = r + 1 Next Cells(Target.Row, 2).Select End If Application.EnableEvents = True ElseIf Target.Column = 4 Then Cells(Target.Row + 1, 2).Select End If End If End Sub
操作としては商品名(B5)に読みを入れてEnterを押します。
するとTargetはC5になってSelectionChangeイベントが発生し、SelectionChange()が実行されます。
最初はSheets("Sheet1").QuaryName(name)が実行されB5に入力された文字列で検索して近い商品名の行を返します。
その行から10行を左下(b20)に商品名をコピーします。
最初のものがもっともヒットしやすいと思われるので商品名と単価をコピーします。(必要なら商品コードも)
しかし確定がどうかわからないのでSelect()で戻します。
商品リストを見て該当するものがあればその行を0から9で指定します。確定して数量の位置(C5)へ移動します。
該当のものが無ければ再度読みを入力します。
数量が入力されたら次の商品名(B6)へ移動します。
商品と読みを対応させていますが、Sheet3に商品コードと読みを対応させることで商品と読みとの対応を軽減できるかもしれません。
特に設定~というあたりを具体的にお教えいただけますか?
私がわかっていないだけなのでしょうか