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へ戻る