時給計算表シートを期間毎に名付け保存するVBA

vbajikyukeisaneyecatch007

時給計算表シートを期間毎に、シート追加で別名シートとして保存します。
シート名を、会計年月での自動名付けやカスタム名で指定することが出来ます。

複数枚の複製保存にも対応します。

こんにちは、じゅんぱ店長(@junpa33)です。

今回は、期間締めをした対象者時給計算表テンプレートシートを保存するためのVBAコードについてです。

たとえば、会計期間を締めて給与支払が終了した後などに行う作業になります。

シートを保存する方法としては、そのシートを別名にして新規シートとして追加していきます。

どのようなシート名にするか、同名のシートがある場合の処理などの課題を解決していきます。

時給計算表作成の記事編成

対象者時給計算表テンプレートシートの保存シート名

vbajikyuhyotaisyouhozonp006

保存だけであれば別名シート一枚でも良いかもしれませんが、データ利用のための複製を用途として考慮すると、別名シート1枚だけでは済まないことも多いでしょう。

一概に保存と言っても、シート複製も考慮した形でのシート複数保存の方法を設計する必要があります。

シート保存名ステップ1

期間締めした「対象者時給計算表テンプレートシート」を初めて保存する場合

対象者時給計算表テンプレートを期間締めした後は、別に年月名でシートを作りそちらに保存します。単にデータ保存用途であればこれでOKでしょう。

年月名シートで保存した後は、元の時給計算表は、データをクリアして翌月の使用の準備をします。

vbajikyuhyotaisyouhozonp001

シート保存名ステップ2

同じ内容の「対象者時給計算表テンプレートシート」を再度(2回目)保存する場合

同じテンプレートシートを再度保存する場合は、保存(複製)日をシート名に付けて保存します。

vbajikyuhyotaisyouhozonp002

シート保存名ステップ3

パターン2で保存(複製)した後、同日に更に複製を行う場合

同じ日に、ステップ2レベルの保存後に更にもう一度、保存を行なう場合になります。

複製日付の後に「()カッコ」で複製番号が付いていきます。複製番号は「2,3,4,・・・」と増えていきます。

複製日が変われば、その複製日の複製番号になります。

vbajikyuhyotaisyouhozonp003

シート保存名ステップ4

自動ではなく独自シート名で保存することが出来ます。

「初期設定項目」シートの「計算シートをカスタム名で保存」チェックボックスがマークされている場合は、自動のシート名ではなく、利用者がシート名を付けて保存することが出来ます。

(同名シート対策はしていませんので、唯一名称で指定してください)

vbajikyuhyotaisyouhozonp004a

対象者時給計算表テンプレートシートを別名保存するVBA

vbajikyuhyotaisyouhozonp007

それでは自動保存のVBAコードを組み立てて行きます。

これからのVBAコードは、「Module3」に記述していきます。

パブリック変数と代入のプロシージャー

その前に、いつものパブリック変数と代入のプロシージャーを確認しておきます。

VBA
Option Explicit

    Public EmpName As String, 年月日 As String
    Public OriBName As String
    Public TCos, TwCos, TMal, KMal
    Public SD, ED As Variant
    Public KShH As Boolean
    Dim SaName As String, SaNamea As String
VBA
Sub 設定値代入()
    Dim MB As Long
        Worksheets("初期設定項目").Select
'会計期間をセット
        Range("D5", "F5").NumberFormatLocal = "dd"
STEP0:
        If Range("D5") = "" Then
            MsgBox "会計期間が未入力です。" & vbCrLf & "入力してください。" _
                        , vbExclamation, "時給計算表作成"
STOP1:
            On Error Resume Next
            SD = Application.InputBox("開始日を入力してください。", _
                        Title:="時給計算表作成", Type:=2)
            On Error GoTo 0
            If SD = False Then
                MsgBox "日付未入力ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP1
            ElseIf SD = "" Then
                MsgBox "日付未入力ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP1
            ElseIf SD < 1 Or SD > 31 Then
                MsgBox "異常値ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP1
            Else
                With Worksheets("初期設定項目")
                    .Range("D5").Value = SD
                End With
            End If
        ElseIf Range("D5") < 1 Or Range("D5") > 31 Then
            MsgBox "異常値ではテンプレート作成出来ません。", _
                        vbExclamation, "時給計算表作成"
            Range("D5") = ""
            GoTo STEP0:
        Else
            With Worksheets("初期設定項目")
                .Range("D5").Value = SD
            End With
        End If
STEP2:
        If Range("F5") = "" Then
            MsgBox "会計期間が未入力です。" & vbCrLf & "入力してください。" _
                        , vbExclamation, "時給計算表作成"
STOP3:
            On Error Resume Next
            ED = Application.InputBox("開始日を入力してください。", _
                        Title:="時給計算表作成", Type:=2)
            On Error GoTo 0
            If ED = False Then
                MsgBox "日付未入力ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP3
            ElseIf ED = "" Then
                MsgBox "日付未入力ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP3
            ElseIf ED < 1 Or ED > 31 Then
                MsgBox "異常値ではテンプレート作成出来ません。", _
                            vbExclamation, "時給計算表作成"
                GoTo STOP3
            Else
                With Worksheets("初期設定項目")
                    .Range("F5").Value = ED
                End With
            End If
        ElseIf Range("F5") < 1 Or Range("F5") > 31 Then
            MsgBox "異常値ではテンプレート作成出来ません。", _
                        vbExclamation, "時給計算表作成"
            Range("F5") = ""
            GoTo STEP2:
        Else
            With Worksheets("初期設定項目")
                .Range("F5").Value = ED
            End With
        End If
        With Worksheets("初期設定項目")
            SD = .Range("D5").Value
            ED = .Range("F5").Value
        End With
'対象者名を変数に代入します
        EmpName = Worksheets("初期設定項目").Range("C6").Value
'基本時給をセット
        TCos = Worksheets("初期設定項目").Range("C7").Value
'時間外割増率をセット
        TwCos = Worksheets("初期設定項目").Range("F7").Value / 100
'時間マルメをセット
        TMal = Worksheets("初期設定項目").Range("C8").Value
'金額マルメをセット
        KMal = Worksheets("初期設定項目").Range("C9").Value
'計算シートの保存法を取得
        KShH = Worksheets("初期設定項目").Range("E10").Value
End Sub

これはすでにModule1で記述しているコードです。

今回も再度記述する必要はありません。

シートを保存するVBA全コード

VBA
Option Explicit

Dim MoShN As String

Sub シート保存()
    Dim StD, StM, StY, SMH As Date
    Dim MoSh As Worksheet
    Dim Sh As Worksheet
    Dim res As Boolean
    Dim StpNom As Integer
    Dim n, MsgA, MsgB As Integer
    Dim MoShND As String
    Dim CusName As Variant
        Call Module1.設定値代入
        res = False
'テンプレートシートが準備されているかを調べる
        For Each Sh In ThisWorkbook.Worksheets
            If Sh.Name = EmpName & "時給計算表" Then
                res = True
                Worksheets(EmpName & "時給計算表").Select
                Exit For
            End If
        Next
            If res = False Then
                MsgBox "まだ何も設定されていません。", vbExclamation, _
                            "時給計算表作成"
                Exit Sub
            End If
'テンプレートにデータ入力されているか
        If Range("B3") = "" Then Exit Sub
'時給計算表の書き出し日付を調べます
        With Worksheets(EmpName & "時給計算表")
            StD = Day(.Range("B3"))
            StM = Month(.Range("B3"))
            StY = Year(.Range("B3"))
        End With
'書き出し日付と会計期間(日)の対比をします
        If StD >= SD And StD <= ED Then
            SMH = StM
        ElseIf StD < SD And StD < ED Then
            SMH = StM
        ElseIf StD >= SD And StD >= ED Then
            SMH = StM + 1
        Else
            MsgBox "会計期間(日)設定をチェックしてください。"
        End If
        Worksheets(EmpName & "時給計算表").Select
'計算シートのカスタム保存チェックマークがOFF
        If KShH = False Then
            MsgBox "プログラムの設定ルールで自動保存します。", _
                        vbInformation, "時給計算表作成"
STEP_B:
            If SMH = 13 Then
                SMH = 1
                StY = StY + 1
            End If
'データ型を変更します(整数型に変更)
            MoShN = CInt(StY) & "-" & CInt(SMH)
            Worksheets(EmpName & "時給計算表").Copy _
                        after:=Worksheets(Worksheets.Count)
'保存シート名の最適を決定する
            MoShND = MoShN & "@" & Format(Date, "yyMMDD") & "("
            n = 2
            For Each MoSh In ThisWorkbook.Worksheets
    'ステップ3
                If MoSh.Name Like MoShND & "*" Then
                    StpNom = 3
                    n = n + 1
    'ステップ2
                ElseIf MoSh.Name = MoShN & "@" & _
                                Format(Date, "yyMMDD") Then
                    If StpNom < 2 Then
                        StpNom = 2
                    End If
    'ステップ1
                ElseIf MoSh.Name = MoShN Then
                    If StpNom < 1 Then
                        StpNom = 1
                    End If
                Else
                    If StpNom < 0 Then
                        StpNom = 0
                    End If
                End If
            Next MoSh
'シート名を付ける
            If StpNom = 0 Then
                ActiveSheet.Name = MoShN
            ElseIf StpNom = 1 Then
                ActiveSheet.Name = MoShN & "@" & _
                                    Format(Date, "yyMMDD")
            ElseIf StpNom = 2 Or StpNom = 3 Then
                ActiveSheet.Name = MoShND & n & ")"
            End If
            Exit Sub
'計算シートのカスタム保存チェックマークがON
        ElseIf KShH = True Then
'カスタムでシート名を付けるかを確認する
            MsgA = MsgBox("保存するシート名をカスタムします。" _
                & vbCrLf & "保存名を指定しますか?", vbYesNo + _
                vbExclamation, "時給計算表作成")
            If MsgA = vbNo Then
                MsgBox "シートの保存名をカスタムしません。" & _
                    vbCrLf & "自動保存に移行します。", vbInformation, _
                    "時給計算表作成"
                GoTo STEP_B
            ElseIf MsgA = vbYes Then
STEP_C:
    'ステップ4
                MsgBox "表示する入力ボックスでシート名を" & _
                "指定してください。", vbInformation, "時給計算表作成"
'入力ボックスを表示しシート名を入力する
                CusName = Application.InputBox _
                ("シート名を入力してください。", _
                            Title:="時給計算表作成", Type:=2)
'シート名が入力されない場合の処理コード
                If CusName = "" Or CusName = False Then
                    MsgB = MsgBox("カスタム名でのシート保存を" & _
                        "中止しますか。", vbYesNo + vbExclamation, _
                        "時給計算表作成")
                    If MsgB = vbYes Then
                        MsgBox "シートの保存名をカスタムしません。" _
                            & vbCrLf & "自動保存に移行します。", _
                            vbInformation, "時給計算表作成"
                        GoTo STEP_B
                    Else
                        GoTo STEP_C
                    End If
                End If
                Worksheets(EmpName & "時給計算表").Copy _
                            after:=Worksheets(Worksheets.Count)
                ActiveSheet.Name = CusName
            End If
        End If
End Sub

シートを保存するVBA ポイント説明

宣言セクションで変数を宣言

このモジュールで使用する変数で、このモジュールでのみ有効です。

変数MoShNは、保存する年月名に対応する変数です。

Option Explicit

Dim MoShN As String

vbaopexplieyecatch Option Explicitとは何、必要? VBA記述で不注意なエラーを防止する

プロシージャーで使用する変数宣言

このプロシージャーで使用する変数を宣言しています。

変数StD 、StM、StYはセルB3の日付データから取り出した日、月、年です。

変数SMHは、月の会計期間から修正された会計月です。

変数StpNomは、別名保存するシート名のステップ番号です。

変数MoShNDは、別名保存のステップ3レベルのシート名が代入されます。

変数CusNameは入力ボックスで取得したシートのカスタム名です。

Sub シート保存()
    Dim StD, StM, StY, SMH As Date
    Dim MoSh As Worksheet
    Dim Sh As Worksheet
    Dim res As Boolean
    Dim StpNom As Integer
    Dim n, MsgA, MsgB As Integer
    Dim MoShND As String
    Dim CusName As Variant
        Call Module1.設定値代入
        res = False

vbacalleyecatch 部品化プロシージャーでCallステートメントは必須

会計期間に合わせた会計月を設定する

セルB3が空欄になっているとプロシージャーが終了します。日付のデータが入力されていることが必須です。

初期設定項目で入力されている会計期間情報から、時給計算表の記入日付(セルB3)が会計月の何月になるかを判断します。

パターン分類
  • パターン1
    会計期間1日から30日の場合は、セルB3の記入月がそのまま会計月になります。
  • パターン2
    会計期間21日から20日の場合は、セルB3の記入日が5日であれば、記入月が会計月になります。
  • パターン3
    会計期間21日から20日の場合は、セルB3の記入日が25日であれば、記入月+1 が会計月になります。
  • パターン4
    その他の何かの場合です。
'時給計算表の書き出し日付を調べます
        With Worksheets(EmpName & "時給計算表")
            StD = Day(.Range("B3"))
            StM = Month(.Range("B3"))
            StY = Year(.Range("B3"))
        End With
'書き出し日付と会計期間(日)の対比をします
        If StD >= SD And StD <= ED Then
            SMH = StM
        ElseIf StD < SD And StD < ED Then
            SMH = StM
        ElseIf StD >= SD And StD >= ED Then
            SMH = StM + 1
        Else
            MsgBox "会計期間(日)設定をチェックしてください。"
        End If
        Worksheets(EmpName & "時給計算表").Select
'計算シートのカスタム保存チェックマークがOFF
        If KShH = False Then
            MsgBox "プログラムの設定ルールで自動保存します。", _
                        vbInformation, "時給計算表作成"
STEP_B:
            If SMH = 13 Then
                SMH = 1
                StY = StY + 1
            End If
'データ型を変更します(整数型に変更)
            MoShN = CInt(StY) & "-" & CInt(SMH)
            Worksheets(EmpName & "時給計算表").Copy _
                        after:=Worksheets(Worksheets.Count)

変数SMHが「13月」になった場合は「1月」に変更し変数StYを+1 します。

vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する vbaifjyokeneyecatch If条件文のVBAコードの組み方。条件の絞り方を最速理解 VBACopyeyecatch シートのコピーを最速に理解!VBAコードで異なる結果

シート保存ステップに合わせたシート名を自動選択する

シート名の自動名付けのステップ1から3の設定の部分になります。

個人別時給計算表エクセルブックにある全シート名を調べて適切なステップを調べて名付けを行います。

'保存シート名の最適を決定する
            MoShND = MoShN & "@" & Format(Date, "yyMMDD") & "("
            n = 2
            For Each MoSh In ThisWorkbook.Worksheets
    'ステップ3
                If MoSh.Name Like MoShND & "*" Then
                    StpNom = 3
                    n = n + 1
    'ステップ2
                ElseIf MoSh.Name = MoShN & "@" & _
                                Format(Date, "yyMMDD") Then
                    If StpNom < 2 Then
                        StpNom = 2
                    End If
    'ステップ1
                ElseIf MoSh.Name = MoShN Then
                    If StpNom < 1 Then
                        StpNom = 1
                    End If
                Else
                    If StpNom < 0 Then
                        StpNom = 0
                    End If
                End If
            Next MoSh
'シート名を付ける
            If StpNom = 0 Then
                ActiveSheet.Name = MoShN
            ElseIf StpNom = 1 Then
                ActiveSheet.Name = MoShN & "@" & _
                                    Format(Date, "yyMMDD")
            ElseIf StpNom = 2 Or StpNom = 3 Then
                ActiveSheet.Name = MoShND & n & ")"
            End If
            Exit Sub

VBAFormateyecatch Format関数は書式設定のテッパン関数!実務の書式と重要5例 vbadoloopeyecatch VBA 回数不定のループ処理はDo LoopとFor Each

カスタム名を入力ボックスから入力してシート保存

ステップ4です。

「初期設定項目」シートで、「計算シートをカスタム名で保存」チェックボックスがマークされている時に有効になります。

プロセスをキャンセルした場合やシート名を入力しなかった場合は、別名の自動名付けのシート保存に移行します。

同名のシート名付けを防止する回避コードは設定していません。

同名保存となる場合はエラーが発生しますので、入力名には重複にならないよう注意してください。

'計算シートのカスタム保存チェックマークがON
        ElseIf KShH = True Then
'カスタムでシート名を付けるかを確認する
            MsgA = MsgBox("保存するシート名をカスタムします。" _
                & vbCrLf & "保存名を指定しますか?", vbYesNo + _
                vbExclamation, "時給計算表作成")
            If MsgA = vbNo Then
                MsgBox "シートの保存名をカスタムしません。" & _
                    vbCrLf & "自動保存に移行します。", vbInformation, _
                    "時給計算表作成"
                GoTo STEP_B
            ElseIf MsgA = vbYes Then
STEP_C:
    'ステップ4
                MsgBox "表示する入力ボックスでシート名を" & _
                "指定してください。", vbInformation, "時給計算表作成"
'入力ボックスを表示しシート名を入力する
                CusName = Application.InputBox _
                ("シート名を入力してください。", _
                            Title:="時給計算表作成", Type:=2)
'シート名が入力されない場合の処理コード
                If CusName = "" Or CusName = False Then
                    MsgB = MsgBox("カスタム名でのシート保存を" & _
                        "中止しますか。", vbYesNo + vbExclamation, _
                        "時給計算表作成")
                    If MsgB = vbYes Then
                        MsgBox "シートの保存名をカスタムしません。" _
                            & vbCrLf & "自動保存に移行します。", _
                            vbInformation, "時給計算表作成"
                        GoTo STEP_B
                    Else
                        GoTo STEP_C
                    End If
                End If
                Worksheets(EmpName & "時給計算表").Copy _
                            after:=Worksheets(Worksheets.Count)
                ActiveSheet.Name = CusName
            End If
        End If

vbamsgboxeyecatch メッセージボックス MsgBox実際の使い方を最速に理解 vbainputboxeyecatch 2つのインプットボックス。関数とメソッド、特徴を生かした使い分け VBAGotoeyecatch001 Gotoステートメントでコードをジャンプ!毒と薬の2面性

まとめ

vbajikyuhyotaisyouhozonp008

会計期間別に保存することで対象者を個人別に、月別年別など期間別で、支給金額データを保存をすることが出来るようになります。

重複保存の場合にも対応できるようにしましたが、1会計月1シートにして管理することが良いでしょう。

重複した場合は内容をチェックして、出来るだけ1シートになるようにしておきましょう。

なお、当月保存後、翌月に勤務期間計算表を使用する時は、

「テンプレート作成」ボタンをクリックしデータの「消去確認」メッセージで「はい」をクリックすることで、

前月データをクリアしてください。

次回は、保存シートを印刷する場合のためのVBAコードを設定します。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min