• ベストアンサー

エクセルのマクロについて教えてください

シートが3つあります。Aシートはデータが打ち込んであり、Bシートは計算を行い、Cはその結果を返します。今、Aシートの各データには頭に通し番号がふってあり、Cシートの入力エリアにその番号を打つと、vlookupでAシートのデータの中身を引っ張ってきて、それでBシートにて計算が行われています。で、その結果が再びCシートに返されます。 ところで、その計算結果をAシートの該当データに貼り付けていきたいのですが、いちいちCシートでコピー、Aシートの該当行に形式を選択して貼り付け、とやっているのですが、これをCシートで入力した通し番号とAシートの通し番号を突合して一致したところの○番目のセルに結果を貼り付ける、といったマクロは可能でしょうか。教えてください。

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

  • ベストアンサー
回答No.3

遅くなりました。サンプルマクロを組んでみました。下記のコードをSheet1のモジュールシートにコピー&ペーストして下さい。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRange As Range If Target.Address <> "$A$2" Then Exit Sub Set myRange = Worksheets(2).Range("A1:" & Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Address).Find(Range("A1").Value) MsgBox myRange.Address If Not myRange Is Nothing Then myRange.Offset(0, 1).Value = Range("A2").Value End Sub もし、シート2のA列にシート1のA1に入力した値が複数あるのであれば、上のコードではなく、下記のコードを使用して下さい。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRange As Range Dim myAdr As String If Target.Address <> "$A$2" Then Exit Sub With Worksheets(2).Range("A1:" & Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Address) Set myRange = .Find(Range("A1").Value) If Not myRange Is Nothing Then myAdr = myRange.Address Do myRange.Offset(0, 1).Value = Range("A2").Value Set myRange = .FindNext(myRange) Loop While Not myRange Is Nothing And myRange.Address <> myAdr End If End With End Sub もし、ご不明な点・不具合等がありましたらご遠慮なくお知らせ下さい。

kissa
質問者

お礼

どうもありがとうございました。 ここまでずばり書いていただくと、コピーするだけでできてしまって、なんだか申し訳ないような気さえしてきます。どうもありがとうございました。

その他の回答 (2)

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

問題の説明がわかりにくかった。例でもあげていただくと良いが。Sheet2の演算のことが良く見えない。 テストデータととしてSheet1に (A列)(B) (C) (D) (E) 1 12 15 5   結果列 2 13 223 1 3 14 345 99   4 15 234 3 5 16 234 4 Sheet3のA1に番号を入力。仮に3とする。 VBEのModule1に Sub test01() Dim b(3) Dim x As Object a = Worksheets("sheet3").Cells(1, 1) Set x = Worksheets("sheet1").Range("a1:a100"). _ Find(What:=a, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByColumns, _ SearchDirection:=xlNext, MatchCase:=False) For i = 1 To 3 b(i) = x.Offset(0, i) MsgBox b(i) Next i '----- c = x.Row For i = 1 To 3 Worksheets("sheet2").Cells(c, i) = b(i) Next i '----- Worksheets("sheet1").Cells(c, 5) = _ Worksheets("sheet2").Cells(c, 4) End Sub ----- Sheet3のA1セルの値の3で、Sheet1のA列を検索し 見つかった3行目のB3:D3のデータ値をSheet2の A3:C3にセットする。 Sheet2のD3には=Sum(A3:C3)の式があり(例として)、 答えは458で、その計算値をSheet1のE3にセットしている。 セル指定(Sheet3)-->Sheet1より該当行を探す-->Sheet1より データを採る-->Sheet2に値セット-->Sheet2で計算--> 結果をSheet1へセット、です

kissa
質問者

お礼

お礼がおそくなり申し訳ありません。 imogasiさんの回答にすでに答えは含まれているように思われます。今回は計算シートへの貼り付けは関係がなくて、そのあたりを質問で紛らわしくかいてしまいすみません。とりあえず、ご回答のとおりに実践してみようかと思うのですが、どこを削ればよいのかすこしやってみようと思います。無事完了し次第締め切ってポイントを割り振りますのでよろしくお願いします。

kissa
質問者

補足

 と、お礼に書いたとおりいろいろ削ってやってみたのですが、できませんでした。意味も分かってないのにできるわけないのですが...。ということですみません。引き続き教えてください。

回答No.1

初めまして。簡単にできます。貴方様が考えておられることをすぐに実行できるようなサンプルマクロを組んでみたいと思いますので、次のことを教えて下さい。 ・Aシートの列の項目名とCシートの列の項目名・それぞれの項目が入っている列の名前 お手数をおかけいたしますが、よろしくお願いいたします。

kissa
質問者

お礼

さっそくありがとうございます。 お返事が遅くなり申し訳ありません。 説明が悪かったのですが、端的に言うと、 シート1で「3」と入力すると、その番号をキーとしてシート2のデータを使いシート3で計算されます。そして結果がシート1に出ます。これが現状です。 シート1「A1」に「3」を入力、するとシート2のA列「3」を検索し、シート2「B列」の値を使ってシート3で計算、シート1「A2」に結果の「5」を返す。といった具合です。その結果のシート1「A2」の「5」をシート2の「A列」の「3」のデータの「B列」に貼り付けたいというのが質問です。つまり、シート1の計算結果(A2)をシート1で入力した番号(A1)と同じ番号を持つシート2(A列)のB列に貼り付ける作業ということです。計算シートのシート3はこの質問にあまり関係ありませんでした。すみません。