|
hiro さん、おはようございます。
>もう少し質問させて頂きたいのですが レイアウトを変更したく思いましてシート2のB2から部署名を入れて出力データをC列から表示したいのですが修正箇所を教えていただけないでしょうか?それと一部署の人数が10人以上になったときの修正箇所も教えて頂けないでしょうか?
応用しやすいように、変数で変更するようにしました。
Sub test()
Dim ws(1 To 2) As Worksheet, r(1 To 3) As Range
Dim Cmax As Long, Cp As Long, Rp As Long, Dp As String
Dim dt As Long, Rmax As Long, Rpos As Long, RR As Long, msg As String
'転記先の設定いろいろ
Cmax = 10 '最大人数
Cp = 2 '転記先の部署の入った列(B列=>2)
Rp = 2 '転記先の行の開始番号(2行目)
Dp = "K1" '日付指定セル
'
With Application.ThisWorkbook
Set ws(1) = .Worksheets("Sheet1") '元
Set ws(2) = .Worksheets("Sheet2") '先
End With
'一覧表の範囲設定(部署名一覧を取得)
With ws(2)
Set r(1) = .Range(.Cells(1, Cp), .Cells(65536, Cp).End(xlUp))
dt = .Range(Dp).Value
End With
'
If r(1).Count = 1 Then
MsgBox "範囲を確認" + vbCrLf + r(1).Address(False, False), vbExclamation
Else
Select Case dt
Case 16 To 31
'念のため入力範囲クリア&フォント黒
With r(1).Offset(Rp - 1, 1).Resize(r(1).Rows.Count - Rp + 1, Cmax)
.ClearContents
.Font.ColorIndex = 1
End With
'ループの最下段判定(部署がAのため)
Rmax = ws(1).Range("A65536").End(xlUp).Row
For RR = 4 To Rmax '4行目から処理
'部署判定
Set r(2) = ws(1).Cells(RR, 1)
With Application.WorksheetFunction
'ワークシート関数のCountIfで一致部署の有無を判定(無かったらMatchがエラーになるので)
If .CountIf(r(1), r(2).Value) = 0 Then
'どの部署とも一致しなかった人
msg = msg & vbCrLf & RR & "行目:" & r(2).Offset(0, 2).Value & " さん"
Else
'ワークシート関数のMatchで行番号を取得
Rpos = .Match(r(2).Value, r(1), 0)
With ws(2).Cells(Rpos, Cmax + r(1).Cells(1).Column)
'転記先の右端のセルに既にデータが入っていたらオーバーと表示
If .Value <> "" Then
msg = msg & vbCrLf & RR & "行目:" & r(2).Offset(0, 2).Value & " さん(人数オーバー)"
Else
With .End(xlToLeft).Offset(0, 1)
.Value = r(2).Offset(0, 2).Value
'フォントの色をここで分岐
With .Font
Select Case r(2).Offset(0, dt - 16 + 3).Value
Case "休": .ColorIndex = 3
Case "外": .ColorIndex = 5
End Select
End With
End With
End If
End With
End If
End With
Next
'
If msg <> "" Then MsgBox "部署エラー" & msg, vbExclamation, "転記できませんでした"
Case Else
MsgBox "日付指定エラー", vbExclamation, "中断"
End Select
End If
'
Erase ws, r
End Sub
こんな感じです。
|
|