Excel VBAを使って、コードに対応する品名を表示する方法

このQ&Aのポイント
  • Excel VBAを使用して、特定のコードに対応する品名を表示する方法について教えてください。
  • 現在、セルにコードを入力するとモジュールに飛び、品名を書き込むとモジュールを抜け、再度モジュールに入るという問題が発生しています。
  • 解決のためには、どのような方法がありますか?また、一般的にこのような目的の場合、どのような手法が一般的ですか?
回答を見る
  • ベストアンサー

Excel VBAを使って、あるセルに入力したコードに対応する品名を表

Excel VBAを使って、あるセルに入力したコードに対応する品名を表示しようとしています。 1.コードと品名のマスターテーブルがsheet1にあります。 2.sheet2のあるセルにコードを入力したら横のセルにsheet1から品名を引っ張って表示します。 以上をsheet2のモジュールとしてworksheetのchangeを使ってコードしました。すると、以下の問題点 があり、ご教示下さい。当方、8年前に一回だけVBとC++Builderを使って統計処理プログラムを 組んだことがありますが、元DOS系であり、ソフト自体久しぶりですっかりさび付いています。 1.コードを入力するとchangeがかかってモジュールに飛んで、処理はできます。しかし、  プログラムで品名を書き込むと、また、changeが発生して、処理を中断して、モジュールを抜け、モジュールに再突入してくる。 2.とりあえず、staticのフラグでこの処理を切り分けましたが、正直、ダサいです。 3.名前を書き込む前に、changeイベントを禁止にすればと思うのですがその方法もわかりません。 4.普通、このような目的の場合、どのような方法をとるのでしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.1

イベント連鎖しないように、イベント発生時に以下の設定をすれば 処理中は他のイベントを止めることができます。  Application.EnableEvents = False 処理終了後はイベントを可能にしてください。  Application.EnableEvents = True

endlessriver
質問者

お礼

早速、ありがとうございました。ばっちりでした。 エラー処理とかがあるので、これを使って、もう少し検討してみます。

その他の回答 (2)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

単に「2」の処理が目的なら、シートでVlookup関数を使うのがもっとも手軽です。 マクロ処理上の対策しては、他の方が提示したApplication.EnableEvents で処理するのが簡単です。 何でもマクロで~ではなくて、使える関数をチェックして関数だけで実現可能なのか、マクロで行うのが適切なのか、両者を組み合わせる方がベストなのかを検討する方が良いでしょう。 VBAでは多くのワークシート関数を呼び出して使う事が可能なので、必要な関数があればVBAで自由に利用出来ます。 例えば、VBAにVlookup関数を書き込めば任意の表の値をピックアップする事も出来ます。

endlessriver
質問者

お礼

ありがとうございました。できました。

  • syowest
  • ベストアンサー率0% (0/3)
回答No.2

Application.EnableEvents =false でイベントを禁止にするのも手ですが、マスターからコード品番をキーにしてデータを引っ張ってくるだけなのであれば、VBA ではなく、単純に関数 VLOOKUP を使ったほうがいいのではないでしょうか? =VLOOKUP((検索値, 範囲, 列番号, False) 範囲の指定は、絶対座標 $A1:$C100 等で指定 最終のパラメータは、False で指定します。

endlessriver
質問者

お礼

ありがとうございます。ばっちりでした。 ただ、範囲の取り方が説明を読んでもよくわからず苦労しました。 今回は、データとしてマスタのアドレスを書き込むので VLOOKUPでは難しそうでした。

関連するQ&A

  • エクセル VBA セルに値を入力したら入力日を表示

    エクセルに不慣れなため、質問が分かりづらかったら申し訳ありませんがご回答をお願いいたします。 エクセルファイルにある項目を入力したら、入力日を自動表示させたいと考えています。 セルB2に何かを入力したら、4行下のB6に入力日が自動表示 セルB10に何かを入力したら、6行下のB20に入力日が自動表示 セルB20に何かを入力したら、6行下のB26に入力日が自動表示 下記のサイトでB2に対する処理は出来ましたが、 B10・B20に対して処理が行えません。 B2に対するコードは下記の通りとしていますが、このコードにB10・B20に対するコードを追加するにはどうしたらよいでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address(0, 0) <> "B2" Then Exit Sub Application.EnableEvents = False Target.Offset(4, 0).Value = Now Application.EnableEvents = True End Sub https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1413855689

  • エクセルVBA セルの入力後「Delete」キーを押したか判断するプログラム

    セルに入力したあとその入力したキーが「Delete」キーかどうか判定するプログラムを作りたいのですが、下記のようにコードを書きました。 '標準モジュール Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long 'Microsoft Excel Objects(ワークシート) Private Sub Worksheet_Change(ByVal Target As Range) If GetAsyncKeyState(46) <> 0 Then 'キーボードの「Delete」キーかどうか判定 ○○ Else ○○ End If End Sub ところが、「Delete」キーを押してもGetAsyncKeyState(46)の値が「0」になり、「Delete」キーを押してないことになってしまいます。どのようにすればよいのでしょうか? 回答よろしくお願いします。

  • エクセル2003VBA ウインドウズXP 基準のセルをつくる

    エクセル2003VBA ウインドウズXP 基準のセルをつくる エクセルの”Worksheet_Change”を使って自動処理をさせようとしています。 1)セルA1に「基準セル」と入力してあるとします。 2)その下のセルA2に入力をしたとき、”Worksheet_Change”を使って 3)さらにその下のA3のセルを赤色で塗りつぶす と言うVBAを組もうとしています。 2)3)の動作については、出来るのですが 1)の基準セルを作り方がわかりません。 自分のレベルですと、 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRange As Excel.Range Dim myRow As Long, myCol As Long Set myRange = Range("A1")’※※※ myRow = myRange.Row myCol = myRange.Column If Target.Row - 1 = myRange.Row And Target.Column = myRange.Column Then Range(Cells(myRow + 2, myCol), Cells(myRow + 2, myCol)).Interior.ColorIndex = 3 End If End Sub ※※※の所をワークシートの「基準セル」と入力されている情報から取り込みたい myRangeは配列にして、ワークシート上に「基準セル」と入力しておけば、基準セルになるように したいと考えています。 どうすれば良いかご回答をお願いいたします。

  • エクセルVBA/シートのチェンジイベントを発生させない方法?

    Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "イベント発生" End Sub このワークシートがアクティヴになってるときに手入力された場合以外、チェンジイベントを発生させなくするにはどのような方法があるでしょうか? 標準モジュール記載の他のマクロでセルが変更された場合を無視したいのです。 よろしくお願いします。

  • エクセル:シート内に入力があった場合のマクロの書き方

    シート内に入力があった時の処理を作作りたいです。 現状の作り方は、シートのコードにWorksheet_Changeを用意し、 その中に「Target.Addressを取得し、そのアドレスに応じて処理をする」と書き込んでいます。 例えば以下は、入力があったら3列離れた同じ行に同じ内容入力をする、というコードです。 Private Sub Worksheet_Change(ByVal Target As Range)   Dim T_row As Integer, T_col As Integer   T_row = Target.Row   T_col = Target.Column + 3   Application.EnableEvents = False   Cells(T_row, T_col).Value = Target   Application.EnableEvents = True End Sub このコードの作り方だと、1つのセルへの入力にしか対応しないというか、 ドラッグやコピー&ペースト等、複数のセルにまたがった操作をすると動きません。 そういった通常可能な操作にも対応できるように作っていきたいのですが、 その場合どのように書き始めていけばよいでしょうか。 面倒な質問となってしまいましたが、 お時間あればよろしくお願いします。

  • エクセルマクロ(VBA)で指定したセルが変化したときに実行するには?

    VBAでsheetの中のworksheet_changeなどでマクロを書くと、そのシー トの中のどのセルを変化させてもマクロが実行されるのですが、これ を、A1とc1とc2が変化したときだけ処理を実行させたいのです。 以下のマクロのどこかを編集すると、そのようなことが出来るのでし ょうか? Private Sub Worksheet_SelectionChange(ByVal Target As Range) ----実行する内容---- End Sub Private Sub Worksheet_Change(ByVal Target As Range) ----実行する内容---- End Sub

  • Excel2010VBAのセルの入力が遅い

    Excel2010のVBAなんですが、処理時間が非常に遅いです。プログラムの中でも遅い部分はセルに入力する部分です。多分24時間ぐらいプログラムを走らせておきましたがそれでも終わっていませんでした。 シートは6個あり、それぞれ関数の計算がされており、シート1からシート3までの計算されたものがシート4に出力され、そのシート4からプログラムで計算してシート5に出力されるコードです。 シート5に出力するデータは、「年」、「月」、「日にち」、「時刻」、「データ1」、「データ2」、「データ3」、「データ4」の8つの項目です。これは全ての行に入力するわけではなく、入力しなくてもいい空白の部分もあります。空白でもいいセルには入力の処理はしないようになっています。 処理時間が遅いというのは、データ量が非常に多いということもあるのですが最初に参照するデータは50万件以上(実際はこれよりはるかにあるのですが区切っています。)あります。 全てのコードはここには記載しませんが、特に遅いセルの入力の部分は、次の通りです。 For~ With Workbooks("ブック名.xlsm").Worksheets("シート5") .Cells(b, 1) = Year(日付) .Cells(b, 2) = Month(日付) .Cells(b, 3) = Day(日付) .Cells(b, 4) = TimeValue(日付) .Cells(b, 5) = Application.Round(データ1, 3) .Cells(b, 6) = Application.Round(データ2, 3) .Cells(b, 7) = Application.Round(データ3, 3) .Cells(b, 8) = Application.Round(データ4, 3) End With Next この部分の処理を早くするにはどうしたらいいでしょうか? 回答よろしくお願いします。

  • コードを入力し隣接セルに自動的に品名を表示させる 

    エクセル2016を使用しています。 A1セルに 別タブの商品コード表の コードを入力すると A2セルに その品名 A3セルに 単位カロリー数を表示させるには、どうすればいいのでしょうか? 実際の表には、A4に数量 A5に合計カロリー数(計算値)とするつもりです。 別タブの商品コード表には、A1の列にコードNo. A2の列 に商品名 A3の列に単位カロリー数を入力する予定です。 ※OKWAVEより補足:「NEC 121ware :ソフトウェア」についての質問です

  • エクセル上のVBA

    当方、VBAまるっきり初心者です(触りはじめて3日くらい)。 エクセルはある程度理解しているつもりですが… バージョンはエクセル2000です。 他シートのセルのひとつに入力すれば、 別シートのセルがそれを参照したうえで 値として表示出来るようにならないでしょうか。  今のところ、以下のような状況です。 step01 sheet1のセルA1に任意の数値(整数限定です)を入力。 step02 sheet2のセルA1に、sheet1のセルA1の数値を用いて     MOD関数で余りを出す。 step03 sheet2のセルB2に以下のVBAによって     step02の余りを値として表示。      Private Sub Worksheet_Change(ByVal Target As Range)        Range("b2").Value = Range("a1")      End Sub  これだとsheet1の数字を変えても、 sheetの切替後sheet2のセルB2に 表示される値が変わってくれません。  最初の入力(step01の入力)をおこなえば sheet2のセルB2まで値が変わってくれるような方法を 教えていただけないでしょうか。  拙い説明で申し訳ありませんが、よろしくお願いします。

  • エクセルVBAでセル変化したら別のセルへコピーする

    おはようございます。VBAをはじめて浅い初心者です。 あるセルに数字および文字列が入力されたら違うセルへコピーしたいのですがどのようにすればできますか。 Private Sub Worksheet_Change(ByVal Target As Range)とか 使用してつくればいいのですか?教えてください。

専門家に質問してみよう