時給計算表シートを期間毎に、シート追加で別名シートとして保存します。
シート名を、会計年月での自動名付けやカスタム名で指定することが出来ます。
複数枚の複製保存にも対応します。
こんにちは、じゅんぱ店長(@junpa33)です。
今回は、期間締めをした対象者時給計算表テンプレートシートを保存するためのVBAコードについてです。
たとえば、会計期間を締めて給与支払が終了した後などに行う作業になります。
シートを保存する方法としては、そのシートを別名にして新規シートとして追加していきます。
どのようなシート名にするか、同名のシートがある場合の処理などの課題を解決していきます。
時給計算表作成の記事編成
- 時給計算表作成エクセルソフトの使い方とダウンロード
コンテンツ
対象者時給計算表テンプレートシートの保存シート名
保存だけであれば別名シート一枚でも良いかもしれませんが、データ利用のための複製を用途として考慮すると、別名シート1枚だけでは済まないことも多いでしょう。
一概に保存と言っても、シート複製も考慮した形でのシート複数保存の方法を設計する必要があります。
期間締めした「対象者時給計算表テンプレートシート」を初めて保存する場合
対象者時給計算表テンプレートを期間締めした後は、別に年月名でシートを作りそちらに保存します。単にデータ保存用途であればこれでOKでしょう。
年月名シートで保存した後は、元の時給計算表は、データをクリアして翌月の使用の準備をします。
同じ内容の「対象者時給計算表テンプレートシート」を再度(2回目)保存する場合
同じテンプレートシートを再度保存する場合は、保存(複製)日をシート名に付けて保存します。
パターン2で保存(複製)した後、同日に更に複製を行う場合
同じ日に、ステップ2レベルの保存後に更にもう一度、保存を行なう場合になります。
複製日付の後に「()カッコ」で複製番号が付いていきます。複製番号は「2,3,4,・・・」と増えていきます。
複製日が変われば、その複製日の複製番号になります。
自動ではなく独自シート名で保存することが出来ます。
「初期設定項目」シートの「計算シートをカスタム名で保存」チェックボックスがマークされている場合は、自動のシート名ではなく、利用者がシート名を付けて保存することが出来ます。
(同名シート対策はしていませんので、唯一名称で指定してください)
対象者時給計算表テンプレートシートを別名保存するVBA
それでは自動保存のVBAコードを組み立てて行きます。
これからのVBAコードは、「Module3」に記述していきます。
パブリック変数と代入のプロシージャー
その前に、いつものパブリック変数と代入のプロシージャーを確認しておきます。
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
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全コード
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
このプロシージャーで使用する変数を宣言しています。
変数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
セル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 します。
With~End Withの使い方。VBAコードを簡潔に記述する If条件文のVBAコードの組み方。条件の絞り方を最速理解 シートのコピーを最速に理解!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
ステップ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
まとめ
会計期間別に保存することで対象者を個人別に、月別年別など期間別で、支給金額データを保存をすることが出来るようになります。
重複保存の場合にも対応できるようにしましたが、1会計月1シートにして管理することが良いでしょう。
重複した場合は内容をチェックして、出来るだけ1シートになるようにしておきましょう。
なお、当月保存後、翌月に勤務期間計算表を使用する時は、
「テンプレート作成」ボタンをクリックしデータの「消去確認」メッセージで「はい」をクリックすることで、
前月データをクリアしてください。
次回は、保存シートを印刷する場合のためのVBAコードを設定します。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。