| 
    
     |  | >>Spin移動_changeプロシージャから処理開始した場合、「支給台帳」シートのデータが使用されていますが、Combo社員ID_Changeプロシージャから処理開始した場合、「仮マスター」シートのデータがCombo社員IDのリストとして使用されているので、「仮マスター」のデータが使用されます。 >>2つのシートに件数差等ないですか?
 >
 >「支給台帳」は実際に当該月に給与を支給する者の人数です。
 >「仮マスター」は、現に社員登録している人数です。またデータ内容も時間外時間数や時間外手当額等の月々に変動するデータは登録されておらず、基本給、通勤費等、毎月毎月変動するようなデータではなく固定的、基本的なデータのみ登録しています。
 >具体的には、
 >「支給台帳」は、A列〜CR列、5月分は58行でした。
 >「仮マスター」は、A列〜W列で、66行です。
 
 仮マスターの情報が支給台帳の一部分であり、仮マスターに記載の有るデータは仮マスターから引いてきて、それ以外は支給台帳から引くか入力するということで理解しました。
 
 >>あと、おそらく現在の症状に関係ないと思いますが、
 >>Spin移動.Minが0から開始なのに対し、「レコード数取得」プロシージャが「支給台帳」シートの件数−1を返し、「Userform_initialize」プロシージャで+1しているので、0からカウントすると1レコード余分になっていると思います。+1が不要かと。
 >
 >具体的には、どの部分をどのように修正すればいいでしょう。
 以下のプログラムに修正をいれていますので確認をお願いします。
 
 机上デバッグが厳しいので、こちらで解釈した範囲でプログラムを作成してみました。
 かえって混乱するようでしたら、使用は避けてください。
 修正、追加箇所に247bとコメントを入れてあります。
 修正していないプロシージャは削除してあります。
 クラスモジュールは新規に追加してから以下に記述のプログラムをコピペしてください。
 なお、クラスの名前は「clsFinder」にしてあります。
 
 'Option Explicit
 
 Dim TBL(1 To 90) As Control
 Dim データ範囲 As Range
 Dim r As Range '←今回の追加
 Dim DataFinder As clsFinder '247b add
 
 Private Sub Userform_initialize()
 
 '///////// ココから新規追加(質問箱から盗用)
 Set r = Worksheets("仮マスター").Range("A1").CurrentRegion
 Set r = Intersect(r, r.Offset(1))
 Set DataFinder = New clsFinder '247b add
 
 'With Combo社員ID 247b del
 '  .RowSource = r.Address(external:=True)
 '  .ColumnHeads = True
 '  .TextColumn = 1
 '  .BoundColumn = 2
 '  .ColumnCount = 2
 '  .ColumnWidths = "40:60"
 'End With
 '////// ココまで
 Set DataFinder.ターゲット範囲 = r '247b add
 DataFinder.社員ID列 = 1 '247b add
 
 
 'Spin移動.Max = レコード数取得 + 1
 Spin移動.Max = レコード数取得 '247b rep
 
 Set TBL(1) = text支給年月日
 Set TBL(2) = text種別
 Set TBL(3) = Combo社員ID '←このIDにより以下の約20個のtextboxに値を取得
 Set TBL(4) = Text氏名
 '〜
 Set TBL(96) = text差引支給額 'Combo社員ID以外は全てtextBoxです
 
 Set データ範囲 = Worksheets("支給台帳").Range("A1").CurrentRegion
 
 If データ範囲.Rows.Count = 1 Then
 Else
 データ表示 2
 End If
 End Sub
 
 Public Function レコード数取得() As Integer
 レコード数取得 = Worksheets("支給台帳").Range("A1").CurrentRegion.Rows.Count - 1
 End Function
 
 Public Sub データ表示(行数 As Integer)
 Dim Cnt As Integer, vntData As Variant
 vntData = Worksheets("支給台帳").Range("A1").CurrentRegion.Rows(行数).Value
 
 For Cnt = 1 To 96 Step 1
 TBL(Cnt) = vntData(1, Cnt) '←エラーメッセージのとき、ここが黄色に反転
 Next
 
 Textレコード.Value = Spin移動.Value - 1 & "/" & レコード数取得
 End Sub
 
 Private Sub Spin移動_change()
 If データ範囲.Rows.Count <> 1 Then
 データ表示 (Spin移動.Value)
 End If
 End Sub
 
 
 '////////////////////////// ココから新規追加(質問箱から盗用)
 Private Sub Combo社員ID_Change()
 Application.ScreenUpdating = False
 With Combo社員ID
 If .ListIndex < 1 Then Exit Sub
 '    Combo社員ID.Value = .List(.ListIndex, 0) 247b del
 '    Text氏名.Value = .List(.ListIndex, 1)
 '    Text所属.Value = .List(.ListIndex, 2)
 '    '〜
 '    Text標準報酬月額.Value = .List(.ListIndex, 22)
 '    Text市県民税.Value = .List(.ListIndex, 23)
 If DataFinder.Find社員(Combo社員ID.List(Combo社員ID.ListIndex, 0)) Then '247bAdd
 Combo社員ID.Value = DataFinder.GetValue(1)
 Text氏名.Value = DataFinder.GetValue(2)
 Text所属.Value = DataFinder.GetValue(3)
 '〜
 Text標準報酬月額.Value = DataFinder.GetValue(22)
 Text市県民税.Value = DataFinder.GetValue(23)
 End If
 End With
 Set r = Noting
 Application.ScreenUpdating = True
 End Sub
 
 
 Option Explicit
 
 'これはクラスモジュールです。
 'クラスモジュールを新規作成し、プログラムを貼り付けてください。
 'プロパティウィンドウの(オブジェクト名)を「clsFinder」に変更してください。
 
 
 Private Rng As Range
 Private colnum As Long
 Private TargetRow As Range
 
 Public Property Set ターゲット範囲(vObject As Range)
 Set Rng = vObject
 End Property
 
 Public Property Let 社員ID列(vdata As Long)
 colnum = vdata
 End Property
 
 Public Function Find社員(ID As Variant) As Boolean
 Dim rg As Range
 Set rg = Rng.Columns(colnum).Find(ID, LookIn:=xlValues, LookAt:=xlWhole)
 If Not rg Is Nothing Then
 Set TargetRow = rg.EntireRow
 Find社員 = True
 Else
 Set TargetRow = Nothing
 Find社員 = False
 End If
 End Function
 
 Public Function GetValue(Col As Long) As Variant
 If Not TargetRow Is Nothing Then
 GetValue = TargetRow.Cells(1, Col).Value
 End If
 End Function
 
 
 |  |