こんばんわ。遅くなりました。まだ完成品ではありませんが、下記のように操作して動作を確認し、ご意見をお聞かせ下さい。
1.用意したブックを立ち上げ、ALT+F11キーを押してVBE画面を開く。
2.画面左上にあるVBEProjectと書いてある下のSheet1をダブルクリックし、開いたコードエディター(右側の白い部分)に下記のコードをコピー・ペーストする。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRow As Long
Dim myRange As Range
Dim myCell As String
Application.EnableEvents = False
myRow = Target.Row
If Target.Address = "$B$1" Then Exit Sub
If Target.Address = Range("A" & myRow).Address _
Or Target.Address = Range("B" & myRow).Address _
Or Target.Address = Range("C" & myRow).Address Then
If Target.Value <> "" Then
myCell = Cells(Rows.Count, 7).End(xlUp).Address
Set myRange = Range("G1:" & myCell).Find(Target.Value, lookat:=xlWhole)
If myRange Is Nothing Then
If Target.Address = Range("A" & myRow).Address Then
Range(myCell).Offset(1, 0).Value = Target.Value
ElseIf Target.Address = Range("B" & myRow).Address Then
Range(myCell).Offset(0, 1).Value = Target.Value
myCell = ThisWorkbook.Worksheets(2).Cells(1, Columns.Count).End(xlToLeft).Address
If ThisWorkbook.Worksheets(2).Range(myCell).Value = "" Then
With ThisWorkbook.Worksheets(2).Range("A1:A2")
.HorizontalAlignment = xlDistributed
.VerticalAlignment = xlCenter
.AddIndent = True
.MergeCells = True
End With
ThisWorkbook.Worksheets(2).Range(myCell).Value = "日付"
With ThisWorkbook.Worksheets(2).Range("B1:B2")
.HorizontalAlignment = xlDistributed
.VerticalAlignment = xlCenter
.AddIndent = True
.MergeCells = True
End With
ThisWorkbook.Worksheets(2).Range(myCell).Value = "売上合計"
End If
myCell = ThisWorkbook.Worksheets(2).Cells(1, Columns.Count).End(xlToLeft).Offset(0, 1).Address
ThisWorkbook.Worksheets(2).Range(myCell).EntireColumn.ColumnWidth = 16
ThisWorkbook.Worksheets(2).Range(myCell).Offset(0, 1).EntireColumn.ColumnWidth = 16
With ThisWorkbook.Worksheets(2).Range(myCell & ":" & Range(myCell).Offset(0, 1).Address)
.HorizontalAlignment = xlDistributed
.VerticalAlignment = xlCenter
.AddIndent = True
.MergeCells = True
End With
ThisWorkbook.Worksheets(2).Range(myCell).Value = Target.Value
ThisWorkbook.Worksheets(2).Range(myCell).Offset(1, 0).Value = "売上個数"
myCell = ThisWorkbook.Worksheets(2).Cells(2, Columns.Count).End(xlToLeft).Offset(0, 1).Address
ThisWorkbook.Worksheets(2).Range(myCell).Value = "売上金額"
With ThisWorkbook.Worksheets(2).Range(Range(myCell).Offset(0, -1).Address & ":" & myCell)
.HorizontalAlignment = xlDistributed
.VerticalAlignment = xlCenter
.AddIndent = True
End With
Else
Range(myCell).Offset(0, 2).Value = Target.Value
End If
Else
Target.Offset(0, 1).Value = myRange.Offset(0, 1).Value
Target.Offset(0, 2).Value = myRange.Offset(0, 2).Value
Target.Offset(0, 3).Select
End If
End If
ElseIf Target.Address = Range("D" & myRow).Address Then
Target.Offset(0, 1).Value = Target.Value * Target.Offset(0, -1).Value
Target.Offset(1, -3).Select
End If
Application.EnableEvents = True
End Sub
3次に、同じく画面左上にあるVBEProjectと書いてある下のSheet2をダブルクリックし、開いたコードエディター(右側の白い部分)に下記のコードをコピー・ペーストする。
Private Sub Worksheet_Activate()
Dim myMsb As Integer
Dim i As Integer
Dim myRange1 As Range
Dim myRange2 As Range
Dim myRange3 As Range
Dim myVlu1 As String
Dim myVlu2 As String
myMsb = MsgBox("商品別集計処理を実施します。よろしいですか?", vbYesNo + vbQuestion, "作 業 確 認")
If myMsb = vbNo Then Exit Sub
Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = ThisWorkbook.Worksheets(1).Range("B1").Value
Set myRange1 = Worksheets(1).Range("E3:" & Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Address)
Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Application.WorksheetFunction.Sum(myRange1)
For i = 3 To Cells(1, Columns.Count).End(xlToLeft).Column Step 2
myVlu1 = Cells(1, i).Value
Set myRange1 = ThisWorkbook.Worksheets(1).Range("B2:" & ThisWorkbook.Worksheets(1).Cells(Rows.Count, 2).End(xlUp).Address)
Set myRange2 = ThisWorkbook.Worksheets(1).Range("D2:" & ThisWorkbook.Worksheets(1).Cells(Rows.Count, 4).End(xlUp).Address)
myVlu2 = Application.WorksheetFunction.SumIf(myRange1, myVlu1, myRange2)
Cells(Rows.Count, i).End(xlUp).Offset(1, 0).Value = myVlu2
Set myRange2 = ThisWorkbook.Worksheets(1).Range("E2:" & ThisWorkbook.Worksheets(1).Cells(Rows.Count, 5).End(xlUp).Address)
myVlu2 = Application.WorksheetFunction.SumIf(myRange1, myVlu1, myRange2)
Cells(Rows.Count, i + 1).End(xlUp).Offset(1, 0).Value = myVlu2
Next i
End Sub
4.ALT+F11を押してエクセルの画面にもどり、シート1を開いてB1に今日に日付を入力する。
5.データーを適当に入力してみる。入力が終わったら、シート2を開く
自動で1日の商品別の売上個数と金額がシート2に表示されます。
操作が終わったら、このブックは保存をせずに終了して下さい。
1年分のデーターがシート1に入力できます。その時月別の商品ごとの売上個数の合計と売上金額の合計は必要でしょうか。お知らせ下さい。なお、コードの説明は必要があれば後程させていただきます。
お手数をおかけいたしますが、よろしくお願いいたします。
お礼
kazuhiko5681様 いろいろと御丁寧に御指導賜りありがとうございました。 もっと勉強してがんばってみようと思います。 本当にありがとうございました。お体にご自愛なさって、 ご活躍くださいませ。 ya-ya-ya-ya
補足
お返事が送れて申し訳ありません。 一日の営業が終わってから集計をしますので出来るだけ入力がシンプルなものがいいのではないかと思っております。日付入力→入力フォームによる商品コードと個数(伝票によっては同一商品の入力もあります。)→商品毎の個数集計。という感じを考えておりました。 列方向と行方向の変更しなければならないようですね。 今まで、私が使用していた計算シートは商品数が91件あるので横スクロールを避けるように行に商品名、列に“正”の字を書き連ねるようにして最終的にその商品の合計が出来るようにしたエクセルのシートを使用しております。31列分のセルに全て“0”が入力してあり売上伝票を見ながら該当の商品欄の“0”を書き換える形で個数を入力しております。一日の集計は商品別の合計をコピーして一旦メモ帳にペーストしてそれをまたコピーして、同形式の新たなシートの該当日にペーストして31日間データを埋めて一か月分とし、同形式の(12ヶ月分の列の)シートに商品別の年間集計を出しております。 印刷もしやすかったのでこの様にしておりました。 No.8でご指摘いただきました様に、既存データがございますのでG~I列にコピーして使用しましたところおっしゃっていることが良く分りました。 ありがとうございました。 またマクロを保存するにはどうすれば良いのでしょうか? 日計表と月間集計表とあわせて御指導いただければ幸いです。