アクセス2000で、試験結果の管理をしようと思っています。
試験によって合格点が違うので、合否結果はフラグ(1=合格、2=不合格)で管理しています。

フォームにボタンを作って、ボタンをクリックしたら合格者(あるいは不合格者)
だけを表示する形にしたのですが、受験日と合否のフラグの両方を条件として、
データの抽出を行いたいのですが、ボタンのコードビルダはどのようにしたら良いのでしょうか?ちなみに、ボタンを作った時の関連付けは受験日となっているのでコードは下記のようになっています。

Private Sub 抽出採用日_Click()
On Error GoTo Err_抽出採用日_Click
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = "対象者"
stLinkCriteria = "[受験日]=" & "#" & Me![受験日] & "#"
DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_抽出採用日_Click:
Exit Sub
Err_抽出採用日_Click:
MsgBox Err.Description
Resume Exit_抽出採用日_Click
End Sub

このQ&Aに関連する最新のQ&A

A 回答 (3件)

stLinkCriteria = "[受験日]=" & "#" & Me![受験日] & "#"



を、
stLinkCriteria = "[受験日]=" & "#" & FORMAT$(Me![受験日],"yyyy/mm/dd") & "# AND [合否結果] = " & Me.[合否結果]
のようにするとOKだと思います。

ちなみに、[受験日]をFORMAT関数で補強してあるのは、
Accessが01/03/05のようなデータを英語読みにして、2005/01/03だと思ってしまうのを防ぐためです。

実際にやって確かめたわけではないです。不明点とかあったら補足してくださいナ。
    • good
    • 0
この回答へのお礼

いや~。本当にありがとうございました。構文の中の & やら # などの意味は
よくわからないのですが、ご指導いただいたとおりにやってみたら、うまくいき
ました。
ありがとうございました。

お礼日時:2001/05/15 17:37

クエリーだけで対応可能です。


簡単なのはクエリーを作成して条件にフォーム名![受験日]やフォーム名![合否結果]としておきましょう。
これをクエリーを開くかフォームを開くか(この時は作成したクエリーを基にしたフォームを作る)すれば問題なし。

合否結果は1か2をラジオボタン等のイベントから隠しフィールドへ格納すればよいでしょう。

クエリーが分からないのであればテーブル構成等を提示願います。
    • good
    • 0

 アクセスのフォームはほとんど利用したことがないので、何とも言えないんですが、参考程度で見て下さい。


 通常アクセスやオラクルといった SQL 言語系のデータベースでは QUERY(クエリー) と呼ばれるモノがあります。コレは SQL 言語を登録しておく機能なんですが、このクエリーを使えば簡単に実現できると思います(更新できるかはよく分かりませんが…)。

 本格的なRDBを目指すなら、まず以下のテーブルを仮定します。

テーブル名/項目
生徒テーブル/生徒ID・生徒名
教科テーブル/教科ID・教科名
テストテーブル/テストID・テスト日付・教科ID・テスト名・合格点
テスト成績テーブル/テストID・生徒ID・点数

で、クエリーを用意します(SQL で記述しますね)
------------------------------------------------------------------
SELECT
テストテーブル.テスト日付,
テストテーブル.テスト名,
教科テーブル.教科名,
生徒テーブル.氏名,
テスト成績テーブル.成績,
IIf((([テストテーブル].[合格点])<=[テスト成績テーブル.成績]),"合格","不合格")
AS 合否
FROM
生徒テーブル INNER JOIN (
教科テーブル INNER JOIN (
テストテーブル INNER JOIN テスト成績テーブル ON
テストテーブル.テストID = テスト成績テーブル.テストID) ON
教科テーブル.教科ID = テストテーブル.教科ID)
ON 生徒テーブル.生徒ID = テスト成績テーブル.生徒ID
WHERE
(([テストテーブル.テスト日付]=[日付])) AND
([テストテーブル].[合格点]<=[テスト成績テーブル.成績])
ORDER BY
テストテーブル.テスト日付, テスト成績テーブル.成績 DESC;
------------------------------------------------------------------
 こんな感じですかね。これでクエリーを開くと最初に日付の入力を求めてきますので、欲しい日付を入力すると、その一覧が出てきます。
(データ用意する暇なかったんで、ほとんど検証してないですが(^^;)

もっと簡単にするなら…
------------------------------------------------------------------
テストテーブル:テスト名・教科名・テスト日付・生徒名・点数・合格点
クエリー
SELECT
テストテーブル.テスト名,
テストテーブル.教科名,
テストテーブル.テスト日付,
テストテーブル.生徒名,
テストテーブル.点数,
 テストテーブル.合格点
FROM
テストテーブル
WHERE
[テストテーブル.点数] >= [テストテーブル.合格点]
ORDER BY
テストテーブル.点数 DESC
------------------------------------------------------------------
これは直書きなんで自信なしですが(^^;

 データベースの基本は、データ管理と表示部を分けることです。また本来は、同じ意味を持つデータを持たないようにするのがセオリーです。その事から行くと、2番目の解は違反してますがね。
 とにかく、一度クエリーを試してみてはいかがでしょうか?
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

QVBAで指定したパスが存在しなければ、アラートを表示させずにExit Subの処理をしたい

Sub s()
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate ("X:")
End Sub

上記のVBAを実行するとXドライブがなければ
「'file:///X:' が見つかりません。パスまたはインターネットアドレスが正しいかどうかを確認してください。」と表示されます。
指定したパスが存在しなければ、このメッセージを表示させずにExit Subの処理をするようにするにはどうすればよいのでしょうか?

使用OS:Windows XP
使用ソフト:Microsoft Excel 2003

ご存知の方がおられましたらご回答をよろしくお願いします。

Aベストアンサー

こんばんは。
インターネット共用となると、以下のコードでは中途半端になりますが、以下のように区分けは出来ます。


'---------------------------
  Dim fso As Object
  Dim objIE As Object
  Dim flg As Boolean
  Const mDrive As String = "C:"
  If InStr(1, mDrive, "HTTP://", vbTextCompare) = 0 Then
    Set fso = CreateObject("Scripting.FileSystemObject")
    flg = fso.DriveExists(mDrive)
    If flg Then
      Set objIE = CreateObject("InternetExplorer.Application")
      objIE.Navigate mDrive
    End If
    Set fso = Nothing
    Set objIE = Nothing
  End If
'---------------------------

こんばんは。
インターネット共用となると、以下のコードでは中途半端になりますが、以下のように区分けは出来ます。


'---------------------------
  Dim fso As Object
  Dim objIE As Object
  Dim flg As Boolean
  Const mDrive As String = "C:"
  If InStr(1, mDrive, "HTTP://", vbTextCompare) = 0 Then
    Set fso = CreateObject("Scripting.FileSystemObject")
    flg = fso.DriveExists(mDrive)
    If flg Then
      Set objIE = CreateObject("Inte...続きを読む

QVBA Private Sub Worksheet_Calculate()

「ユーザー定義関数」で計算されるセルがセルB2にある場合、シートモジュールの
Private Sub Worksheet_Calculate()で、他の再計算は無視し、そのユーザー定義関数が計算されたことを判断するためにはどのような記述をすればいいのでしょうか?

Aベストアンサー

こんにちは。

大分梃子摺っていらっしゃいますね。
今回のコードでシート名の変更を捕らえたければ
Calculateイベントではなく
ユーザー定義関数そのものでやったらどうですか。

間違いなくする為に、新しいブックで以下のコードをテストしてください。


簡単の為に、"sheet1"だけの変更に対応。

---------------------------------------------
(標準モジュール)


Public OldName As String 'パブリック変数


Function Sheetname(ByVal Target As Range) As String

 Application.Volatile
 Sheetname = Target.Parent.Name

 If OldName = "" Then
   OldName = Sheetname
 End If

 If OldName <> Sheetname Then
  MsgBox OldName & "が " & Sheetname & " に変更されました"
  OldName = Sheetname
  End If

End Function
---------------------------------------------

コードを書いたあと、Sheet1のA1に、=sheetname(A1) を入れておく


ようは、以前のシート名を保持しておき
ユーザー定義関数が再計算されるとき比較するだけです。

もちろん、Calculateイベントで同様のことをしてもOKですよね。

何回も言うようですが、このサンプルは、ユーザー定義関数の入っている、シート1つだけに対応です。

全てのシートに対応したい場合は、ちょっと考えてみてください。
以上です。
 

こんにちは。

大分梃子摺っていらっしゃいますね。
今回のコードでシート名の変更を捕らえたければ
Calculateイベントではなく
ユーザー定義関数そのものでやったらどうですか。

間違いなくする為に、新しいブックで以下のコードをテストしてください。


簡単の為に、"sheet1"だけの変更に対応。

---------------------------------------------
(標準モジュール)


Public OldName As String 'パブリック変数


Function Sheetname(ByVal Target As Range) As String

 Application...続きを読む

QMS_ACCESSのクエリーの抽出について

クロス集計をする際に空白の部分は表示しないようにしたいと思っています。
空白以外を集計というやり方はどうすればよいでしょうか?

Aベストアンサー

 No.1の続きです。
 値が空白となる部分の見出しを表示したくないという意味でしょうか。
 それならば、値の集計対象としているフィールドを
Is Not Null
で抽出するカラムを一つ追加すればよいと思います。

Qエクセルデータ処理(フラグ立て)

エクセルデータ処理(フラグ立て)
次のようなデータがあります。

これに対して次のようなルールで、右側にフラグをつけたいどうすればいいか。
条件データは時系列に昇順、あるいは降順になっている。必要なら適当にソートできる。
フラグ付与ルール
(1)同一日付のデータ数が2件以下ならそのデータの横にはすべて1をつける
(2)同一日付のデータ数が3件以上ならそのデータの最上部と最下部の横に1をつける
((2)はある意味で(1)を含んでいるといえますが)
(質問)セルに、なんか式を書くことで処理できますか。考えてわからなかったので質問します。

時間(a1)
2006/1/26 16:50
2006/1/26 16:50
2006/1/26 16:50
2006/1/26 16:48
2006/1/26 16:46
2006/1/26 16:44
2006/1/26 16:43
2006/1/26 16:43
2006/1/26 16:43
2006/1/24 18:35
2006/1/24 18:35
2006/1/22 10:35
2006/1/21 16:50
2006/1/21 16:50
2006/1/21 16:50
2006/1/21 16:48
結果例
時間(a1セル)
2006/1/26 16:501
2006/1/26 16:50
2006/1/26 16:50
2006/1/26 16:48
2006/1/26 16:46
2006/1/26 16:44
2006/1/26 16:43
2006/1/26 16:43
2006/1/26 16:431
2006/1/24 18:351
2006/1/24 18:351
2006/1/22 10:351
2006/1/21 16:501
2006/1/21 16:50
2006/1/21 16:50
2006/1/21 16:481

エクセルデータ処理(フラグ立て)
次のようなデータがあります。

これに対して次のようなルールで、右側にフラグをつけたいどうすればいいか。
条件データは時系列に昇順、あるいは降順になっている。必要なら適当にソートできる。
フラグ付与ルール
(1)同一日付のデータ数が2件以下ならそのデータの横にはすべて1をつける
(2)同一日付のデータ数が3件以上ならそのデータの最上部と最下部の横に1をつける
((2)はある意味で(1)を含んでいるといえますが)
(質問)セルに、なんか式を書くことで処理で...続きを読む

Aベストアンサー

=IF(AND(ISNUMBER(A3),ISNUMBER(A5)),IF(ROUNDDOWN(A3,0)=ROUNDDOWN(A5,0),"",1),1)

一つ上の行と、一つ下の行で違った場合い「1」と言い換えられますよね?

QExitイベントから自分自身のコントロールにSetfocusしたい

ACCESS2000のフォームのことで質問します。
(実際のフォームは項目が複雑なので、簡単な例にして説明します。)

フォーム上にテキストボックスTB1とTB2があり、共に必須入力項目です。
TB1_Exit内でisnull(TB1)のときMsgboxでエラー表示後TB1.setfocusしているのですがTB2にタブ順で移動してしまいます。
また、フォーム開いてすぐに閉じるときにもTB1_Exitが働いてしまい上記エラーが発生してしまいます。

質問1>Exitイベントから自分自身にSetfocusする方法はありますか?

質問2>フォームを閉じるときはTB1_Exitをさせない方法はありますか?

質問3>これらの問題はTB1の入力チェックをTB1_Exitでしていることが問題なのだと思うのですが、他にどういう方法がありますか?チェックさせるためのボタンを用意してそのClickイベントでチェックさせるしかないでしょうか。

早急に完成させなければならず、大変困っております。どうかよろしくお願いいたします。

Aベストアンサー

MSAccess2000での開発経験は少ないですが、MSAccess97までなら全バージョンで
経験があります。Accessとは結構長いお付き合いです。

質問1>Exitイベントから自分自身にSetfocusする方法はありますか?

残念ながら無いはずです。

質問2>フォームを閉じるときはTB1_Exitをさせない方法はありますか?

これも方法が無いはずです。

質問3>これらの問題はTB1の入力チェックをTB1_Exitでしていることが問題なのだと思うのですが、他にどういう方法がありますか?チェックさせるためのボタンを用意してそのClickイベントでチェックさせるしかないでしょうか。

そのとおりです。

なお、ヘルプを見ると各項目の BeforeUpdate イベントでチェック
できるように見えますが、実際には Cancel を True にしても
素通りしてしまいますので、強制チェック機能として使用できません。
※Access95まではヘルプどおりに使用できました。

よって、登録ボタンなどや、 連結フォームでの レコードの BeforeUpdate
イベントでチェックするしか方法はありません。

以上

MSAccess2000での開発経験は少ないですが、MSAccess97までなら全バージョンで
経験があります。Accessとは結構長いお付き合いです。

質問1>Exitイベントから自分自身にSetfocusする方法はありますか?

残念ながら無いはずです。

質問2>フォームを閉じるときはTB1_Exitをさせない方法はありますか?

これも方法が無いはずです。

質問3>これらの問題はTB1の入力チェックをTB1_Exitでしていることが問題なのだと思うのですが、他にどういう方法がありますか?チェックさせるためのボタ...続きを読む


人気Q&Aランキング

おすすめ情報