個人別時給計算表を自動で作成するVBAの組み立て

vbajikyukeisaneyecatch002

エクセルVBAで時給計算を行います。

個別の時給計算表を自動生成するVBAを設計します。

複数の人数に対応でき、個人名付きの時給計算表エクセルブックを生成します。

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

今回のエクセルVBAで作る時給計算表作成は、個人別の時給計算表を自動的に生成するプログラムコードです。

各人の時給を計算するためには、個人別に計算表を纏める必要があります。

無地のエクセルテンプレートなどでは作成する人数分のコピー作らないといけません。

これから作成する「個人別の時給計算表」は、ボタンの1クリックで自動的に作成されるようにします。

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

個人別時給計算表の使い方

vbajikyuhyokojinbetup001

よく使われている方法では、テンプレートなどを人数分の複数枚コピーして使用されているでしょう。

でも、今回はそれをボタン一つで自動で、個人別のファイル(Book)を作成できるVBAコードを組み立てていきます。

生成されたファイルは、「計算メンバー」というフォルダを生成してその中に保存します。

個人別時給計算表の完成サンプル

対象者「あき」で時給計算表を複製しました。こちらを「あき」用として毎日続けて使っていきます。

vbajikyuhyosyokip006

元の「時給計算表.xlsm」は個人用テンプレートファイルを生み出す ” Mother ” という位置づけです。

対象者名でファイルが複製された後、一度「Bookを保存して終了」ボタンをクリックして、

既定のフォルダ「計算メンバー」にファイルが保存されていることを確認してください。

続けて別の人について行う場合も同様の操作で、

「時給計算表.xlsm」のテンプレートファイルを開いて、対象者名を入力し、同じことを繰り返してください。

個人別時給計算表の操作方法

1.最低「対象者名」項目を記入する必要があります。もし空欄であった場合は作成日「年月日」が挿入されます。

vbajikyuhyokojinbetup005
矢印下001

2.「対象者計算Book作成」ボタンをクリックすると、メッセージウインドウで「ファイルを保存しました。」と表示されます。

vbajikyuhyokojinbetup006
矢印下001

3.テンプレートファイルの「時給計算表.xlsm」と同じディレクトリに「計算メンバー」フォルダが生成されます。

vbajikyuhyokojinbetup007
矢印下001

4.「計算メンバー」フォルダの中に個人別時給計算表が作成されています。(「時給計算表-あき.xlsm」)

vbajikyuhyokojinbetup008
矢印下001

個人別時給計算表には、「対象者計算Book作成」ボタンが付いていません。

vbajikyuhyokojinbetup009

個人別時給計算表を自動で作成するVBA

vbajikyuhyokojinbetup002

では、前段で説明したように動作する個人別時給計算表のVBAコードを組み立てて行きます。

「module1」に記述していきます。

モジュールを跨いで有効な変数を確認しておく

先回に記事で宣言セクションで宣言した変数を確認しておきます。

VBA
Option Explicit

    Public EmpName As String, 年月日 As String
    Public OriBName As String
    Public TCos, TwCos, TMal, KMal
    Public SD As Date, ED As Variant
    Public KShH As Boolean
    Dim SaName As String, SaNamea As String
vbasengeneyecatch 宣言方法で変数の適用範囲を変える エクセルVBA vbamsgboxeyecatch メッセージボックス MsgBox実際の使い方を最速に理解 vbainputboxeyecatch 2つのインプットボックス。関数とメソッド、特徴を生かした使い分け VBAGotoeyecatch001 Gotoステートメントでコードをジャンプ!毒と薬の2面性 vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する
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
Sub 対象者用時間計算作成()
    Dim ThisName, NewDir As String
    Dim TSY As Variant
    Dim MojiCoA As Integer
    Dim Wb As Workbook
    Dim res As Boolean
    Dim MBn, MBsa, MBtn As Long
        Call Module1.設定値代入
'Format,Year,Month関数を利用します
        年月日 = Format(Date, "yymmdd")
'対象者が空欄の場合の処理
        If Worksheets("初期設定項目").Range("C6") = "" Then
            MBn = MsgBox("対象者名が空欄ですが続けますか?", _
                vbOKCancel + vbExclamation, "時給計算表作成")
            If MBn = 1 Then
                TSY = Application.InputBox("対象者名を入力してください。" _
                            , Title:="時給計算表作成", Type:=2)
                If TSY = False Then
                    MsgBox "空欄ではデータを区別できません。" & vbCrLf & _
                            "今日の年月日を代用します。", vbExclamation, _
                            "時給計算表作成"
                    TSY = 年月日
                End If
            Else
                MsgBox "空欄ではデータを区別できません。" & vbCrLf & _
                            "今日の年月日を代用します。", vbExclamation, _
                            "時給計算表作成"
                TSY = 年月日
            End If
            With Worksheets("初期設定項目").Range("C6")
                .Value = TSY
                EmpName = .Value
            End With
        End If
'拡張子なしのファイル名を取得します
        MojiCoA = InStrRev(ThisWorkbook.Name, ".")
        ThisName = Left(ThisWorkbook.Name, MojiCoA - 1)
        ThisWorkbook.Save
'保存場所と保存ファイル名を変数へ代入します
        NewDir = ThisWorkbook.Path & "\計算メンバー"
        SaName = ThisName & "-" & EmpName & ".xlsm"
        SaNamea = ThisName & "-" & EmpName & _
                    Format(Date, "yymmdd") & ".xlsm"
'保存フォルダが既にあるかどうかを調べます
    'フォルダが存在しなければ作成します
        If Dir(NewDir, vbDirectory) = "" Then
            MkDir NewDir
        End If
'ディレクトリを変更します
        ChDir NewDir
'保存したいファイルが既に存在するかを調べます
    '存在しない場合この名前でファイルを保存します
        If Dir(SaName, vbNormal) = "" Then
            ThisWorkbook.SaveAs (SaName)
            MsgBox "ファイルを保存しました。", vbInformation, _
                        "時給計算表作成"
    '存在する場合、終了するか続けるかを選択します。
        Else
            MBtn = MsgBox("ファイルは既に存在します。" & vbCrLf _
                        & "終了しますか?", _
                   vbYesNoCancel + vbExclamation, "時給計算表作成")
        '終了する
            If MBtn = vbYes Then
                Exit Sub
        '日付付きで別ファイルとして保存
            ElseIf MBtn = vbNo Then
                MsgBox "日付付きで保存します。", vbInformation, _
                            "時給計算表作成"
                ThisWorkbook.SaveAs (SaNamea)
            ElseIf MBtn = vbCancel Then
                MsgBox "終了します。", vbInformation, "時給計算表作成"
                Exit Sub
            End If
        End If
'対象者名をファイル名と一致させるためのマーカーをつくる
        With Worksheets("初期設定項目").Range("H5")
            .Value = Worksheets("初期設定項目").Range("C6")
            .Font.ColorIndex = 2
        End With
        Call Module1.計算Bookコマンド削除
End Sub
VBAFormateyecatch Format関数は書式設定のテッパン関数!実務の書式と重要5例

対象者が空欄時の処理

対象者欄が空欄の時は、メッセージを表示して「続ける(はい)」または「やめる(キャンセル)」を選択するようにしています。

vbamsgboxeyecatch メッセージボックス MsgBox実際の使い方を最速に理解 vbacalleyecatch 部品化プロシージャーでCallステートメントは必須

拡張子なしのファイル名を取得します

ファイルパスからファイル名を取り出します。

vbainsteeyecatch Instr関数・InstrRev関数は文字列を検索する。ファイルパス取得に威力 vbamideyecstch Mid関数・Right関数・Left関数は文字列中の文字を切り出す

保存場所と保存ファイル名を変数へ代入します

ファイル名に作業時の日時を使用するにはFormat関数を利用します。

VBAFormateyecatch Format関数は書式設定のテッパン関数!実務の書式と重要5例

保存フォルダが既にあるかどうかを調べます

保存用のフォルダ「計算メンバー」が存在しているかどうかを、「Dir」関数で調べます。(vbDirectoryを使用)

フォルダが存在しなければ作成します

無ければ「MkDir」ステートメントで作成します。

ディレクトリを変更します

vbachdireyecatch ChDirステートメントでカレントフォルダを簡単に変更する

保存したいファイルが既に存在するかを調べます

保存用のファイル名が存在しているかどうかを、「Dir」関数で調べます。(vbNormalを使用)

ある場合と無い場合の条件分岐でコードの実行内容を区別します。

‘存在しない場合この名前でファイルを保存します

vbanewbookeyecatch 新規ブック5つの保存法。AddとSaveAsの使い方がわかる

存在する場合、終了するか続けるかを選択します

  1. 終了する
  2. 日付付きで別ファイルとして保存する
  3. キャンセル 終了

対象者名をファイル名と一致させるためのマーカーをつくる

個人別時給計算表作成後に「対象者名」が変更された場合、ファイル名にある元の対象者名との違いが発生します。

その場合、「個人別計算表ファイル」というプログラムでVBAコード上でエラーが発生します。

その防止手法として、個人別ファイル作成時の「対象者名」を保存しています。そのマッチングで、

ファイル作成後の「対象者名」変更を不可にしています。

この不正改ざん防止のしくみは次回記事で紹介しています。

vbajikyukeisaneyecatch003 対象者時給計算表テンプレートシートを作成するVBA

計算Book作成ボタン削除プロシージャー

VBA
Sub 計算Bookコマンド削除()
    Dim CommButton As Object
        OriBName = "時給計算表.xlsm"
'テンプレートファイルであれば終了します
        If ThisWorkbook.Name = OriBName Then
            Exit Sub
        Else
'「対象者計算Book作成」ボタンだけを削除します
            For Each CommButton In Worksheets("初期設定項目").Shapes
                If CommButton.Name = "対象者計算Book作成" Then
                    Worksheets("初期設定項目").Shapes(CommButton.Name).Delete
                    Exit Sub
                End If
            Next
        End If
End Sub

自動生成でクリックした「対象者計算Book作成」ボタンは、生成した個人別計算表ファイルでは必要ないので、間違わないように削除しておきます。

vbadoloopeyecatch VBA 回数不定のループ処理はDo LoopとFor Each

ブックを保存プロシージャー

VBA
Sub ブックを保存()
    Dim OpBook As Workbook
        For Each OpBook In Workbooks
            OpBook.Save
        Next
'エクセルを終了します
        Application.Quit
End Sub

個人別計算表ファイルを生成したら一旦保存終了して、フォルダに確かに保存されているか確認しておきます。

まとめ

vbajikyuhyokojinbetup003

今まで、時給計算エクセルシートで計算をして、計算結果をそれぞれ個人別に、会計月別に別ファイルにコピペを行っていました。

非常に不便でした。コピペでミスったりもしました。

そういう経験から、手作業でコピペしなくて済む「エクセルVBA時給の計算ソフト」にバージョンアップすることにしました。

個人別に時給計算表を生成しますので、その作業を、必ず人数分行うようにしてください。

別人名で生成した時給計算表は、人名を替えて使うことが出来ないようになっています。

短期間でエクセルVBAの独学習得を目指したいなら

vbajikyuhyokojinbetup004

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

vbastudyeyecatch002 エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します

独習のための大切な7つのポイントは、上記記事にて解説しています。

独習によるVBA習得のキーワードは、出来るだけ多くの実例に触れること!です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

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

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

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

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

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

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

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

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

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min