Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


16663 / 76732 ←次へ | 前へ→

【65533】Re:User_formの修復について(至急!!!)
発言  247b  - 10/6/2(水) 16:53 -

引用なし
パスワード
   >>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
1 hits

【65516】User_formの修復について(至急!!!) 八家九僧陀 10/6/1(火) 17:52 質問
【65517】Re:User_formの修復について(至急!!!) Yuki 10/6/1(火) 19:20 発言
【65518】Re:User_formの修復について(至急!!!) よろずや 10/6/1(火) 19:43 回答
【65519】Re:User_formの修復について(至急!!!) 247b 10/6/1(火) 21:08 発言
【65520】Re:User_formの修復について(至急!!!) 八家九僧陀 10/6/2(水) 0:32 質問
【65521】Re:User_formの修復について(至急!!!) Hirofumi 10/6/2(水) 7:37 発言
【65522】Re:User_formの修復について(至急!!!) 247b 10/6/2(水) 9:14 発言
【65523】Re:User_formの修復について(至急!!!) 247b 10/6/2(水) 9:38 発言
【65524】Re:User_formの修復について(至急!!!) 八家九僧陀 10/6/2(水) 13:12 質問
【65525】Re:User_formの修復について(至急!!!) 247b 10/6/2(水) 14:41 発言
【65528】Re:User_formの修復について(至急!!!) 八家九僧陀 10/6/2(水) 15:47 質問
【65533】Re:User_formの修復について(至急!!!) 247b 10/6/2(水) 16:53 発言
【65535】Re:User_formの修復について(至急!!!) 八家九僧陀 10/6/2(水) 19:08 質問
【65536】Re:User_formの修復について(至急!!!) 247b 10/6/2(水) 20:50 発言
【65537】Re:User_formの修復について(至急!!!) 八家九僧陀 10/6/2(水) 22:06 質問
【65538】Re:User_formの修復について(至急!!!) 247b 10/6/2(水) 22:39 発言
【65539】Re:User_formの修復について(至急!!!) 247b 10/6/2(水) 22:45 発言
【65540】Re:User_formの修復について(至急!!!) 八家九僧陀 10/6/2(水) 23:42 質問
【65541】Re:User_formの修復について(至急!!!) 247b 10/6/3(木) 0:19 発言

16663 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free