• ベストアンサー

Excelでデータベース的な使い方

今、ある商店の帳簿をDB化しようとしています。 そこで、少し煩雑なので教えてください。 まず、Book1で、商品コードと商品名の一覧表を作りました。 で、Book2で商品コードを入れた時に、自動的に商品名の欄にBook1で対応している商品名が入るようにするためにはどうしたら(どのような関数を使ったら?)良いでしょうか。 また、Book2に、Book1にはなかった商品コードと商品名を入れた時、Book1の方で「それは自分は持っていない新しい情報である」と認識して自動的にBook1にも新しい項目(=商品コードと商品名)が増えるようにするにはどうしたらいいでしょうか。 Excelのヘルプを見ても該当するようなものが探せなくて困っています。 お手数ですが、力を貸していただけないでしょうか。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

とりあえず質問1「商品コードから商品名を判別する」 は1番さんの回答通りLOOKUP関数の仕事です。 質問2「商品コード・商品名を追加する」は マクロというよりは、完全にVBAの作業になりますね。 自分でコードを書かなければなりませんが そんな複雑な操作は必要ないので マクロの積み重ねで何とかなるでしょう。 ##一からVBAをやっていくには格好のレベルの題材だと ##思いますので、もし時間的に余裕があるのであれば ##勉強されてみては如何でしょうか。 あるいは根本的に設計を変更、 つまりは追加する部分は完全に手作業でする前提で 作るとか。 一応注意点としては、LOOKUP関数は対象をソート (数字順に並べなおし)しておく必要がありますので、 そこだけクリアすれば、そんなに知識がない人でも データベースの操作は可能だと思います。

kozuru
質問者

お礼

詳細なご説明、ありがとうございます。 私は、Excelは簡単な関数やグラフ、表なんかは一通りできるものの、マクロはほとんどさっぱりなので、ちょうど勉強になると思います。 勉強してできるレベルであるということが分かっていれば、やる気にもなります(^_^) 「ある商店」とは酒屋さんなので、毎月のように出るビールやチューハイの新製品のコード管理にそういうことができたらいいとリクエストされたのでした。 ひとまず、LOOKUP関数とVBA、やってみます。 ありがとうございました。

その他の回答 (2)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

>Book2で商品コードを入れた時に、自動的に・・・・・・・・  VlookUpでできますが、事前に算式を登録したり、入力後、算式をコピーする必要があります。  また、多数入力すると操作性(速度)が悪くなってくるでしょう。新しいコードを入力する時には算式を壊すことにもなります。次の質問と相反しますね。 >Book2に、Book1にはなかった商品コードと商品名を入れた時・・・・  これを実現するためには、最初の質問との関係でVlookUpは使えないように思います。使った場合、使い手がかなり操作(Excel)に慣れていないと無理でしょう。 参考にVBAだけでコードを書いてみました。商品コードと商品名の重複に制限をかけています。VlookUpを使っていないので、数が増えても問題はないと思っています。 ExcelでDB化というのも少し大変かと思いますが・・・ ご参考に。 Book1はA、B列に商品コードと商品名を入力。Book2はD、E列に商品コードと商品名を入力する前提です。 実際のシートに合わせて変更して下さい。 ツーツ→マクロ→Visual Basic Editor でVBE画面に移り、Book2のシート1のコードウインドウに貼り付けます。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)  Dim wb As Workbook 'コードがあるBook  Dim ws As Worksheet 'コードがあるSheet  Dim cl As Integer 'コードがある列  Dim rw As Long '新しいコードを追加する行   Set wb = Workbooks("Book1.xls")   Set ws = wb.Worksheets("Sheet1")   cl = Asc("A") - 64 '*** コードのある列をセット(今はA列) ***  Dim rg As Range '変更したセル範囲の単一セル  Dim schCode As Range '検索する商品コード  Dim schName As Range '検索した商品コードの商品名  Dim inp_cl As Integer 'コードを入力する列   inp_cl = Asc("D") - 64 '*** 入力するコードの列をセット(今はD列) ***  Application.EnableEvents = False  For Each rg In Target '複数セルの変更に対応する   Select Case rg.Column    Case inp_cl 'コードを入力     'コードを検索     Set schCode = ws.Columns(cl).Find(What:=rg.Value, LookIn:=xlValue, LookAt:=xlWhole)     If Not schCode Is Nothing Then      '見つかった!      rg.Offset(0, 1) = schCode.Offset(0, 1).Value '商品名を入力コードの横に表示     Else      '見つからないので商品コード表に追加      If rg.Offset(0, 1) <> "" Then       rw = ws.Range(Chr(cl + 64) & "65536").End(xlUp).Row + 1       ws.Cells(rw, cl) = rg.Value       ws.Cells(rw, cl + 1) = rg.Offset(0, 1).Value      End If     End If    Case inp_cl + 1 '商品名を入力     If rg.Offset(0, -1) <> "" Then      Set schCode = ws.Columns(cl).Find(What:=rg.Offset(0, -1).Value, LookIn:=xlValue, LookAt:=xlWhole)      Set schName = ws.Columns(cl + 1).Find(What:=rg.Value, LookIn:=xlValue, LookAt:=xlWhole)      If schCode Is Nothing Then       If schName Is Nothing Then        'コードが無く、商品名も見つからないのでコード表に追加        rw = ws.Range(Chr(cl + 64) & "65536").End(xlUp).Row + 1        ws.Cells(rw, cl) = rg.Offset(0, -1).Value '商品コード        ws.Cells(rw, cl + 1) = rg.Value '商品名       Else        '既に商品名がある場合        MsgBox "商品名が重複しています。", vbOKOnly, "商品名重複"       End If      Else       '既に商品コードがある場合       MsgBox "入力コードが重複しています。", vbOKOnly, "データ重複"      End If     End If   End Select  Next  Application.EnableEvents = True End Sub

kozuru
質問者

お礼

すごい!すっかり作ってくださってありがとうございます。 とはいえ、このまま丸写しでは自分の勉強にもならないし、おかしくなったときに直せないので、 ご提示頂いたものを手がかりに勉強してみたいと思います。 ありがとうございました。

  • peso
  • ベストアンサー率41% (40/97)
回答No.1

>Book2で商品コードを入れた時に、自動的に・・・ これは VLOOKUP 関数を使う事で実現できます。 この関数は・・・ちょっとここで説明するのが難しいので、ヘルプ等や 関数ウィザードを参照してください。 >Book2に、Book1にはなかった商品コードと・・・ これは関数などでは出来ないでしょう。 マクロを使えば一応は可能だと思います。

kozuru
質問者

お礼

どうもありがとうございます! Excelの関数は数が多いので、調べきれずにいました。 どの関数で実現できるかわかっただけでも、これからの作業が進みます。 関数の使い方はヘルプを見て勉強してみます。 すでにコードと商品名の一覧表は作り始めているので、これができないと八方塞になってしまうところだったので.... 本当にありがとうございました。

関連するQ&A

  • エクセルについてご質問させていただきます

    現在は、シート1に『商品コード』『商品名』『分類』『在庫』が一覧で存在しており検索機能を使用して商品コードで検索し『在庫』に○を記載しているのが現状です 約500件のデータが存在しており、同一の商品コードは1つしか存在しません そこで、シート2のあるセルに商品コードを入力するとシート1から商品名、分類を引っ張ってきて表示し、正しければ何か1クッション(ボタンを押すなど)すればシート1の該当商品の在庫に○が記載されるようにしたいのです シート2に商品コードを入力して商品名、分類を表示させるのは関数で出来ました =INDEX(商品一覧!A3:C1000,MATCH(B14,商品一覧!A3:A1000,0),3) が、クッション(ボタンを押すなど)すればシート1の在庫に○が記載されるようにする事がどうしても出来ません 何か良い知恵がありましたらご教示をお願いいたします

  • エクセルでIF関数について

    VLOOKUPとIF関数を組み合わせて計算した時の事なのですが。。。 VLOOKUP関数を使って商品コードを入れたら商品名がでるように 数式を作成しました。すると商品コードに値が入っていないと エラー値が出てしまいますよね?そこでIF関数を用いて商品コード欄に 値が入っていなければ、つまりは空白であれば商品名の欄には空白を 表示せよ、そうでなければVLOOKUP関数を実行せよというふうに組み合わせ たのですが・・・エラー値が消えないのです!! オートフィルでコピーをするとその下からはちゃんと正常に空白表示に なるのに・・・・! 私は講師をしているのですが、上記のような症状になるのは2台だけ であとのパソコンは正常です。ということはエクセル自体に不具合が 生じているのかな?と思ったりしました。ということはもう一度インスト するべき?など等考えたのですが、どなたかご指導お願いします!!

  • エクセル データベースと検索

    エクセル初心者です。 今データベースの検索の勉強のため 以下のような2枚のシートを作成しています。 上段がデータベースの元データで在庫の商品と 支店名です。 商品の種類は全部で1000個位の種類があります。 下段が商品を備蓄している支店名と支店コードです。 そこで今回したい処理なのですが、 下段の支店コードの横の列に以下のように 検索フォームをつくり、支店名(さらに言えば支店コードだけ) を入力すれば、その支店で持っている商品名を すべて表示したいのです。 現在、目視でしているためたいへん時間がかかります。 関数やVBAで抽出することはできるのでしょうか。 よろしくお願いします。

  • エクセル/表引きの方法を教えて下さい

    エクセルで、セルにコード番号を入れたときに、その右横のセルに、別のシートに作ってあるコード一覧表を参照して、入力したコード番号の商品名を自動的に入れるにはどうしたらいいのでしょうか。 コードの一覧のシートに 1 A商品 2 B商品 … と作ってあって、 別のシートでセルに「2」 ←を入れると 2 B商品(←自動的に表示される) ↑ 入力 のようにしたいのですが。 いろいろ調べたのですが分からないのでよろしくお願いします。

  • VLOOKUPから該当なし表示

    VLOOKUPの関数で、商品コードを入れると、商品名がでるリストは作れます。 ところで、該当しない商品コードを入力した時、”該当なし”と表示させたいのです。いろいろやってみたのですが、出来ませんでした。(あたま悪い!) ご教示ください。m(__)m

  • エクセルで関数を使いこのようなこと可能でしょうか?

    こんにちは。皆様のお力を貸してください。 エクセルで商品一覧(シートA)を作りました。販売管理(シートB)と連動させ、納品日欄(F列)に日付が入ったら、列Bに入っている商品の仕入金額をG列に入れたいのです。商品一覧シートは、A列に商品コード、B列に商品名、C列に商品金額、D列に表示させたい仕入金額が入ってます。 関数で簡単に出来そうですが、組み方がいまいちわかりません。 ご存知の方いましたら、ご教授願います。

  • Excelのデータベース活用で・・・

    早速ですが、データベースの中から別シートに抽出をしたいのですが、これは可能ですか? できるならどうすればいいのか教えてください。 具体的に言うと、次のようなことがしたいんです。 [Sheet1]に以下のようなデータベースがあるとします。 A列:部署コード(4桁) B列:部署名 C列:社員コード(6桁) D列:社員名 この[Sheet1]のデータをもとに、[Sheet2]以下のシートには指定した部署のみの一覧を抽出したいんです。 例えば、A1セルにある部署コードを入力しておけば、指定したセルに該当する社員だけを表示したいということです。 よろしくお願いします。

  • エクセルの関数について教えて下さい。

    【図1】 コード  商品番号  業者名    商品名   上代   下代 11111    a      ※1     えええ     2,000   ※2 ※1、【図2】の一覧から、えええが最安値の業者名を抽出したい。 ※2、【図2】にある最安値店舗の下代を抽出したい。 【図2】 コード  商品番号  業者名    商品名    上代   下代 11111    a      テスト      えええ     2,000    1,000 11111    a     あああ     えええ     2,000    1,300 11111    a     いいい     えええ     2,000   1,250 11111    a     ううう      えええ    2,000    800 関数の設定が分かりません。。。 どなたか教えて下さい。宜しくお願い致します。

  • エクセルで請求書を作りたい!

    エクセルで請求書を作りたいのですが、シート1に請求書のテンプレートを作成した状態で、シート2とシート3に商品リストを作成してあります。  そこで、シート1の請求書の欄に商品番号と商品名の欄があるのですが、商品数が8000もある上に、複数の商品の発注が予期されるため、いちいち商品名を入力したくありません(面倒くさがりなので…。)そこで、シート1の商品番号欄に商品番号を入力することで、自動で商品名がシート1の商品名欄に反映されるような、関数又はマクロの設定の仕方を教えてください。  文面を見ると初心者であることがわかると思いますが、出来るだけ詳しくお願いいたします。

  • リストから別シートの表に順次反映させるには?

    データが入力されたリスト一覧があります。 A欄 商品名 B欄 コード番号 C欄 規格 など それを別シートに作成した表式(商品名が10品、縦に記入できるようになってます)にあてはめたいのですが、ここで問題が・・・ 表式は一枚だけ作成しておき、リストが増えても順次そこに反映させて、印刷したいのですが 何かいい関数があったら教えてください

専門家に質問してみよう