Microsoft Access Club >初心者講座 >休暇申請管理ソフト >このページ >次頁 - 前項  サイト内検索


社員別休暇申請閲覧フォームの作成_2:休暇申請管理ソフト



前回から下記のような休暇申請状況を社員別に表示できるようなフォームを作成しています。そして、今回も引き続き赤丸のリストボックスを分析していきましょう。

リストボックスの作成

左側赤丸印のリストボックスの更新後処理イベントに下記プロシージャを記述します。

 

更新後処理イベントプロシージャ
Private Sub リスト_AfterUpdate()

    Dim intCount As Integer
    
    'Dcount関数で取得年月日の個数を抽出します。
    intCount = DCount("取得年月日", "qry_prilist_1", "[職員ID]=" & Me.職員ナンバー)

    Me.リスト2.Requery
    Me.リスト3.Requery
    Me.職員ナンバー = Me.リスト.Column(0)
    DoCmd.Requery "職員ナンバー"
    Me.日数.Requery

    Select Case intCount
        Case 0
        Me.該当なしラベル.Visible = True
        Me.リスト2.Visible = False
        Me.リスト3.Visible = False
    Case Else
        Me.該当なしラベル.Visible = False
        Me.リスト2.Visible = True
        Me.リスト3.Visible = True
    End Select

End Sub
解説
  • 隠しテキストボックスを1個を作成。

名前は 職員ナンバー と命名しま しょう。このテキストボックスの役割は、リストボックスで選択した社員IDを一時的に格納し、他のイベントで利用します。

  • 連動している他のリストボックスの再クエリに注意。

リストボックス上で社員を次々と選択していきますから、更新ごとに他のリストボックスを再クエリする必要があります。このようにしないと、社員を切り替えたときに替えた 時に該当データが表示されません。

  • Forms![frm_有休閲覧]![リスト].Column(0)

Columnプロパティは、リストボックスで利用するプロパティの一つで、コンボボックスまたはリストボックスで選択されたデータをテキスト ボックスなどの別のコントロールに代入します。

上記の例で云いますと、
リストボックスで選択された社員IDはColumnプロパティに引数 0 を用いることで、非表示の「職員ナンバー」テキストボックスに格納されます。
Columnの(0)の意味は、クエリフィールドの中で一番左側のフィールドを意味します。(2)であれば、同じく左から3番目を意味する訳です。

  • 該当データが無ければリストボックスが消える(非表示)

社員をリストボックスで選択し、その社員のデータがない場合がありますね。あるのかないのかは、Dcount関数を利用し判断します。
データがなければ、Visible = False を用いて、左から2番目のリストボックス全体を非表示にします。

  • "該当なしラベル"と命名したラベルを新規作成

これは、リストボックスを非表示にした場合、代替で表示させるリストボックスです。このラベルの配置は両リストボックス(左から2番目と3番目)の真中ぐらいでしょうか。そして、標題には適当な文字を記述して下さいね。

 

年度切り替えを行うコンボボックスの作成

同時に、社員別の有休保持日数の表示テキストボックスもやっちゃいましょう。

 

値集合ソース

取りあえず2006年位までで大丈夫でしょう。ここで、1999年;‥などとしてはいけませんよ。これは文字列になっちゃうんでね。プロパティの書式設定で"年"表示させましょうね。ズバリ、0\年 を記述して下さい。

 

こんなんじゃいやだ!2007年になったら書き換えなくっちゃならないじゃないか。とお考えの諸氏は、この場合、ユーザー定義関数を作成するしかありませんね。参考までに、下記に記述しておきます。

ユーザー定義関数の作成
Function Listyear(fld As Control, ID, row, col, code As Variant) As Variant

'基準日の前年から10年間の年度をコンボボックスに表示させるユーザー定義関数です。

    Dim intyear As Integer
    intyear = CLng(Year(Date) - 1)
    
    Select Case code
        Case acLBInitialize          ' 初期化します。
            Listyear = True
        Case acLBOpen                ' 開きます。
            Listyear = Timer         ' 固有の ID。
        Case acLBGetRowCount         ' 行数を取得します。
            Listyear = 10             '8年の場合は、8に変更して下さい。
        Case acLBGetColumnCount      ' 列数を取得します。
            Listyear = 1
        Case acLBGetColumnWidth      ' 列幅を取得します。
            Listyear = -1            ' 既定の幅を使用します。
        Case acLBGetValue            ' データを取得します。
            Listyear = intyear + 1 * row 'rowとは行数です。*は掛け算です。
    End Select

End Function
解説

上記プロシージャの太字部分を適時変更するだけで他のコンボボックスにも流用できます。太字以外の項目は変更する必要は余りありませんので、深く考えなくて結構です 。

記述方法

コンボボックスに記述する方法は下記のとおりで、= や () は不要です。

 

  • サンプルファイルにこのプロシージャを収めていますのでご利用ください。

 

コンボボックスの更新後処理イベント

このコンボボックスの更新後処理イベントに下記プロシージャを記述しています。

Private Sub 年度選択_AfterUpdate()

    Call フレーム_AfterUpdate

    If Not IsNull(Me.リスト) Then '--- A
        Call リスト_AfterUpdate '--- B
    End If

End Sub
 
解説
  1. IsNull関数を用いて、リストボックスで値を選択している場合のみ、以降の処理に進みます。このように、IsNull関数はIf構文やSelect構文でよく利用されます。
    IsNull関数は、式に Null 値が含まれているかどうかを調べ、結果をブール値で返します。
  2. リスト_AfterUpdateは、リストというオブジェクトの更新後処理イベントを意味します。これをCall関数で呼び出し実行します。ここで注意して欲しいのは、リストというオブジェクトの更新後処理イベントに記述しているプロシージャを実行するだけであるということです。


社員別に有休保持日数を表示する

テキストボックスは何もデータを入力するだけの機能だけではありません。コントロールソースにDLookup関数を 用いてテーブルやクエリからデータを引っ張り出して表示させることができます。

DLookUp("[保持日数]","[tbl_社員マスター]","[年]=year(date()) And [入力者ID]=[職員ナンバー]")

 

上記のDLookUp関数を用いた式は、tbl_社員マスターの保持日数フィールドからデータを返しますが、条件として年フィールドで今年の値を持ち、且つ、入力者IDフィールドで職員ナンバー名のテキストボックスに格納されている値と合致するフィールドを指定しています。

 

関連ページ

 

大分長くなっちゃったので、今回は終了します。
 


社員別休暇申請閲覧フォームの作成_2:休暇申請管理ソフト


 

-Microsoft Access Club-