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

vbajikyukeisaneyecatch002

エクセルVBAで時給の計算を行う、その2です。

個人別の時給計算表を自動で生成するコード作成です。

複数人、複数月に対応、今回は複数人対応として個人名時給計算表ファイルを自動で作ります。

エクセルVBAで作る時給計算表の作成記事のの2回目です。

この記事では、個人別の計算表を自動的に生成するプログラムコードを作成します。

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

時給計算に関連する記事の一覧

「時給計算」の記事一覧を開く

無料ソフトダウンロード
この時給計算表エクセルソフトの無料のダウンロードは、

無料DL!時給計算表エクセルソフト 個人別ブックで管理出来ます。

の記事で行うことが出来ます。

個人別時給計算表 自動作成の全体像

時給を計算するためには、個人別に計算表を纏めなければなりません。

テンプレートなどを人数分複数枚コピーして使用するわけですが、今回は

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

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

作成サンプル

対象者「はなちゃん」で時給計算表を複製しました。こちらを永続的に使用します。

vbajikyuhyoupho006

元の「時給計算表.xlsm」はテンプレートファイルという位置づけです。

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

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

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

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

この記事で作成するコード内容

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

vbajikyuhyoupho001

矢印下001

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

vbajikyuhyoupho003

矢印下001

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

vbajikyuhyoupho004

矢印下001

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

vbajikyuhyoupho005

1で同じ名前で作ろうとした場合

vbajikyuhyoupho027

矢印下001

◎「はい」ボタンで、生成を終了します。

「いいえ」ボタンを押すと、ファイル名に日付(年月日)付きで保存します。

vbajikyuhyoupho029

vbajikyuhyoupho030

◎「キャンセル」ボタンを押すと、メッセージボックスで「終了します。」、「OK」ボタンで終了です。

vbajikyuhyoupho030

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

それではVBAコードを組み立てて行きます。

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

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

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

MEMO

変数宣言の方法についてはこちらを参考にしてください。

変数の宣言方法で適用範囲をコントロールするVBA記述

Format関数の使い方についてはこの記事を参考にしてください。

Format関数を書式設定のテッパン関数にする!実務での書式と重要5例

宣言セクションコード
Option Explicit

Public EmpName As String, 年月日 As String
Public OriBName As String
Public TCos, TwCos, TMal, KMal
Public SD As Date, ED As Date
Dim SaName As String, SaNamea As String
設定値代入コード
Sub 設定値代入()

Dim MB As Long
Worksheets("初期設定項目").Select
'Format,Year,Month関数を利用します
    年月日 = Format(Date, "yymmdd")

'会計期間をセット
    SD = Worksheets("初期設定項目").Range("D5").Value
    ED = Worksheets("初期設定項目").Range("F5").Value

'対象者名を変数に代入します
    EmpName = Worksheets("初期設定項目").Range("C6").Value
    
    If EmpName = "" Then
        EmpName = 年月日
        Range("C6") = 年月日
    End If

'基本時給をセット
    TCos = Worksheets("初期設定項目").Range("C7").Value
'時間外割増率をセット
    TwCos = Worksheets("初期設定項目").Range("F7").Value / 100
'時間マルメをセット
    TMal = Worksheets("初期設定項目").Range("C8").Value
'金額マルメをセット
    KMal = Worksheets("初期設定項目").Range("C9").Value

End Sub

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

計算表自動作成コードを組み立てる

計算表自動生成コード

プロシージャー名を「対象者用時間計算作成」とします。

少々長いコードになっています。

ポイントーーーー①

保存用のフォルダ「計算メンバー」が存在しているかどうかを、「Dir」関数で調べ、無ければ「MkDir」ステートメントで作成します。

ポイントーーーー②

「ChDir」ステートメントでディレクトリを変更します。

MEMO

ChDirの使い方についてはこちらの記事が参考になります。

カレントフォルダを簡単に変更できるChDirステートメントの使い方

ポイントーーーー③

「Dir」関数で同名のファイルが存在するかを調べます。ある場合と無い場合の条件文器をしています。

MEMO

メッセージボックスについてはこの記事を参考にできます。

メッセージボックス MsgBox実際の使い方を最速に理解

Dir関数についてはこちらです。

エクセルVBA 要らないファイルを自動削除するコードの作り方

ポイントーーーー④

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

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

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

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

MEMO

InStr関数、InStrRev関数の使い方についてはこちらの記事を参考にしてください。

Instr関数・InstrRev関数は文字列を検索する。ファイルパス取得に威力

Mid関数、Right関数、Left関数についてはこちらを参考にしてください。

Mid関数・Right関数・Left関数は文字列操作の基本。使用例で解説します

Callステートメントについてはこちらを参考にしてください。

Callステートメントはプロシージャーの部品化に必須項目 エクセルVBA最速理解

対象者用時間計算作成
Sub 対象者用時間計算作成()

Dim ThisName As String, NewDir As String
Dim MojiCoA As Integer
Dim Wb As Workbook
Dim res As Boolean
Dim MBsa As Long, MBtn As Long

Call 設定値代入

'拡張子なしのファイル名を取得します
    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 "ファイルを保存しました。"

Else

'------存在する場合メッセージボックスで判断分岐をします。ファイル保存の場合は別名とします    
    MBtn = MsgBox("ファイルは既に存在します。" & vbCrLf & "終了しますか?", _
           vbYesNoCancel + vbExclamation, "保存問合せ")
    
        If MBtn = vbYes Then
            Exit Sub
        
        ElseIf MBtn = vbNo Then
            MsgBox "日付付きで保存します。"
            ThisWorkbook.SaveAs (SaNamea)
            
        ElseIf MBtn = vbCancel Then
            MsgBox "終了します。"
            Exit Sub
            
        End If
    
End If

'対象者名をファイル名と一致させるためのマーカーを作りますーーーー④
With Worksheets("初期設定項目").Range("H5")
    .Value = Worksheets("初期設定項目").Range("C6")
'-------文字色を白にして目立たないようにする
    .Font.ColorIndex = 2
End With

 Call 計算Bookコマンド削除
    
End Sub

対象者計算Book作成ボタン削除

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

MEMO

「For Each~Next」の使い方についてはこちらの記事を参考にしてください。

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

コマンドボタン削除
Sub 計算Bookコマンド削除()

Dim CommButton As Object

OriBName = "時給計算表.xlsm"

'テンプレートファイルであれば終了します
If ThisWorkbook.Name = OriBName Then

    Exit Sub
    
Else

    For Each CommButton In Worksheets("初期設定項目").Shapes

'「対象者計算Book作成」ボタンだけを削除します
        If CommButton.Name = "対象者計算Book作成" Then
            Worksheets("初期設定項目").Shapes(CommButton.Name).Delete
            Exit Sub
        End If

    Next

End If

End Sub

Bookを保存して終了する

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

コード
Sub ブックを保存()

Dim OpBook As Workbook

For Each OpBook In Workbooks
    
    OpBook.Save
                
Next

'エクセルを終了します
 Application.Quit
 
End Sub

エクセルVBA時給の計算その2のまとめ

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

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

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

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

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

次の記事で説明する項目ですが、先に軽く少し説明をしますと、

対象者変更を試すと

対象者「なっちゃん」で個人別時給計算表を作成しました。

vbajikyuhyoupho023

矢印下001

個人別時給計算表を作成後、対象者を「やまちゃん」に変更しようとしました。

ファイル名は「時給計算表-なっちゃん,xlsm」です。(「時給計算表-やまちゃん,xlsm」とファイル名を変更しても、対象者をやまちゃんに転用することはできません。<偽造防止>)

vbajikyuhyoupho024

矢印下001

作業を進めるために、「テンプレート作成」ボタンをクリックしました。

するとメッセージボックスで「対象者1人に対して1ブックです。」とメッセージが現れます。

vbajikyuhyoupho025

矢印下001

メッセージボックスの「OK」ボタンを押すと、対象者が「なっちゃん」に修正回復されました。

vbajikyuhyoupho026

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

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

けれども、

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

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

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

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

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

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

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

ハッキリ言って、

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

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

このサイトでよく使うVBAのコードのトピックを纏めています。

「VBA最速理解」の記事一覧を開く

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

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