プロが教える店舗&オフィスのセキュリティ対策術

社員番号の一覧表があります。
何千行もあるデータで、
別の部署がデータベースのエクセルと突合して
一覧票が私の部署に回ってくるのですが、

条件を満たしてない行が多数あって
データが多いため、目で確認するのが厳しいので
マクロで確認させようと思いました。

F列,G列,H列,I列にデータが記述されており
AS列に別部署が突合した結果の#が入ってます。

F列~予備社員番号
G列~社員番号
H列~社員の役職
I列~グループの構成している代表の社員番号

AS列~該当するデータに#が入ってます

H列の文言で社員の項目でAS列に#が入ってる場合で、

課長のG列の社員番号と社員のI列の社員番号が同じ事が成立しつつ
H列の文言の課長の項目でAS列に#が入っているか?

#がなければメッセージで警告を出す

マクロでIF分かCASEで条件付けで書くことが上記のやりたい事に
近いものだと思ったのですが、
条件が多岐に渡っているので書き方が上手くできません。



どなたか、上記の条件の時に動作できる
コードのアドバイス等を頂けないでしょうか?

添付で一覧表をつけます。
マクロのコードを途中まで記述しましたが
記述する担当者が退職したので途中のままになっています。
参考まで記述致します。

お忙しい中、お手数ですが
宜しくお願い致します。

Sub 課長に印あるか確認()
Dim i As Long, j As Long

For i = Cells(Rows.Count, 6).End(xlUp).Row To 2 Step -1
For j = Cells(Rows.Count, 7).End(xlUp).Row To 2 Step -1
If Cells(i, 6) = "社員" And Cells(i, 45) = "#" Then
If Cells(i, 6) = "課長" And Cells(j, 7) And Cells(j, 6) = "社員" Then
MsgBox "課長に#ありません"
End If
Next j
Next i
End Sub

「条件を満たすときにメッセージで知らせるマ」の質問画像

質問者からの補足コメント

  • 色々と説明不足で申し訳ありません。

    H列に課長と社員の並列は連続してある状態です。

    社員がどの課長に属しているのかという判定は、
    社員の代表社員番号列にその社員の課長の番号が記述されているので
    それを基にグループ分けされています。

    参考図を添付させて頂きます。
    色々と拙い説明で申し訳ありません。
    不明点有り次第、再度、概要の補足 図を追記します。
    宜しくお願い致します。

    「条件を満たすときにメッセージで知らせるマ」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2015/06/06 21:43

A 回答 (3件)

#1です。

補足拝見しました。
わたしの想像は基本的に合っていました。

となりますと、各レコードを検索していき、「社員」の場合、その上司(課長)を
I列の代表社員番号をキーに探し、その課長のAS列に#が入っているかを見ればよい、
ということですね。

例示されているコードが、下から上にループさせているようですので、それに則ってやります。
でも、メッセージボックスの警告でいいんですかね?
何千行もの判定で、その都度、止まってしまいますが。
いちおう以下のコードでは、該当レコード(警告が出るレコード)に着色しています。
適宜改造ください。

----------------------------------------------------------------
Sub 課長に印あるか確認()
Dim i As Long, j As Long
Dim Lstrow As Long
Dim DSban As String

Lstrow = Cells(Rows.Count, 6).End(xlUp).Row ’最終行取得

For i = Lstrow To 2 Step -1
   If Cells(i, 8).Value = "社員" And Cells(i, 45).Value = "#" Then
      DSban = Cells(i, 9).Value '代表社員番号を格納
      j = Lstrow
      Do Until Cells(j, 7).Value = DSban '課長の行を検索
         j = j - 1
      Loop

      If Cells(j, 45).Value <> "#" Then '課長の行のAS列が#ではないなら
         MsgBox "警告" & Chr(13) & Chr(13) & i & "行目" '警告
         Range(Cells(i, 6), Cells(i, 9)).Interior.ColorIndex = 34 '着色
      End If
   End If
Next i

End Sub
-----------------------------------------------------------------------
社員と課長の関係性ですが、常に、図示されているような形になっていて、ある社員の課長は必ずその
社員よりも絶対に上に来る、という配置ならば、
Do Loop の開始値「j=LstRow」は、「j=i」としてください。
わざわざ一番下から調べなくても、その社員の行よりも上を探せばいいので。
ご不明点あればお知らせください。
    • good
    • 0
この回答へのお礼

soixante様
上記のコードでやりたいことが出来ました!!!
ありがとうございます!!
色々と拙い説明の中、意図を組みとって
コード記述して頂きありがとうございます

ベストアンサーにさせて頂きます。
ありがとうございます

お礼日時:2015/06/06 23:51

こんばんは!


すでに回答されているように、いちいちメッセージボックスを表示させていると
その都度マクロが止まってしまい、煩わしいだけですので、
セルに色を付けてはどうでしょうか?

AS列に「#」がない場合はF~I列を薄い黄色に
I列社員番号が課長の番号と違う場合はI列をピンクにしてみました。

Sub Sample1()
Dim cnt As Long, myRow As Long, myArea As Range
Dim c As Range, myFirst As Range, myFound As Range
Application.ScreenUpdating = False
Range("F:I").Interior.ColorIndex = xlNone
Set myFound = Range("H:H").Find(what:="課長", LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myFirst = myFound
1: myRow = myFound.Row + 1
cnt = 0
Do While Cells(myRow, "H") = "社員"
myRow = myRow + 1
cnt = cnt + 1
Loop
Set myArea = myFound.Offset(1, 1).Resize(cnt)
For Each c In myArea
If Cells(c.Row, "AS") <> "#" Then
Cells(c.Row, "F").Resize(, 4).Interior.ColorIndex = 36 '//←薄い黄色
End If
'//I列番号が課長番号と違う場合
If Cells(c.Row, "I") <> myFound.Offset(, -1) Then
Cells(c.Row, "I").Interior.ColorIndex = 7 '//←ピンク
End If
Next c
Set myFound = Range("H:H").FindNext(after:=myFound)
Do
If myFound.Address = myFirst.Address Then Exit Do
GoTo 1
Loop
End If
Application.ScreenUpdating = True
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

tom04様

上記のコードで結果が全部出るのですね

メッセージを出すとマクロが止まるから
一遍に上記のコードで処理が出来るのか

コードの書き方やメッセージをだすことによる
作業が止まることなどの配慮ありがとうございます。

このコードを参考にさせて頂きます

お礼日時:2015/06/06 23:56

一部条件で不明瞭な点があります。



>H列の文言で社員の項目でAS列に#が入ってる場合で、
>課長のG列の社員番号と社員のI列の社員番号が同じ事が成立しつつ

課長と社員の関係が良くわかりません。

同じ行のレコードにおいて、H列が「社員」と「課長」の並列はあり得ないと思いますが、
ある社員の課長はどのように判定するのですか?
その社員よりも上のレコードを見て、初めて出てくる「課長」がその社員の属する課の
課長ということですか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!