Option Explicit '申告による社員保険料 '小規模企業共済等掛金 '生命保険料 '損害保険料 '住宅取得等特別控除額 Private mobjWS() As Worksheet 'ワークシート 'mobjWS(0):Sheet8:保険料控除等データ 'mobjWS(1):Sheet2:社員情報 Private mlngRow As Long 'レコード 'クリアボタン Private Sub cmdClear_Click() '初期値 Call NewData '社員リスト Call GetSyainList End Sub '閉じるボタン Private Sub cmdEND_Click() Unload Me End Sub '登録ボタン Private Sub cmdOK_Click() Dim objText As MSForms.TextBox 'テキストボックス Dim lngFID As Long '社員ID Dim intMsg As Integer 'メッセージ Dim i As Integer '整数型カウンタ intMsg = MsgBox("登録しますか。", 32 + 4, "給与計算システム") If intMsg = 6 Then lngFID = Me.lstSyain.List(Me.lstSyain.ListIndex, 0) 'NULL値の回避 For i = 1 To 5 Set objText = Controls("txtKingaku" & CStr(i)) If objText.Text = "" Then objText.Text = 0 Next 'ワークシートへ書き出し Call LetData(lngFID) MsgBox "正常に登録しました。", 64 + 0, "給与計算システム" '初期値 Call NewData End If Set objText = Nothing End Sub '社員リスト選択時 Private Sub lstSyain_Click() Dim lngFID As Long '外部キー 'レコードの再取得 If mobjWS(0).Cells(1, 1).Value = "" Then mlngRow = 0 Else mlngRow = mobjWS(0).Cells(65536, 1).End(xlUp).Row End If '社員IDの取得 lngFID = Me.lstSyain.List(Me.lstSyain.ListIndex, 0) 'ワークシートの値の取得 Call GetData(lngFID) End Sub 'フォーカスがあたったとき Private Sub txtKingaku1_Enter() With Me.txtKingaku1 .SelStart = 0 .SelLength = Len(.Text) .BackColor = RGB(255, 255, 0) .TextAlign = 1 .IMEMode = 3 End With End Sub 'フォーカスが外れたとき Private Sub txtKingaku1_Exit(ByVal Cancel As MSForms.ReturnBoolean) With Me.txtKingaku1 .BackColor = RGB(255, 255, 255) .TextAlign = 3 .Text = Format$(.Text, "#,##0") .IMEMode = 0 End With If IsNumeric(Me.txtKingaku1.Text) = False Then GoTo ErrorProc Exit Sub ErrorProc: MsgBox "入力値が不正です。", 16 + 0, "給与計算システム" End Sub 'フォーカスがあたったとき Private Sub txtKingaku2_Enter() With Me.txtKingaku2 .SelStart = 0 .SelLength = Len(.Text) .BackColor = RGB(255, 255, 0) .TextAlign = 1 .IMEMode = 3 End With End Sub 'フォーカスが外れたとき Private Sub txtKingaku2_Exit(ByVal Cancel As MSForms.ReturnBoolean) With Me.txtKingaku2 .BackColor = RGB(255, 255, 255) .TextAlign = 3 .Text = Format$(.Text, "#,##0") .IMEMode = 0 End With If IsNumeric(Me.txtKingaku2.Text) = False Then GoTo ErrorProc Exit Sub ErrorProc: MsgBox "入力値が不正です。", 16 + 0, "給与計算システム" End Sub 'フォーカスがあたったとき Private Sub txtKingaku3_Enter() With Me.txtKingaku3 .SelStart = 0 .SelLength = Len(.Text) .BackColor = RGB(255, 255, 0) .TextAlign = 1 .IMEMode = 3 End With End Sub 'フォーカスが外れたとき Private Sub txtKingaku3_Exit(ByVal Cancel As MSForms.ReturnBoolean) With Me.txtKingaku3 .BackColor = RGB(255, 255, 255) .TextAlign = 3 .Text = Format$(.Text, "#,##0") .IMEMode = 0 End With If IsNumeric(Me.txtKingaku3.Text) = False Then GoTo ErrorProc Exit Sub ErrorProc: MsgBox "入力値が不正です。", 16 + 0, "給与計算システム" End Sub 'フォーカスがあたったとき Private Sub txtKingaku4_Enter() With Me.txtKingaku4 .SelStart = 0 .SelLength = Len(.Text) .BackColor = RGB(255, 255, 0) .TextAlign = 1 .IMEMode = 3 End With End Sub 'フォーカスが外れたとき Private Sub txtKingaku4_Exit(ByVal Cancel As MSForms.ReturnBoolean) With Me.txtKingaku4 .BackColor = RGB(255, 255, 255) .TextAlign = 3 .Text = Format$(.Text, "#,##0") .IMEMode = 0 End With If IsNumeric(Me.txtKingaku4.Text) = False Then GoTo ErrorProc Exit Sub ErrorProc: MsgBox "入力値が不正です。", 16 + 0, "給与計算システム" End Sub 'フォーカスがあたったとき Private Sub txtKingaku5_Enter() With Me.txtKingaku5 .SelStart = 0 .SelLength = Len(.Text) .BackColor = RGB(255, 255, 0) .TextAlign = 1 .IMEMode = 3 End With End Sub 'フォーカスが外れたとき Private Sub txtKingaku5_Exit(ByVal Cancel As MSForms.ReturnBoolean) With Me.txtKingaku5 .BackColor = RGB(255, 255, 255) .TextAlign = 3 .Text = Format$(.Text, "#,##0") .IMEMode = 0 End With If IsNumeric(Me.txtKingaku5.Text) = False Then GoTo ErrorProc Exit Sub ErrorProc: MsgBox "入力値が不正です。", 16 + 0, "給与計算システム" End Sub 'フォームロード時 Private Sub UserForm_Initialize() '初期値 Call NewData '社員リスト Call GetSyainList End Sub 'フォームクローズ時 Private Sub UserForm_Terminate() Dim i As Integer '配列の開放 If IsEmpty(mobjWS) = True Then Erase mobjWS 'オブジェクトの開放 For i = 0 To 1 Set mobjWS(i) = Nothing Next End Sub 'ワークシートの値の取得 Private Sub GetData(ByVal lngFID As Long) '引数[lngFID]:外部キー(社員コード) Dim clsKoujo As clsHoken '保険料等控除クラス Dim objText As MSForms.TextBox 'テキストボックス Dim A() As Variant 'データ Dim lngRow As Long 'カレントレコード Dim i As Integer '整数型カウンタ ReDim A(6) As Variant '配列の再定義 '社員IDと一致するレコードの取得 On Error GoTo ErrorProc mobjWS(0).Activate lngRow = mobjWS(0).Range(Cells(1, 2), Cells(mlngRow, 2)).Find(lngFID, Cells(mlngRow, 2), xlValues).Row 'カレントレコードの移動 mlngRow = lngRow - 1 'クラスのインスタンス Set clsKoujo = New clsHoken 'ワークシートの値の取得 clsKoujo.GetProperty mobjWS(0), mlngRow + 1, A(0), A(1), A(2), A(3), A(4), A(5), A(6) 'データをコントロールに表示 For i = 1 To 5 Set objText = Controls("txtKingaku" & CStr(i)) With objText If .Enabled = False Then .Enabled = True .Text = Format$(A(i + 1), "#,##0") End With Next '配列の開放 If IsEmpty(A) = True Then Erase A 'クラスの開放 Set clsKoujo = Nothing 'オブジェクトの開放 Set objText = Nothing Exit Sub ErrorProc: For i = 1 To 5 Set objText = Controls("txtKingaku" & CStr(i)) If objText.Enabled = False Then objText.Enabled = True objText.Text = 0 Next Set objText = Nothing End Sub 'ワークシートへ書き出し Private Sub LetData(ByVal lngFID As Long) '引数[lngFID]:外部キー(社員コード) Dim clsKoujo As clsHoken '保険料控除等クラス Dim objText As MSForms.TextBox 'テキストボックス Dim A() As Long 'データ Dim i As Integer '整数型カウンタ ReDim A(6) As Long '配列再定義 '配列にデータを格納 A(0) = mlngRow + 1 A(1) = lngFID For i = 1 To 5 Set objText = Controls("txtKingaku" & CStr(i)) A(i + 1) = CLng(objText.Text) Next 'クラスのインスタンス Set clsKoujo = New clsHoken 'ワークシートへ書き出し clsKoujo.LetProperty mobjWS(0), mlngRow + 1, A(0), A(1), A(2), A(3), A(4), A(5), A(6) '配列の開放 If IsEmpty(A) = True Then Erase A 'クラスの開放 Set clsKoujo = Nothing 'オブジェクトの開放 Set objText = Nothing End Sub '社員リスト取得 Private Sub GetSyainList() Dim clsSyainID() As clsList '社員リストクラス Dim A() As Variant 'データ Dim lngRow As Long '社員データ数 Dim i As Long '長整数型カウンタ Dim j As Long '配列設定値 '社員数の取得 lngRow = mobjWS(1).Cells(65536, 1).End(xlUp).Row '退職の検査 j = 0 For i = 1 To lngRow If mobjWS(1).Cells(i, 6).Value = 0 Then j = j + 1 Next '要素がないとき If j < 1 Then Exit Sub ReDim clsSyainID(j - 1) As clsList 'クラス再定義 ReDim A(j - 1, 1) As Variant '配列再定義 j = 0 For i = 0 To lngRow - 1 If mobjWS(1).Cells(i + 1, 6).Value = 0 Then '社員リストクラスのインスタンス Set clsSyainID(j) = New clsList '社員リストの取得 clsSyainID(j).GetData mobjWS(1), i + 1, 1, 1, 4 '配列に格納 A(j, 0) = clsSyainID(j).id A(j, 1) = clsSyainID(j).Name j = j + 1 End If Next With Me.lstSyain .Clear .ColumnCount = 2 .List() = A End With If IsEmpty(A) = True Then Erase A 'クラスの開放 For i = 0 To j - 1 Set clsSyainID(i) = Nothing Next End Sub '初期値設定 Private Sub NewData() Dim objText As MSForms.TextBox 'テキストボックス Dim objLB As MSForms.Label 'ラベル Dim i As Integer '整数型カウンタ ReDim mobjWS(1) As Worksheet '配列再定義 'ワークシート Set mobjWS(0) = Workbooks(gstrName).Worksheets("Sheet8") Set mobjWS(1) = Workbooks(gstrName).Worksheets("Sheet2") 'レコードの取得 If mobjWS(0).Cells(1, 1).Value = "" Then mlngRow = 0 Else mlngRow = mobjWS(0).Cells(65536, 1).End(xlUp).Row End If For i = 1 To 5 'テキストボックス Set objText = Controls("txtKingaku" & CStr(i)) With objText .Text = 0 .TextAlign = 3 .Enabled = False End With 'ラベル Set objLB = Controls("lblKoumoku" & CStr(i)) objLB.TextAlign = 3 Next 'リスト With Me.lstSyain .ColumnWidths = "0;72" .ListIndex = -1 End With Set objText = Nothing Set objLB = Nothing End Sub