|
>>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
|
|