シートに値を入力
では、ここまでお勉強してきた内容をふんだんに使ってシートの月次更新をしていきましょう。
前段階として下図の様にK列とL列に実際に入れ込む値を入力する箇所を作成しておきましょう。
L列の入力箇所に入力されている値を「入力ボタン」が押されたら表に入力されるものを作成していきます。
粗利は「売上 - 仕入」尚且つ仕入がない日もあると思うので予め「 =IF(H3<>””,H3-G3,””) 」のような計算式を入れておきましょう。
基本ルールを考えよう
まずは、シートの中で「ここはこれに使う」「ここはこういうルールで入力する」というようなルールを考えてみましょう。
- 日付は「日」のみ。整数で入力。入力必須
- 仕入は入力がない場合は0として考える
- 売上は入力必須
- 表の日付は必ずE列(Column5)
- 表の実績が入力されている行の始まりは必ず3行目(Row3)
- 売上はH列(Column8)。その左(offset(0,-1))が仕入
ひとまずこんな感じでしょうか。これらを踏まえてまずは変数・定数を作成していきましょう。
ひとまずはこんな所でしょうか。僕も今実際に作りながら更新していますので足りなければ後で変数は足していきますw
エラートラップを仕掛けよう
エラートラップとは必ず入力していなければいけない所に入力がなかったり、入力形式が違ったりした時にエラーとして認識させるものになります。
例えば上の例で行くと、売り上げと日付は必ず入力されていなければいけない上に整数ではなくてはなりません。
ひとまずその部分を踏まえてエラートラップを仕掛けてみましょう。
整数かどうかの判別には「IsNumeric」を使用していきます。これは引数として与えられたものが数値なのかどうかを判断してTrueかFalseで返してくれる関数になります。
では実際にやってみましょう。
Sub next_month() Const startCol As Integer = 2 '表の入力始まりRow Const dateCol As Integer = 5 '表の日付Column Const baseCol As Integer = 8 '表の売上Column Dim i 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 End Sub
これでひとまず日付欄と売上欄が空白か数値ではなかった場合のエラー(デバッグ)は回避出来ていますね。
エラーが回避出来たら変数にセット
変数のセットは簡単ですね。
入力行の判別と入力
Sub next_month() 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 Integer '仕入 Dim sales As Integer '売上 '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
まずは一番最初の定数「startCol」ですが、コメントでRowと言っているのにColという名前を付けてしまったので訂正してますw すいません。
後は、表の最終行を取得しつつDo Loopで上に上がりながら対象の日付を探しています。
まずは日付が入力されている列には空白や普通の文字列も存在するので「IsDate」関数で日付かどうかを判別しています(IsNumericの日付版です)。
その列に入力されている値はあくまでも日付なのでDay関数で「日」の部分だけを頂きつつ「CInt」関数で整数に直しつつ変数datesと比較して合致したら実際に入力しております。
入力が終わったらDo Loopに用はないので抜けてしまいます。
最後まで駆け抜けたらエラートラップを抜けてきたという事なのでメッセージボックスで「入力完了」と表示させています。
こんな所でしょうか?
今回ちょろっと初めて触れる関数が出てきていますが、ここまで一緒にやって頂いた方なら理解できると思います。
ちょっと…な方はTwitterからDMでも送って頂ければお答えいたしますのでお願いします。
今回でひとまず入力は終わったので次回は月次更新を行っていきましょう。