[[20040421190945]] 『従業員の有給休暇を管理したい』(ウルトラマン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『従業員の有給休暇を管理したい』(ウルトラマン)

[VBA:ファイルを開いたときの命令について]

 従業員の有給休暇の管理表を作成しています。
 有給休暇は、入社日から半年後、1年半年後、2年半年後、3年半年後、・・・・・に
 10日、11日、12日、14日、16日、18日、20日、と付与されていきます。 
 この、有給休暇を次のような表で、管理する予定です。

       A    B      C   D   E    F ・・・・・   W
 1 従業員1 入社年月日  前年度 取得日1 取得日2 取得日3・・・・・・取得日20
 2             今年度 取得日1 取得日2 取得日3・・・・・・取得日20
 3 従業員2 入社年月日  前年度
 4             今年度
 5 従業員3 入社年月日  前年度
 6  ・     ・    今年度
 ・  ・     ・     ・   ・   ・    ・
 ・  ・     ・     ・   ・   ・    ・ 
  
 このような表で、入社日から半年後にD2〜W2までのセルの値をD1〜W2に移したいの
 です。D1〜W1にあったデータは消えてもかまいません。
 従業員2についても、半年後にD4〜W4までのセルの値をD3〜D3に移します。
 この動作を半年後、1年半年後、2年半年後、3年半年後・・・・ごとに従業員ごとにした
 いのです。
 半年後から1年半年後の間で、最初にファイルを開いたときだけ実行します。
 さらに1年半年後から2年半年後の間で、最初にファイルを開いたときだけ実行します。
 おなじように2年半年後から3年半年後の間で、最初にファイルを開いた時だけ実行します。
  
 従業員は20名で、40年半年後まで対応できればと思います。
 マクロ:VBAでしか処理ができないと思いますが、私にはわかりません。
 誰かご指導ながえないでしょうか?
 Win98、エクセル2000です。

 私も同じような仕事をしているので、この質問には大いに興味があります。整理すると、
(1) 入社半年後に第1回の有給休暇10日が付与され、以後1年ごとに1日ずつ増えた日数が
  付与される。但し付与の上限は20日。
(2) 今年度付与された有休の残日数は翌年まで有効なので、シート上の前年度欄に繰り上げる。
(3) 更新すべき日を過ぎて初めてファイルが開かれた従業員のデータに対して、今年度の欄を
  前年度に”自動的”に移し、今年度欄が空欄になる。
こんな事だと思います。私はマクロはほとんどわかりませんが、少しロジックを考えてみました。

 X列を付与日数、Y列を更新回数、Z列を次回更新日とします。X2に=IF(Y2>=1,MIN(Y2+9,20),0)と
入力、Z2に=EDATE(B1,Y2*12+6) と入力します。従業員2以降もおなじように入力します。

 あとはファイルを開いた時にZ列の次回更新日が過ぎている従業員に対して、今年度の
D列からX列までを前年度に移し、今年度を空欄にし、更新回数を1増やす、という一連の作業が
マクロで出来ればいいと思います。その際、付与日数が20日に満たない場合は、日数に応じて
取得日欄の右側のセルが網かけになったりすれば言うことなしですね。(純丸)

 こんなんでどうでっか?
 いまいち理解でけてまへんのんですが、休暇を消化したら今年度の取得日の多い順
 に消していきまんのやろ?
 で、更新日が過ぎた時点で前年度に今年度の残りの休暇日数を移し、新たに権利の
 ある休暇取得日を並べるんですわなぁ。
 更にそれが20日に満たないばやいは前年度の休暇日数を今年度に加えるっちゅう事
 でせう?

 検証するんに時間がかかりますさかい、そちらでお願いします。
 まあ、念のために新しいブックを開き標準モジュールに下のコードをコピペしてくだ
 はい。
 へてからA、B、C列に適当なデータを10件程ぶちこんでください。

 auto_open はこのブックが開かれたら実行しますが、検証するためにいちいちブックを
 閉じたり開いたりでけしまへんし本番で使う変数が有効にならないと(下のコードで
 説明)働かんようになっとります。
 C26を仮の変数にしてありますさかい。C26に2004/4/24等と打ち込んでくだはい。
 それとZの奇数欄の書式はスラッシュで分割された日付にしときます。
 ココには純丸さんの言う=EDATEが入り、その下の行には更新回数が書きこまれます。

 そこまでおわったら、auto_openを実行してみてくだはい。
 どうでっか?C26に書いたデータで更新されてまっしゃろ?
 適当に休暇を消化した状態にしてC26のデータを更に新しいデータにかえてみておくん
 なはれ。
 更新日が過ぎたデータだけ前年度に移され、更に新しく取得した休暇が今年度に出力
 されとる筈ですワ。
 純丸さんの網掛けはサービス過剰になるんで考えてまへんでぇ。(笑)
    ほな...(弥太郎)
 '--------------------------
 Dim renw_no As Integer
 '---------------------------
 Sub auto_open()
    Dim data As Date
    Dim i As Integer, y As Integer, befr As Integer, x_day As Integer
    Dim x As Single

    data = Format(Now, "yyyy/mm/dd")

    For i = 1 To 12 Step 2
        n = CDec(Application.WorksheetFunction.RoundUp((DateDiff("d", Cells(i, 2), Range("c26")) / 365), 5))
                        '↑
                    'この行検証後削除
        'n = CDec(Application.WorksheetFunction.RoundUp((DateDiff("d", Cells(i, 2), data) / 365), 5))
                        '↑
                    'この行検証後挿入
        If Cells(i, 26) <= Range("c26") Then
                        '↑
                    'この行検証後削除

        'If Cells(i, 26) <= data Then
                        '↑
                    'この行検証後挿入
            For x = 6.5 To 0.5 Step -1
                If n > x Then
                    If x = 0.5 Then
                        For y = 1 To 10
                            Cells(i + 1, y + 3) = "取得日" & y & "日"
                        Next y
                        data_c (n)
                        Cells(i, 26).Formula = "=edate(b" & i & "," & renw_no & "*12+6)"
                        Cells(i + 1, 26) = renw_no

                    Else
                        Cells(i, 4).Resize(, 20).Clear
                        data_c (n)
                        Cells(i, 26) = "=edate(b" & i & "," & renw_no & "*12+6)"
                        Cells(i + 1, 4).Resize(, 20).Copy Destination:=Cells(i, 4)
                        Cells(i + 1, 26) = renw_no
                        For y = 1 To data_c(n)
                            Cells(i + 1, 3 + y) = "取得日" & y & "日"
                        Next y

                        x_day = 4
                        If Cells(i + 1, "w") = "" Then
                            For befr = y + 3 To 23

                                If Cells(i, x_day) <> "" Then
                                    Cells(i + 1, befr) = "取得日" & y + x_day - 4 & "日"
                                    x_day = x_day + 1
                                    If Cells(i, x_day) = "" Then Exit For
                                End If
                            Next befr
                        End If
                        Exit For
                    End If
                End If
            Next x
        End If
    Next i
 End Sub
 '----------------------------------------
 Function data_c(ByVal n As Double) As Integer
    Select Case n
        Case Is > 6.5
            data_c = 20
            renw_no = Int(n) + 1
        Case Is > 5.5
            data_c = 18
            renw_no = 6
        Case Is > 4.5
            data_c = 16
            renw_no = 5
        Case Is > 3.5
            data_c = 14
            renw_no = 4
        Case Is > 2.5
            data_c = 12
            renw_no = 3
        Case Is > 1.5
            data_c = 11
            renw_no = 2
        Case Is > 0.5
            data_c = 10
            renw_no = 1

     End Select

 End Function


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.