- 締切済み
アクセスのフォームで入力した分のみレポート表示
アクセス2002を使用しています。 フォームからテーブルに入力するようになっています。 現在フォームでコマンドボタンをクリックすると検索したものをレポート表示されるようになってるのですが別のコマンドボタンで入力した分だけをレポート表示するようにしたいのですが出来ません。 レポートを開く時にコードがありそれが邪魔してるようです。 レポートのコードは下記です。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If Me!プレス機 = "1" And Me!サンプル採取日 >= #5/26/2012# And Me!サンプル採取日 <= #8/6/2012# Then Me.Section(acDetail).BackColor = RGB(255, 0, 255) Else Me.Section(acDetail).BackColor = RGB(255, 255, 255) End If End Sub コマンドボタンをクリックすると実行時エラー2427 指定した式には値がありません。 とでて上記の If Me!プレス機 = "1" And Me!サンプル採取日 >= #5/26/2012# And Me!サンプル採取日 <= #8/6/2012# Then 部分に黄色いマークが付きます。 検索してプレビューする時などは問題なく表示されるのですがなぜでしょうか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
No5ではDAOを使用しているので、コード表で DAOの「ツール」→「参照設定」でDAOにチェックが 入っているか確認しておいてください。
- piroin654
- ベストアンサー率75% (692/917)
後々のスキルや管理などを考慮すれば、(3) の方法がいいのでは、と思いますが。 そこで、(3)の方法について。 (1) >フォームからテーブルに入力するようになっています。 このテーブルと同じ構造の空のテーブルを 一つ用意します。フィールドの内容は分からないので、 こちらで適当に設定して話を進めます。 そこで、「入力する」テーブル名を「データテーブル」、 同じ構造の空のテーブルを「Workテーブル」とします。 これらは実際に合わせて変更してください。 一応、話を進めるためにフィールド適当に設定します。 日付 日付/時刻型 商品名 テキスト型 個数 数値型 このようにします。これは二つのテーブルに 共通です。 (2) クエリを二つ作成します。 「Q_Workテーブルよりデータテーブルへ転記」 INSERT INTO データテーブル ( 日付, 品名, 個数 ) SELECT Workテーブル.日付, Workテーブル.品名, Workテーブル.個数 FROM Workテーブル; 「Q_Workテーブルのデータ削除」 DELETE Workテーブル.* FROM Workテーブル; 最初の「Q_Workテーブルよりデータテーブルへ転記」は追加クエリ です。二番目の「Q_Workテーブルのデータ削除」は削除クエリです。 (3) 次に、フォームの新規作成から、「Workテーブル」を 「基になるテーブルまたはクエリ」にして、「表形式」 のフォームを作成します。できたら適当な名前で 保存します。 (4) フォームをデザインビューで開き、詳細の部分を押し下げて ボタンを二つ設定します。 (5) 一つのボタンの名前を「cmdPost」として、このボタンの クリック時のイベントに以下を設定します。 Private Sub cmdPost_Click() Dim rs As DAO.Recordset Dim myRes As Integer Dim myString As String 'フォームに存在するレコードの確認 Set rs = Me.RecordsetClone If rs.RecordCount = 0 Then MsgBox ("データがありません。") Exit Sub End If '現在のレコードの確定 DoCmd.RunCommand acCmdSaveRecord 'レコードの転記と削除 myRes = MsgBox("このデータをデータテーブルへ転記します。フォームのレコードも削除します。よろしいでしょうか?", vbYesNo + vbQuestion + vbDefaultButton1, "データの転記") If myRes = vbYes Then DoCmd.SetWarnings False DoCmd.OpenQuery "Q_Workテーブルよりデータテーブルへ転記" MsgBox ("データの転記が終了しました。続いてデータの削除をします。") DoCmd.OpenQuery "Q_Workテーブルのデータ削除" DoCmd.SetWarnings True Me.Requery End If rs.Close: Set rs = Nothing End Sub (6) 二つ目のボタンの名前を「cmdOpenReport」とします。 このボタンのクリック時のイベントに以下を設定 します。 Private Sub cmdOpenReport_Click() '現在のレコードの確定 DoCmd.RunCommand acCmdSaveRecord DoCmd.OpenReport "R_Workデータ", acViewPreview End Sub (7) 次に、「Workテーブル」をレコードソースとする レポートを作成します。これも新規作成から 「表形式」のレポートを選択して作成します。 一応ここでは「R_Workデータ」とします。 以上です。一応これで機能を確認してみて、分からない ところがあれば補足してください。
- piroin654
- ベストアンサー率75% (692/917)
レポートのレコードソースが書き込む テーブルと同じなのか、あるいは クエリが設定してあるのかわかりませんが、 質問の内容を取り違えていなければ、 という前提で述べてみますと、 (1) テーブルに既に存在するレコードと、 新たに入力したレコードを区別できるように なっていますか? (2) もし、区別できるようになっていないならば、 たとえば、テーブルに新たにYes/No型の フィールドを設定し、新たに入力した レコードにチェックを入れながら、区別 する方法もあります。これならば レポート側のレコードソースにチェックの フィールドがあれば(非表示でいいですが) チェックがTrueになっているものを表示 する、というコードを付け足せばすみます。 (3) あるいは、検索するときのフォーム、テーブル、 レポートと、テーブルにレコードを書き込む ときのフォーム、テーブル、レポートを すべて別にして、レコードを書き込むときの テーブルはワークテーブルのようにし、 このワークテーブルに書き込んだレコードを 保存するテーブルに追加するようにすれば 新規に追加しようとするレコードのみを レポートに表示してすることはできます。 (4) ついでに、レポートのレコードソースは テーブルですか、あるいはクエリですか。 テーブルならば、 >フォームからテーブルに入力するようになっています。 と同じテーブルですか。 (5) >フォームからテーブルに入力するようになっています。 のテーブルはどんどん追加していくようになっているのでしょうか。 (6) フォームは単票フォームですか、あるいは 帳票フォームのようなものですか。あるいは サブフォームをもっているのでしょうか。
補足
1.区別はできないです。出来るようにする設定があるのでしょうか? 2.入力したらチェックを入れるという感じですか? 3.すべて同じものが2つある状態になるのでしょうか? 入力していくテーブルは検索・保存するテーブルに移動したらデータが何も無い状態になるようにできますか? 4.レポートはクエリです。 5.どんどんテーブルにデータが追加するようになっています。 6.表形式になっていて新規データを入力するように設定しています。 Private Sub Form_Open(Cancel As Integer) Me.AllowAdditions = True DoCmd.GoToRecord acDataForm, "フォーム名", acNewRec Me.品名.SetFocus End Sub 説明不足ですいません。 宜しくお願い致します。 後、マクロでもチャレンジしてみたのですができませんでした。 主キーフィールドじゃないとダメなのでしょうか? 更新されてるのし、クエリにも反映(入力したものも以前のも表示)されてるのですが入力した分だけでは表示されません。 マクロでは コマンド実行 コマンド:上書き保存 レポートを開く でWhere条件に [品名]=[Forms]![フォーム名][品名] これでも何も表示されませんでした。 できればマクロやVBAで解決できたらいいのですが。。。
- chayamati
- ベストアンサー率41% (260/624)
- puddingeater
- ベストアンサー率77% (28/36)
「別のコマンドボタンで入力した分だけをレポート表示する」時に、データが全くなかったからじゃないでしょうか。 レポートのレコードソースに指定しているクエリが1件以上レコードを返すか確認してみてください。
補足
入力してるにもかかわらずデータが全く無いのはなぜでしょうか? Private Sub コマンド69_Click() If Me.Dirty Then Me.Refresh End If DoCmd.OpenReport "開くレポート名", acViewPreview, , "[クエリのフィールド名] = " & Me.フォームのテキストボックス名 End Sub コードが間違ってるのでしょうか?
- m3_maki
- ベストアンサー率64% (296/460)
入力されたレコードが保存されていない状態ではないでしょうか? レポートを開くコードの前に If Me.Dirty Then Me.Refresh End If のようなコードを追加して、様子を見てください。
補足
DoCmd.OpenReport の前に追加してもやはりエラーが出てレポートが開けない状態になります。 If Me!プレス機 = "1" And Me!サンプル採取日 >= #5/26/2012# And Me!サンプル採取日 <= #8/6/2012# Then が黄色くなり指定した式には値がありませんとなります。
補足
確かに入力した分だけ表示できるようになりましたが以前フォームから品名を検索して 検索した品名だけをレポート表示できるようにしていましたがそれが機能しなくなります。 アクセスをあまりよく分からない人も使うので フォームは1つで検索もしたいのですが 検索イベントのコードに指定のテーブルを追加したらいいのでしょうか? 検索用コードは以下の通りです。 検索はデータテーブルからしたいです。 Private Sub 検索ボタン_Click() Dim L1 As String If Nz(Me.品名検索, "") <> "" Then L1 = L1 & " AND 品名 Like '*" & Me.品名検索 & "*'" End If If IsDate(Me.採取日開始) Then If IsNull(Me.採取日終了) Then L1 = L1 & " AND 採取日 = #" & Me.採取日開始 & "#" Else L1 = L1 & " AND 採取日 >= #" & Me.採取日開始 & "#" End If ElseIf Not IsNull(Me.採取日開始) Then MsgBox "正しい日付を入力してください。" Me.採取日開始.SetFocus Exit Sub End If If IsDate(Me.採取日終了) Then L1 = L1 & " AND 採取日 <= #" & Me.採取日終了 & "#" ElseIf Not IsNull(Me.採取日終了) Then MsgBox "正しい日付を入力してください。" Me.採取日終了.SetFocus Exit Sub End If If Nz(Me.厚み検索, "") <> "" Then L1 = L1 & " AND 厚み =" & Me.厚み検索 End If If L1 <> "" Then L1 = Mid(L1, 6) Me.Filter = L1 Me.FilterOn = True Else Me.Filter = L1 Me.FilterOn = False End If End Sub