• 締切済み

マクロについて

初めて質問させていただきます。 最近会社で、エクセルのマクロを使って作ってほしいと言われました。 が、マクロを使用したことがありません。 そこで、下記内容で作りたいのですが、よろしくお願いします。 1.シート1に製品名を入力すると、シート2にある製品データから、入力した製品名を検索し、   その仕様・型式・在庫数・価格等をシート1に表示する。 2.また、1.でシート1に表示した、製品名・仕様・型式・在庫数・価格等を改訂し、登録ボタン等   を押すことで、シート2の内容も改訂される。 マクロは「マクロの記録」を使用したことは何度かある程度です。 宜しくお願いします。

みんなの回答

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! 一例です。 方法だけ理解してもらえれば良いかな!って思っています。 Sheet1・Sheet2は↓の画像のような配置になっているとします。 Sheet1にコマンドボタンを配置しています。 まず、画面左下にある操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので ↓のコードをコピー&ペーストして、A2セルのデータをあれこれ変更してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から Dim i As Long Dim ws As Worksheet Set ws = Worksheets("sheet2") If Target = Cells(2, 1) Then If WorksheetFunction.CountIf(ws.Columns(1), Target) Then i = WorksheetFunction.Match(Target, ws.Columns(1), False) With Target .Offset(, 1) = ws.Cells(i, 2) .Offset(, 2) = ws.Cells(i, 3) .Offset(, 3) = ws.Cells(i, 4) .Offset(, 4) = ws.Cells(i, 5) End With Else MsgBox "データがありません。" End If End If End Sub 'この行まで 次にコマンドボタンを配置 → デザインモードでコマンドボタンをダブルクリックすると VBE画面が出ますので、↓のコードをコピー&ペーストしてみてください。 (ダブルクリックした時点で、1行目と最終行の「End Sub」は表示されているはずですので実際は2行目以降のコードになります) Private Sub CommandButton1_Click() Dim i As Long Dim ws As Worksheet Set ws = Worksheets("sheet2") If WorksheetFunction.CountIf(ws.Columns(1), Cells(2, 1)) Then i = WorksheetFunction.Match(Cells(2, 1), ws.Columns(1), False) With ws.Cells(i, 1) .Offset(, 1) = Cells(2, 2) .Offset(, 2) = Cells(2, 3) .Offset(, 3) = Cells(2, 4) .Offset(, 4) = Cells(2, 5) End With End If End Sub これでSheet1のデータを変更してコマンドボタンをクリックするとSheet2のデータも変更されるはずです。 以上、参考になれば良いのですが・・・m(_ _)m

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

こういうのは一種のシステムを作ることで、VBAで知らなければならないことがありすぎる。またシステムというものに対する 心得(特に対使用者)も必要。 相当期間勉強しないと無理でしょう。 本件丸投げで、作ってくださいという形になってしまっている。 回答もコードを書いても、必要な前提智識が在りすぎて、説明も無理だと思う。 ーー 「もちゃ」のようなのを、簡単に出来る範囲で上げておく。他の人なら、こうはしないかもしれない。 Sheet1 ネジ1 仕様 型式 在庫数 価格 連番 a 23 30 45 1 コマンドボタンを1つ貼り付け ーー Sheet2 データ 品名 仕様 型式 在庫数 価格 連番 ネジ1 a 23 30 45 1 線2 b 12 40 250 2 ワッシャ1 c 21 20 28 3 ーーーーーーーーーー Sheet1のシートモジュールに Private Sub CommandButton1_Click() x = Worksheets("Sheet1").Range("E3") + 1 Worksheets("Sheet2").Cells(x, "B") = Worksheets("Sheet1").Range("A3") Worksheets("Sheet2").Cells(x, "C") = Worksheets("Sheet1").Range("B3") Worksheets("Sheet2").Cells(x, "D") = Worksheets("Sheet1").Range("C3") Worksheets("Sheet2").Cells(x, "E") = Worksheets("Sheet1").Range("D3") End Sub ーー Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub MsgBox Target r = Worksheets("sheet2").Range("A:A").Find(Target.Value).Row MsgBox r Worksheets("Sheet1").Range("A3") = Worksheets("Sheet2").Cells(r, "B") Worksheets("Sheet1").Range("B3") = Worksheets("Sheet2").Cells(r, "C") Worksheets("Sheet1").Range("C3") = Worksheets("Sheet2").Cells(r, "D") Worksheets("Sheet1").Range("D3") = Worksheets("Sheet2").Cells(r, "E") Worksheets("Sheet1").Range("E3") = r - 1 End Sub ーー A1セルに品名を入れると、Sheet1の第3行目にSheet2の該当行の内容が現れる。 項目データを変更して、コマンドボタンをクリック。 Sheet2の該当行に変更が反映される。 ーーー 「おもちゃ」とは 入力チェックがなされていない。入力品目が見つからなかった場合など。 変更のみカバー。追加・抹消は略。 普通はSheet1に替えて、ユーザーフォームでも使うのかもしれないとおもう。

pomesatsuki
質問者

お礼

ありがとうございました。 申し訳ありません。本件、丸投げのつもりはありません。 当然、勉強するのは当たり前だと考えていますし、本件が全てではありません。 一つのトリガーにさせていただくつもりでした。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

作成例1: シート1のA1セルに製品名を記入すると シート2のA列を検索して 同じ行のBCD列のデータをシート1のA2,B2,C2セルに転記する。 ALT+F11を押して現れた画面で挿入メニューから標準モジュールを挿入し,下記をコピーする sub macro1()  range("A2,B2,C2").clearcontents  if application.countif(worksheets("Sheet2").range("A:A"), range("A1")) = 0 then  msgbox "not found"  exit sub  end if  range("A2").formula = "=VLOOKUP(A1,Sheet2!A:D,2,FALSE)"  range("B2").formula = "=VLOOKUP(A1,Sheet2!A:D,3,FALSE)"  range("C2").formula = "=VLOOKUP(A1,Sheet2!A:D,4,FALSE)"  range("A2").value = range("A2").value  range("B2").value = range("B2").value  range("C2").value = range("C2").value end sub シート上にオートシェイプの図形などを配置して「検索」とテキストを記入しておき,右クリックしてマクロの登録で上記マクロを登録する 作成例2: シート1のA1に製品名を記入し それがシート2のA列にあれば,  同行のBCD列の値を現在のA2,B2,C2の値で更新する それがシート2のA列に無ければ  新しい行のABCD列にデータを追記する 標準モジュールに次のマクロを追加する sub macro2()  dim r as long  if application.countif(worksheets("Sheet2").range("A:A"), range("A1")) = 0 then   r = worksheets("Sheet2").range("A65536").end(xlup).offset(1).row  else   r = application.match(range("A1"), worksheets("Sheet2").range("A:A"), 0)  end if  worksheets("Sheet2").cells(r, "A") = range("A1").value  worksheets("Sheet2").cells(r, "B") = range("A2").value  worksheets("Sheet2").cells(r, "C") = range("B2").value  worksheets("Sheet2").cells(r, "D") = range("C2").value end sub オートシェイプなどで「登録」ボタンを作成し,上記マクロを登録する。 #丸投げの作成依頼ならそれらしく,上述の書きぶりなど参考に「どこ列どこ行どこ番地にどんな内容でデータが記入している」といった情報を,具体的に「あなたのエクセルが目に見えるように」説明するようにしてください。 とはいえ上述のマクロはどんな具合にシートを作製したいのか不明なので,わざと1行ずつ効率の悪い検索や転記の仕方をしています。具体的な情報が最初からあれば,もっと手間の要らないクールな書き方をしますが,お手前で自作する参考にはなるはずですので,頑張って自作してください。 #A1に記入しただけで自動実行するような作り込みも可能ですが将来の課題として,いまは最低限ヤリタイ事が実現できるマクロをご自分で完成してください。

pomesatsuki
質問者

お礼

ありがとうございます。 情報不足、反省しています。 また、本件丸投げのつもりはありません。 ただ、取っ掛りが欲しかっただけでした。

関連するQ&A