雑なメモ(無保証)

Microsoft Access


営業日数を求める


指定した二つの日付の間の営業日数を求める。
営業日数とは、土日祝を除いた日数のこと。
祝日が土曜日の場合にも対応。

祝日テーブル、PublicHolidayTBLに祝日の日付を日付型(例:2006/06/03)で登録しておく。


Private Sub Form_Open(Cancel As Integer)
    Dim str_start As String    '開始日(文字列型)
    Dim str_end As String '終了日(文字列型)
    Dim d_start As Date           '開始日(日付型)
    Dim d_end As Date              '終了日(日付型)
    Dim weekday_cnt As Integer     '平日カウンタ
    Dim w_date As Date               '日付カウンタ

    '開始日終了日を文字列型(例:20060603)で成形する
    str_start = CStr(Year(Date)) + Format(CStr(Month(Date) - 1),
"00") + "16"
    str_end = CStr(Year(Date)) + Format(CStr(Month(Date)), "00") +
"15"

    '開始日終了日を日付型に変換する
    d_start = CDate(Format(str_start, "@@@@/@@/@@"))
    d_end = CDate(Format(str_end, "@@@@/@@/@@"))

    weekday_cnt = 0

    '平日の日数を数える
    For w_date = d_start To d_end
        weekday_cnt = weekday_cnt + Choose(Weekday(w_date), 0, 1,
1, 1, 1, 1, 0)
    Next

    '祝日をチェック
    Dim db As Database
    Dim rs As Recordset
    Dim orderstr As String
    Dim cnt As Long

    orderstr = "SELECT * FROM PublicHolidayTBL ORDER BY
publicholiday"

    Set db = CurrentDb
    Set rs = db.OpenRecordset(orderstr, dbOpenSnapshot)

    rs.MoveFirst
    cnt = 0

    '二つの日付間の祝日を数える
    '祝日が土曜日の場合はカウントしない
    Do Until rs.EOF
        If d_start <= rs!publicholiday Then
            If rs!publicholiday <= d_end Then
                If Weekday(rs!publicholiday) <> 7 Then
                    cnt = cnt + 1
                End If
            End If
        End If
        rs.MoveNext
    Loop

    Me!営業日数 = weekday_cnt - cnt

    rs.Close
    db.Close

End Sub
※未検証です。
※祝日が日曜日の場合は、・・・カウントしてるから・・・、月曜日が振休の場合も数的にはあってるかな?




文字を入力してレコードを検索

2006/05/25
1.とりあえず、検索対象のテーブルからオートフォームでフォームを作っとく。
2.検索文字を入力するテキストエリアを追加。
3.以下のコードをイベントプロシージャに記述する。


Private Sub SearchKey_Exit(Cancel As Integer)
   Dim rs As Recordset
   Set rs = Me.RecordsetClone

   rs.FindFirst "[検索対象フィールド] = " & SearchKey

   If rs.NoMatch Then
       Beep
       MsgBox ("該当するレコードがありません")
   Else
       Me.Bookmark = rs.Bookmark
   End If

   rs.Close

End Sub


SearchKey_Exitはフォーカスが移動したあと実行される関数らしい。
FindFirstはレコードを先頭から検索する関数。
検索対象フィールドの後ろの「=」が入る理由がわからないがこれで良いらしい。
検索対象と検索文字は同じ型じゃないと検索できない。
「BookMark」は現在の表示対象レコードをさしてるらしい。
「rs」はクローン?らしいんで、「Me」(現在表示しているフォーム)に代入しないといけないらしい。



サブレポートで並び替え

2006/04/18
クエリを作ってそこで並び替えを行い、クエリでサブレポートを作るとできる。
(もっといい方法があるかも)


クエリでテーブルの先頭5レコードのみ抽出する

2006/04/18
クエリのデザインビューの画面で、下半分の領域を選択し、
右クリック→プロパティで、クエリプロパティが表示されるので、
[トップ値]に5を指定。



サブフォームのデータを並び替える

2006/04/18
サブフォームのイベント「開く時」に以下のVBAコードを追加。
Private Sub Form_Open(Cancel As Integer)
Me.OrderBy = "(並べ替え項目)"
Me.OrderByOn = True
End Sub

降順にしたいときは、
Me.OrderBy = "(並べ替え項目) DESC"
とする。



年齢自動計算

2006/04/14
イベントプロシージャで[生年月日]ボックスに値が入力された後、[年齢]ボックスに計算した年齢を入れる。

[生年月日]ボックスに以下のVBAコードを設定する

Private Sub 生年月日_Exit(Cancel As Integer)
If IsNull(Me!生年月日) Then
GoTo exit_shori
End If
Me!年齢 = DateDiff("yyyy", Me!生年月日, Date)
If Format(Me!生年月日 - 1, "mm/dd") > Format(Date, "mm/dd") Then
Me!年齢 = Me!年齢 - 1
End If
exit_shori:
End Sub

年齢テキストボックスは[編集ロック=はい]にして編集されるのを防ぐ。
編集ロックはタブオーダー設定されているとできないみたいなので、年齢テキストボックスのタブオーダーをはずしておく。



サブテーブルを作る

2006/04/11
テーブルのデータシートビューでメニューの[挿入]-[サブデータシート]を実行。
すると、なんかテーブルの選択画面が出てくるので、挿入するテーブルを選ぶ。
「リンク子フィールド」と「リンク親フィールド」は、
なんか関連付けするフィールドみたいなので、
それぞれが対応しているフィールドを選ぶ。
データシートビューでは、一個しか指定できない。
フォームだと何個でも貼り付けられるみたい。

フォームにサブフォーム(サブデータ)を貼り付けるときは、
フォームをデザインビューで開いて、窓の左端に出てきたツールバーから、
「サブフォーム/サブレポート」をクリクリッ。
窓が出てくるので、貼り付けたいフォームを選んで、
あとは、なんか聞いてくるけど、そのままOK!

で完成。



郵便番号から住所を自動で入力させる

2006/04/11
テーブルのデザインビューで「郵便番号」とかの項目を選択後、
下のほうにある標準タブから「住所入力支援」をクリクリッ。
右側に出てきた「・・・」ボタンを押すとウィザードが立ち上がるので
後は、指示に従うだけで完成。まぁ、便利2!


漢字で名前を入力すると振り仮名を自動で入力させる

2006/04/11
テーブルのデザインビューで「氏名」とかの項目を選択後、
下のほうにある標準タブから「ふりがな」をクリクリッ。
右側に出てきた「・・・」ボタンを押すとウィザードが立ち上がるので
後は、指示に従うだけで完成。まぁ、便利!


自動的に番号を振る

2006/04/04
フォームのイベントタグで実現してみた。
イベントタブ内にあるトリガを選択して下記のコードを追加。


Me!No = DMAX("No","TableA") + 1
これだけ。
フォーム内の「No」テキストボックスに、「TableA」の中の
「No」フィールド中で一番大きい数字を取り出して1加算して
代入。

ところで、トリガの名称で「ダーティー時」ってあるんだけど、
「汚れた時」?「入力時」の方がしっくり来るんですけど。。。


FrontPageへ戻る



最終更新 2006/07/22 18:05:38 - llinfo_arp
(2006/04/05 15:10:57 作成)


Amazon