Option Explicit '前職分源泉徴収票フォーム Private mobjWS() As Worksheet 'objWS(0):Sheet9:前職分源泉徴収票データ 'objWS(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 intMsg As Integer 'メッセージの戻り値 Dim i As Integer '整数型カウンタ intMsg = MsgBox("登録しますか。", 32 + 4, "給与計算システム") 'はいのとき If intMsg = 6 Then 'NULL値の回避 For i = 1 To 3 Set objText = Controls("txtKingaku" & CStr(i)) If objText.Text = "" Then objText.Text = 0 If IsNumeric(objText.Text) = False Then GoTo ErrorProc Next Call LetData Call NewData Call GetSyainList MsgBox "正常に登録しました。", 64 + 0, "給与計算システム" End If 'オブジェクトの開放 Set objText = Nothing Exit Sub ErrorProc: MsgBox "入力値が不正です。", 16 + 0, "給与計算システム" End Sub '社員リスト Private Sub lstSyain_Click() Dim objText As MSForms.TextBox 'テキストボックス Dim lngFID As Long '外部キー Dim f As Integer 'フラグ Dim i As Integer '整数型カウンタ 'レコードの再取得 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 3 Set objText = Controls("txtKingaku" & CStr(i)) If objText.Enabled = False Then objText.Enabled = True Next On Error GoTo ErrorProc '外部キーの取得 lngFID = Me.lstSyain.List(Me.lstSyain.ListIndex, 0) Call GetData(lngFID) On Error GoTo 0 Set objText = Nothing Exit Sub ErrorProc: '該当データがないとき End Sub 'フォーカスがあたったとき Private Sub txtKingaku1_Enter() With Me.txtKingaku1 .BackColor = RGB(255, 255, 0) .SelStart = 0 .SelLength = Len(.Text) .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) .Text = Format$(.Text, "#,##0") .TextAlign = 3 .IMEMode = 0 End With End Sub 'フォーカスがあたったとき Private Sub txtKingaku2_Enter() With Me.txtKingaku2 .BackColor = RGB(255, 255, 0) .SelStart = 0 .SelLength = Len(.Text) .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) .Text = Format$(.Text, "#,##0") .TextAlign = 3 .IMEMode = 0 End With End Sub 'フォーカスがあたったとき Private Sub txtKingaku3_Enter() With Me.txtKingaku3 .BackColor = RGB(255, 255, 0) .SelStart = 0 .SelLength = Len(.Text) .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) .Text = Format$(.Text, "#,##0") .TextAlign = 3 .IMEMode = 0 End With End Sub 'フォームロード時 Private Sub UserForm_Initialize() Call NewData Call GetSyainList End Sub 'フォームクローズ Private Sub UserForm_Terminate() Dim i As Integer For i = 0 To 1 Set mobjWS(i) = Nothing Next End Sub 'ワークシートのデータの取得 Private Sub GetData(ByVal lngID As Long) '引数[lngID]:社員ID Dim clsGensen As clsZensyoku '前職分源泉徴収票 Dim objText As MSForms.TextBox 'テキストボックス Dim A() As Variant 'データ Dim lngRow As Long 'カレントレコード Dim i As Integer '整数型カウンタ ReDim A(4) As Variant '配列再定義 '社員IDと一致するレコードの取得 mobjWS(0).Activate lngRow = mobjWS(0).Range(Cells(1, 2), Cells(mlngRow, 2)).Find(lngID, Cells(mlngRow, 2), xlValues).Row 'カレントレコードの移動 mlngRow = lngRow - 1 '源泉徴収票クラスのインスタンス Set clsGensen = New clsZensyoku '取得 clsGensen.GetProperty mobjWS(0), mlngRow + 1, A(0), A(1), A(2), A(3), A(4) 'テキストボックス For i = 1 To 3 Set objText = Controls("txtKingaku" & CStr(i)) objText.Text = Format$(A(i + 1), "#,##0") Next 'クラスの開放 Set clsGensen = Nothing '配列の開放 If IsEmpty(A) = True Then Erase A 'オブジェクトの開放 Set objText = Nothing End Sub 'ワークシートへデータを書き出し Private Sub LetData() Dim clsGensen As clsZensyoku '前職分源泉徴収票 Dim objText As MSForms.TextBox 'テキストボックス Dim A() As Variant 'データ Dim i As Integer '整数型カウンタ ReDim A(4) As Variant '配列再定義 A(0) = mlngRow + 1 A(1) = Me.lstSyain.List(Me.lstSyain.ListIndex, 0) 'テキストボックス For i = 1 To 3 Set objText = Controls("txtKingaku" & CStr(i)) A(i + 1) = objText.Text Next '源泉徴収票クラスのインスタンス Set clsGensen = New clsZensyoku '書き出し clsGensen.LetProperty mobjWS(0), mlngRow + 1, A(0), A(1), A(2), A(3), A(4) 'クラスの開放 Set clsGensen = Nothing '配列の開放 If IsEmpty(A) = True Then Erase A 'オブジェクトの開放 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 '配列要素数 '社員リストの有無 If mobjWS(1).Cells(1, 1).Value = "" Then GoTo BlankProc '配列要素数の取得 lngRow = mobjWS(1).Cells(65536, 1).End(xlUp).Row '中途入社の検査 j = 0 For i = 1 To lngRow If mobjWS(1).Cells(i, 5).Value = 1 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, 5).Value = 1 Then '社員リストクラスのインスタンス Set clsSyainID(j) = New clsList '社員リストの取得 clsSyainID(j).GetData mobjWS(1), i + 1, 1, 1, 3 '配列に格納 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 Exit Sub BlankProc: MsgBox "社員リストは空です。" & vbCrLf & "先に社員給与計算システムを登録して下さい。", 48 + 0, "給与計算システム" 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("Sheet9") '前職分源泉徴収票 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 3 'テキストボックス Set objText = Controls("txtKingaku" & CStr(i)) With objText .Text = 0 .TextAlign = 3 If .Enabled = True Then .Enabled = False End With 'ラベル Set objLB = Controls("lblKomoku" & CStr(i)) objLB.TextAlign = 3 Next 'リスト With Me.lstSyain .Clear .ColumnWidths = "0;72" .ListIndex = -1 .IMEMode = 3 End With 'オブジェクトの開放 Set objText = Nothing Set objLB = Nothing End Sub