dポイントプレゼントキャンペーン実施中!

アクセス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
部分に黄色いマークが付きます。

検索してプレビューする時などは問題なく表示されるのですがなぜでしょうか?

A 回答 (6件)

No5ではDAOを使用しているので、コード表で


DAOの「ツール」→「参照設定」でDAOにチェックが
入っているか確認しておいてください。
    • good
    • 0

後々のスキルや管理などを考慮すれば、(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データ」とします。


以上です。一応これで機能を確認してみて、分からない
ところがあれば補足してください。

この回答への補足

確かに入力した分だけ表示できるようになりましたが以前フォームから品名を検索して
検索した品名だけをレポート表示できるようにしていましたがそれが機能しなくなります。
アクセスをあまりよく分からない人も使うので
フォームは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

補足日時:2013/12/09 09:22
    • good
    • 0

レポートのレコードソースが書き込む


テーブルと同じなのか、あるいは
クエリが設定してあるのかわかりませんが、
質問の内容を取り違えていなければ、
という前提で述べてみますと、

(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で解決できたらいいのですが。。。

補足日時:2013/12/04 11:53
    • good
    • 0

ACCESSは1つのレコードの入力した瞬間テーブル内では区別できません。


フォームを画面のまま印刷することはできます。

【ファイル】⇒【印刷】

尚、ボックスのプロパティーで、書式タブの下の方に
表示対象を(印刷/画面、印刷のみ、画面のみ)より選ぶことができます。
「アクセスのフォームで入力した分のみレポー」の回答画像3
    • good
    • 0

「別のコマンドボタンで入力した分だけをレポート表示する」時に、データが全くなかったからじゃないでしょうか。


レポートのレコードソースに指定しているクエリが1件以上レコードを返すか確認してみてください。

この回答への補足

入力してるにもかかわらずデータが全く無いのはなぜでしょうか?

Private Sub コマンド69_Click()

If Me.Dirty Then
Me.Refresh
End If

DoCmd.OpenReport "開くレポート名", acViewPreview, , "[クエリのフィールド名] = " & Me.フォームのテキストボックス名
End Sub

コードが間違ってるのでしょうか?

補足日時:2013/12/02 16:33
    • good
    • 0

入力されたレコードが保存されていない状態ではないでしょうか?



レポートを開くコードの前に

If Me.Dirty Then
  Me.Refresh
End If

のようなコードを追加して、様子を見てください。

この回答への補足

DoCmd.OpenReport
の前に追加してもやはりエラーが出てレポートが開けない状態になります。
If Me!プレス機 = "1" And Me!サンプル採取日 >= #5/26/2012# And Me!サンプル採取日 <= #8/6/2012# Then

が黄色くなり指定した式には値がありませんとなります。

補足日時:2013/11/29 15:26
    • good
    • 0

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