• ベストアンサー

Excel2007 シートと列・行を検索して入力

シート (東京・千葉・埼玉)は店舗名です、列(日付)に行(商品名)が何個入ってきたか入力しなければなりません。同じ日に同じ商品が入ってきたら合算しなければなりません。 入力はsheet1のA列に店舗名シート B列に日付 C列に商品名 D列に個数を連続して入力したいです。 このマクロを教えて頂きたいです。 よろしくお願いいたします。

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

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

こんばんは! 前提条件として・・・ (1)Sheet1の日付と各店舗Sheetの日付は必ず同月とする (2)Sheet1のA列店舗名のSheetは必ず存在する (商品に関しては仮に各Sheetに存在しない場合、1行目に追加するようにしています) とします。 (上記条件がそろわない場合はマクロが止まってしまいます) データは↓の画像のように各Sheetとも2行目以降にあるとします。 Sheet1のD列(数量)を入力 → Enter でマクロが実行されるようにしています。 各Sheetの該当セルにSheet1のデータをプラスしていっても良いのですが、 万一Sheet1のD列(数量)の入力間違いがあった場合、重複してプラスされてしまいますので 敢えてSUMIF関数を使用しています。 そのためSheet1のE列を作業用の列として使用していますので 目障りであればE列を非表示にしておいてください。 画面左下のSheet1のSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてSheet1にデータを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から If Intersect(Target, Columns(4)) Is Nothing Or Selection.Count <> 1 Then Exit Sub Dim i As Long, j As Long, k As Long, str As String i = Target.Row Cells(i, 5) = Cells(i, 2) & Cells(i, 3) str = Cells(i, 1) If WorksheetFunction.CountIf(Worksheets(str).Rows(1), Cells(i, 3)) = 0 Then Worksheets(str).Cells(1, Columns.Count).End(xlToLeft).Offset(, 1) = Cells(i, 3) End If k = WorksheetFunction.Match(Cells(i, 2), Worksheets(str).Columns(1), False) j = WorksheetFunction.Match(Cells(i, 3), Worksheets(str).Rows(1), False) Worksheets(str).Cells(k, j) = WorksheetFunction.SumIf(Columns(5), _ Worksheets(str).Cells(k, 1) & Worksheets(str).Cells(1, j), Columns(4)) End Sub 'この行まで ※ 関数でないので、Sheet1のデータをクリアにしても他のSheetには反映されません。 月替わりにはすべてのSheetデータをクリアにする必要があります。 (各SheetのデータをクリアにするVBAも可能ですが、今回は割愛します) この程度で参考になりますかね?m(_ _)m

その他の回答 (2)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 ANo.1です。  申し訳御座いません。先程の私の回答に添付した画像における、東京シートの部分を作成する際に、誤って千葉シートを開いた状態でキャプチャーしておりました。  ですから、正しい画像を投稿し直させて頂きます。  もし、質問者様が御利用になられているサイトが、添付画像の表示を行っていないサイトである場合には、以下の参考URLのページを御覧下さい。 【参考URL】  Excel2007 シートと列・行を検索して入力 | Visual BasicのQ&A【OKWave】   http://okwave.jp/qa/q7677285.html

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 関数でも簡単に出来ますが、マクロでなければだめなのでしょうか?  今仮に、各店舗毎のシートでは、印刷した際にどの店舗の情報であるのかを判り易くするために、B2セルにシート名を自動表視させるものとして、実際の合算結果の表はは4行目以下に表示させるものとします。  まず、東京シートのB2セルに次の関数を入力して下さい。(註:Excelのbookが新規に作成したばかりで、未だどこのフォルダーにもファイルとして保存されていない間はエラーとなりますので、適当なファイル名を付けて保存されてから作業を始められた方が混乱を避けるという意味で良いかも知れません) =REPLACE(CELL("filename",B1),1,FIND(".xlsx]",CELL("filename",B1))+5,)  次に、東京シートのA4セルに次の関数を入力して下さい。 =IF(OR(COUNT(Sheet1!$B:$B)=0,MAX(A$3:A3)=MAX(Sheet1!$B:$B)),"",IF(ROWS($4:4)=1,MIN(Sheet1!$B:$B),A3+1))  次に、東京シートのA4セルをコピーして、東京シートのA5以下に貼り付けて下さい。  次に、東京シートのB4セルに次の関数を入力して下さい。 =IF(COUNTIFS(Sheet1!$A:$A,$B$1,Sheet1!$B:$B,$A4,Sheet1!$C:$C,B$3),SUMIFS(Sheet1!$D:$D,Sheet1!$A:$A,$B$1,Sheet1!$B:$B,$A4,Sheet1!$C:$C,B$3),"")  次に、東京シートのB4セルをコピーして、「その日付に入って来たその商品の総数」を表示させる全てのセルに貼り付けて下さい。  次に、東京シートのコピーシートを必要な店舗数分だけ複製してから、Sheet1以外の各々のシート名を各店舗名と同じ名称に変更して下さい。  これで、各店舗のシートに、店舗毎に、日付別で商品毎の入って来た数量の合計が、自動的に表示されます。

この投稿のマルチメディアは削除されているためご覧いただけません。