仕入管理もこれで最終章となります。最後は蓄積したデータを集計し、見直しします。数値の把握にはグラフが効果的です。
期間、抽出条件で仕入れ実績を集計し、グラフ表示します。
定型、定位置に集計することによって、グラフの設定を初回のみとします。
新しくワークシート「集計」を追加してください。
集計のmodule全体
Sub SpreadT() ‘仕入売上集計
Dim h As Long
Dim k As Long
Dim DTH(1 To 7) As Object
Dim str1 As String
Dim str2 As String
On Error GoTo jump1
‘データ範囲の設定
Set DTH(1) = Worksheets(“仕入実績”).Range(“A2”).CurrentRegion
Set DTH(7) = Worksheets(“集計”)
‘データカラムの設定
Set DTH(2) = DTH(1).Columns(14) ‘MONTH
Set DTH(3) = DTH(1).Columns(7) ‘数量
Set DTH(4) = DTH(1).Columns(11) ‘金額
Set DTH(5) = DTH(1).Columns(4) ‘仕入先
Set DTH(6) = DTH(1).Columns(6) ‘商品
str1 = “*” & DTH(7).Cells(6, 3) & “*” ‘仕入先
str2 = “*” & DTH(7).Cells(7, 3) & “*” ‘商品
h = DTH(7).Cells(4, 3) ‘MONTH
k = DTH(7).Cells(5, 3) ‘MONTH
‘集計表データの抽出と書き込み
Dim f As Integer
f = 11
With Application.WorksheetFunction
Do While h <= k
DTH(7).Cells(f, 1) = h
Dim ans(1 To 2) As Long
ans(1) = .SumIfs(DTH(3), DTH(2), h, DTH(5), str1, DTH(6), str2)
ans(2) = .SumIfs(DTH(4), DTH(2), h, DTH(5), str1, DTH(6), str2)
DTH(7).Cells(f, 2) = ans(1)
DTH(7).Cells(f, 3) = ans(2)
h = h + 1
f = f + 1
’12月の次は翌年の1月作成
If Right(h, 2) > 12 Then
h = h + 88
End If
Loop
End With
DTH(7).Cells(10, 2) = “仕入数量”
DTH(7).Cells(10, 3) = “仕入金額”
‘前のデータが残っていたら一行ずつ消去
Do While DTH(7).Cells(f, 1) <> “”
DTH(7).Cells(f, 1) = “”
DTH(7).Cells(f, 2) = “”
DTH(7).Cells(f, 3) = “”
DTH(7).Cells(f, 4) = “”
f = f + 1
Loop
‘グラフの作成
On Error GoTo jump2
ActiveSheet.ChartObjects(1).Delete‘前のグラフを消去
jump2:
Range(“A10”).Select ‘集計データを選択
ActiveSheet.Shapes.AddChart2.Select ‘グラフを挿入
ActiveChart.ChartType = xlLine ‘「折れ線」
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
.AxisGroup = 2 ‘第2軸にする
.ChartType = xlColumnClustered ‘barに変更する
End With
‘グラフタイトルの作成
With ActiveSheet.ChartObjects(1).Chart.ChartTitle
.Text = “仕入集計 ” & DTH(7).Cells(4, 3) & “-” & DTH(7).Cells(5, 3) & ” ” & DTH(7).Cells(6, 3) & ” ” & DTH(7).Cells(7, 3)
.Font.Size = 14 ‘文字サイズ
End With
jump1:
Range(“B3”).Select
End Sub
一説ずつ解説していきます。
変数の宣言
Dim h As Long
Dim k As Long
Dim DTH(1 To 7) As Object
Dim str1 As String
Dim str2 As String
On Error GoTo jump1
(中略)
jump1:
On Error GoTo jump1はエラー処理でエラーが発生した場合、jump1:まで処理を飛ばします。
データ範囲の設定
ワークシート「仕入実績」
‘データ範囲の設定
Set DTH(1) = Worksheets(“仕入実績”).Range(“A2”).CurrentRegion
Set DTH(7) = Worksheets(“集計”)
‘データカラムの設定
Set DTH(2) = DTH(1).Columns(14) ‘MONTH
Set DTH(3) = DTH(1).Columns(7) ‘数量
Set DTH(4) = DTH(1).Columns(11) ‘金額
Set DTH(5) = DTH(1).Columns(4) ‘仕入先
Set DTH(6) = DTH(1).Columns(6) ‘商品
ここではワークシート、カラムを代入するために使用しています。
Worksheets(“仕入実績”).Range(“A2”).CurrentRegionではA2セルに接続するデータ範囲をCurrentRegionで取得しています。
ワークシート「仕入実績」の列値を()で指定しています。
ワークシート「集計」
str1 = “*” & DTH(7).Cells(6, 3) & “*” ‘仕入先
str2 = “*” & DTH(7).Cells(7, 3) & “*” ‘商品
h = DTH(7).Cells(4, 3) ‘MONTH
k = DTH(7).Cells(5, 3) ‘MONTH
str2にはDTH(7).Cells(7, 3)、ワークシート「集計」C7セルのテキストを代入します。
str2には商品、“*” &… & “*” を利用して商品先名称の一部で抽出できるようにしています。
kにはDTH(7).Cells(5, 3)、ワークシート「集計」C5セルのテキストを代入します。
kには集計末月を代入します。
集計表データの抽出と書き込み
Do While…Loop
Dim f As Integer
f = 11
Do While h <= k
DTH(7).Cells(f, 1) = h
(中略)
h = h + 1
f = f + 1
DTH(7).Cells(f, 2) = ans(1)
DTH(7).Cells(f, 3) = ans(2)
Loop
Do While…Loopを使って集計表の書き込み位置と、後述する集計月のカウントを行っています。
hには集計開始月、kには集計末月が入り、hに1を足していってkと同じになるまでLoopします。
h <= kとしていますが、h = kでもOKです。
集計関数
With Application.WorksheetFunction
Dim ans(1 To 2) As Long
ans(1) = .SumIfs(DTH(3), DTH(2), h, DTH(5), str1, DTH(6), str2)
ans(2) = .SumIfs(DTH(4), DTH(2), h, DTH(5), str1, DTH(6), str2)
End With
With句
Application.WorksheetFunction .SumIfs
ans(1) = .SumIfs(DTH(3), DTH(2), h, DTH(5), str1, DTH(6), str2)
ans(2) = .SumIfs(DTH(4), DTH(2), h, DTH(5), str1, DTH(6), str2)
上記2行の違いは、DTH(3)は数量、DTH(4)は金額です。以下の「DTH(2),h, DTH(5), str1, DTH(6), str2」の句は、DTH(2)は仕入月、hは抽出月、DTH(5)は仕入先str1は抽出したい仕入先名称の一部、DTH(6)は商品名、str2は抽出したい商品名称の一部です。
DTH(7).Cells(f, 2) = ans(1)
DTH(7).Cells(f, 3) = ans(2)
DTH(7).Cells(10, 2) = “仕入数量”
DTH(7).Cells(10, 3) = “仕入金額”
翌年の1月作成
h = h + 1
f = f + 1
If Right(h, 2) > 12 Then ’12月の次は翌年の1月作成
h = h + 88
End If
後処理
‘前のデータが残っていたら一行ずつ消去
Do While DTH(7).Cells(f, 1) <> “”
DTH(7).Cells(f, 1) = “”
DTH(7).Cells(f, 2) = “”
DTH(7).Cells(f, 3) = “”
DTH(7).Cells(f, 4) = “”
f = f + 1
Loop
グラフの作成
‘グラフタイトルの作成
With ActiveSheet.ChartObjects(1).Chart.ChartTitle
.Text = “仕入集計 ” & DTH(7).Cells(4, 3) & “-” & DTH(7).Cells(5, 3) & ” ” & DTH(7).Cells(6, 3) & ” ” & DTH(7).Cells(7, 3)
.Font.Size = 14 ‘文字サイズ
End With
‘グラフの作成
On Error GoTo jump2
ActiveSheet.ChartObjects(1).Delete‘前のグラフを消去
jump2:
初回グラフの無い状態ではエラーが発生します。
そのためOn Error GoTo jump2を設定しjump2:まで処理をジャンプします。
Range(“A10”).Select ‘集計データを選択
ActiveSheet.Shapes.AddChart2.Select ‘グラフを挿入
ActiveChart.ChartType = xlLine ‘「折れ線」
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
.AxisGroup = 2 ‘第2軸にする
.ChartType = xlColumnClustered ‘barに変更する
End With
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
.AxisGroup = 2 ‘第2軸にする
.ChartType = xlColumnClustered ‘barに変更する
End With
‘グラフタイトルの作成
With ActiveSheet.ChartObjects(1).Chart.ChartTitle
.Text = “仕入集計 ” & DTH(7).Cells(4, 3) & “-” & DTH(7).Cells(5, 3) & ” ” & DTH(7).Cells(6, 3) & ” ” & DTH(7).Cells(7, 3)
.Font.Size = 14 ‘文字サイズ
End With
Range(“B3”).Select
グラフ作成のmoduleはマクロの記録を使用して、必要な項目を変更することが良いと思います。
以上で仕入管理は終了です。
システムの構造は入力フォーム、マスタテーブル、実績記録用のテーブル、注文書などの帳票作成、集計とグラフです。
これらの仕組みは仕入管理に限らず応用が可能です。工夫してみてください。
わかりにくいところがあればお問い合わせください。
できる限り回答申し上げます。
この後の予定は経費申請システムです。基本構造は同じです。どのように応用していくか、ご確認ください。