既に以前月次更新の回はやっていますが今回は定数(Const)などを使用してもう少しだけ上のものを作ってみましょう。
表の入力箇所を定数に入れる
まずは表の売上等を入力する箇所の始まりと終わりを定数に入れましょう。
そもそもこれは不変の数字になるのですが、この規模だとわざわざ入れる必要がない気もしますが、ちゃんとした命名をした定数を設置しておくと長いコードになった時も単純に数字が書いてあるのと定数が置いてあるのとでは可読性に大きく違いが出てきます。
Sub next_month()
Const startRow As Integer = 3 '入力箇所始まりRow
Const endRow As Integer = 33 '入力箇所終わりRow
Const startCol As Integer = 7 '入力箇所始まりColumn
Const endCol As Integer = 8 '入力箇所終わりColumn
End Sub
※画像のendColは9になってますが、やっぱり8でした…
シート名を変数に格納
これは前回やったシートをコピーした後にシート名を変更する為等に使用して行こうと思います。
まずはシート名をString型の変数に格納して日付に変換して翌月のシート名と翌月分のシートのCells(2,3)、Cells(3,3)の年と月に使用していこうかと思います。
Sub next_month()
Const startRow As Integer = 3 '入力箇所始まりRow
Const endRow As Integer = 33 '入力箇所終わりRow
Const startCol As Integer = 7 '入力箇所始まりColumn
Const endCol As Integer = 8 '入力箇所終わりColumn
Dim sheetname As String
Dim nextsheet As Date
sheetname = ActiveSheet.Name
ActiveSheet.Copy after:=ActiveSheet
nextsheet = DateAdd("m", 1, Replace(sheetname, ".", "/") & "/1")
ActiveSheet.Name = Year(nextsheet) & "." & Month(nextsheet)
Cells(2, 3).Value = Year(nextsheet)
Cells(3, 3).Value = Month(nextsheet)
End Sub
今回新たに出てきたReplaceとは文字列置き換えの関数です。
引数1に文字列を与えます。
引数2に置き換えの対象となる文字列を与えます。
引数3で対象の文字列を何の文字列に置き換えるのかを指定します。
これでシート名にある「2017.11」という文字列が「2017/11」という文字列に置き換わったわけですね。そこに「/1」を繋げる事により「2017/11/1」という日付を完成させているわけです。
必要最低限の計算式と書式設定は入れてあるのでこれで翌月のシートはほぼ完成しましたね。
ここまで出来たら最後に表と入力箇所をクリアして翌月作成完了のメッセージを表示させていきましょう。
後はボタンを作ればOKですかね。
一応前回からの入力と今回の翌月更新の全文を載せておきます。
Option Explicit
Sub next_month()
Const startRow As Integer = 3 '入力箇所始まりRow
Const endRow As Integer = 33 '入力箇所終わりRow
Const startCol As Integer = 7 '入力箇所始まりColumn
Const endCol As Integer = 8 '入力箇所終わりColumn
Dim sheetname As String '翌月更新前のシート名
Dim nextsheet As Date '翌月更新後のシートの日付
sheetname = ActiveSheet.Name
ActiveSheet.Copy after:=ActiveSheet
nextsheet = DateAdd("m", 1, Replace(sheetname, ".", "/") & "/1")
ActiveSheet.Name = Year(nextsheet) & "." & Month(nextsheet)
Cells(2, 3).Value = Year(nextsheet)
Cells(3, 3).Value = Month(nextsheet)
Range(Cells(startRow, startCol), Cells(endRow, endCol)).ClearContents
Range(Cells(2, 12), Cells(4, 12)).ClearContents
MsgBox "翌月作成完了"
End Sub
Sub input_sheet()
Const startRow As Integer = 2 '表の入力始まりRow
Const dateCol As Integer = 5 '表の日付Column
Const baseCol As Integer = 8 '表の売上Column
Dim i As Long 'カウンタ変数
Dim dates As Integer '日付
Dim stock As Long '仕入
Dim sales As Long '売上
'error trap -------------------------
If Cells(2, 12).Value = "" Or Not IsNumeric(Cells(2, 12).Value) Then
MsgBox "日付欄が空白、もしくは数値ではありません"
Exit Sub
End If
If Cells(4, 12).Value = "" Or Not IsNumeric(Cells(4, 12).Value) Then
MsgBox "売上欄が空白、もしくは数値ではありません"
Exit Sub
End If
'vaiable set ------------------------
dates = Cells(2, 12).Value
stock = Cells(3, 12).Value
sales = Cells(4, 12).Value
'row get and input ------------------
i = Cells(Rows.Count, dateCol).End(xlUp).Row
Do
If IsDate(Cells(i, dateCol)) And Not Cells(i, dateCol).Value Like "" Then
If CInt(Day(Cells(i, dateCol))) = dates Then
With Cells(i, baseCol)
.Value = sales
.Offset(0, -1).Value = stock
Exit Do
End With
End If
End If
i = i - 1
If i < startRow Then
MsgBox "対象の日付が見つかりませんでした"
Exit Sub
End If
Loop
MsgBox dates & "日の売上データ入力完了"
End Sub
という事で翌月作成が出来ました。
次回からは1次元の配列についてお勉強していこうかと思います。




