出産前後の痔にはご注意!

ビスタでAccess2007を使っています

あるテーブルにA~Dまでのフィールドが設定されています。

フォームでフィールドA.Bは手入力して
C.Dには計算式を設定して計算結果を表示させていますがテーブルに反映されません。
(フォームにはきちんど式通りの答えが表示されますがテーブルのフィールドC.Dは空っぽです。)


A・・・10,000
B・・・0.1
C・・・1,000(計算式 A*B)
D・・・9,000(計算式 A-C)

フォーム上で行った計算結果をテーブルに入力反映させるにはどうすればよいでしょうか?
テーブルやフォームの作り方が悪いのか?
計算式の設定が悪いのか?
なぜテーブルに反映しないのか理由がわかりません。

そもそもフォーム上での計算はテーブルには反映しないのか?
だとすれば反映させるにはどうすればよいのでしょうか?
テーブルのフィールドに計算式を設定することは出来るのでしょうか?
出来るとすればその方法は?

疑問だらけでどうすれば求める結果が得られるのかさっぱり解りません。
当方Access2007は初心者も同然ですのでわかりやすく解説して戴ければ幸いです。
よろしくご教授ください。

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

A 回答 (5件)

#1です。


2007の試用版で確認したらマクロツール-デザインリボンの
全てのアクションの表示をクリックすると値の代入コマンドが
現れるようです。
「Access2007 フォームでの計算結」の回答画像5
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
なかなかうまくいきませんが何とか結果をだそうと思います。
回答ありがとうございました。

お礼日時:2009/12/24 13:13

#3です



> テーブルにも「計算C.D」のフィールドを追加しなくてもよいのでしょうか?
> それともフォーム上だけでいいですか?

ごめんなさい。
私の書き方が悪かったのか、・・・・

コントロールソースを使いたさそうな感じがしたので、前回の回答になってしまいました。
前回のは、値用、計算表示用を分けて考えたので、「計算C,D」はフォーム上だけのものになります。

ただ、前回のは[A][B]の入力で、[C][D]を確定させるやり方になります。

書き忘れていましたが、[C][D]は、連結状態であることが基本となります。
(コントロールソースは計算式ではなく、テーブル/クエリのフィールド名が指定されている)

通常操作では、[A][B]を入力したら[C][D]は計算するけど、
この時だけは、[C][D]を計算式以外の値を入力したい、とかあったとすると、
また違った方法をとることになります。
(コントロールソースを使用しないやり方)


一度、新規accdbとかにサンプルテーブルを作成してみて、
小さい環境で確かめられるとよいと思います。
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ございません。
なかなかうまくいきませんが何とか結果をだそうと思います。
回答ありがとうございました。

お礼日時:2009/12/24 13:14

フォーム上の話で良いですよね。



値を扱うもの、計算結果を表示するものを分けて考えます。

C, D の値を扱うものはそのままで、「可視」を「いいえ」としておきます。

計算結果を表示するテキストボックスを追加します。(C, D をコピーしてもOK)
テキストボックスの名前を「計算C」「計算D」と仮定します。

それぞれのコントロールソースを設定します。
「計算C」は、 =[A]*[B]
「計算D」は、 =[A]-[計算C]

A, B に入力があると「計算C」「計算D」に結果が表示されますが、
このままでは値を扱う「C」「D」は更新されないので、
フォームの「更新前処理」で値を設定してあげます。

Private Sub Form_BeforeUpdate(Cancel As Integer)
  Me.C = Me.計算C
  Me.D = Me.計算D
End Sub



テキストボックス「計算C」「計算D」のプロパティは必要に合わせ設定してください。
文字配置 / 編集ロック / タブストップ 等

この回答への補足

回答ありがとうございます。

テーブルにも「計算C.D」のフィールドを追加しなくてもよいのでしょうか?
それともフォーム上だけでいいですか?

よろしくご教授ください。

補足日時:2009/12/18 19:44
    • good
    • 1

>C.Dともに各プロパティシートのデータタブ内のコントロールソース



やはりコントロールソースを変更しちゃっているのですね。
この状態はフォームコントロールの名前はCやDですが、テーブル
とは切り離されていますので、反映されないわけです。
コントロールソースはC、Dの元に戻し、とりあえずイベントの
フォーカス取得時にマクロを設定してみてください。
フォームデザインを開いたままで、マクロの作成を行い、
画像のようにアイテムに[FORMS]![本当のフォームの名称]![C]
式に[FORMS]![本当のフォームの名称]![A]*[FORMS]![本当のフォームの名称]![B]
と入れて登録して動かしてみてください。
「Access2007 フォームでの計算結」の回答画像2

この回答への補足

再びの回答ありがとうございます。

アクセス2007のどこを探せばよいのでしょうか?
「値の代入」というアクションを見つけることが
出来ません・・・。

なにぶんマクロはさっぱり理解しておりませんので
もう少し詳しい手順をご教授ください。

よろしくお願いいたします。

補足日時:2009/12/18 19:40
    • good
    • 0

>C.Dには計算式を設定して計算結果を表示させています


これはどのようにされていますか?(マクロ?VBA?)
もしコントロールソースに最初 C と入っていた場所に
=[A]*[B]のようにされたのであれば、フォーム「C」は
テーブルのC列から切り離されて、唯の計算結果を表す場所と
なっていますので、当然CやD列には保存されません。
マクロでされるのであればイベントの所のフォームA、Bの変更時と
フォームCのフォーカス取得時に値の代入マクロを作成しセットして
おくと良いのではないでしょうか。
(当方2000しかないので2007と違うので正確にお伝えできませんので、雰囲気読み取ってもらえれば。。)

この回答への補足

C.Dともに各プロパティシートの
データタブ内のコントロールソースと
イベントタブ内の更新前処理に
それぞれ同じ式が入っています。

マクロはいまひとつ良く理解できていないので・・・

補足日時:2009/12/17 11:14
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

Qアクセス: フォーム上で計算した数字をテーブルに保存したい。

 こんばんは。また質問させてもらいます・・。
これがアクセスに関して、最後の質問になるようにしたいです!!

 さて、フォームに入力したものは自動的にテーブルに保存されます。
しかし、フォーム上で計算したものは、テーブルに反映されていませんでした。
過去の質問にフォーム上計算したものは、テーブルに反映されないということがわかりました。
では、一体どうすればいいのでしょうか。

 フォームのコントロールソースには
=([QTY]*[COST]) 数量*値段を入れています。

どうすれば、テーブルに表示できるでしょうか。
ご教授お願いいたします。

過去の質問は、こちらを参考しました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1002073

Aベストアンサー

クエリーを覚えると便利です。
テーブル=オペレーターが入力したりする項目
クエリー=テーブルのデータプラスそれから計算出来るさまざまな項目

例えばQTYとCOSTはテーブルに
合計は 合計:[QTY]*[COST}
というようにクエリーに追加すれば、テーブルに
合計という項目を持つ必要がありません。
テーブルの「合計」を削除しても差支えありません。

また入力日という項目をテーブルに持ち
後の整理の目的でクエリーには
年:Year([入力日])
月:Month([入力日])
などとする事も可能です。

これで何年何月のデータだけを抽出したい場合でも
クエリーの抽出条件に 2004 とか 8(月)とかを
入力するだけでOKです。

合計、平均、最大、最小なども....

データベースはクエリーにあるレコードをいちいち保存するのではなく、計算式だけを覚えていて、開くたびに
計算して表示してくれるだけなのです。

Qフォームの計算がテーブルに反映するには?

Windows2000/ACCESS2000を使用してます。
フォームで自動的に合計や消費税が計算されるように設定しましたが、保存されたテーブルを見てみると合計や消費税は空白になっていて計算された値が入力されてませんでした。
フォームでの計算式は以下のように設定しました。
合計のフィールドを選んで、プロパティを開きその中のデータタブのコントロールソースに式ビルダーで、 =A+B と設定しました。フォーム上では計算されるの
ですが・・・
どのようにしたらテーブルに計算された値が表示されるのでしょうか?
宜しくお願いします。

Aベストアンサー

no.1のものです。

No.3のお礼に対しての回答です。

フォームの計算させている名前は別のものにして下さい。
そして、フォームで計算させているところと、テーブルの方で
入力させたいところの書式は同じものにしてください。


実際にやってみた結果です。

テーブル:テーブル1
a[数値]
b[数値]
kotae[数値]

フォーム:テーブル1
a
b
kotae2[数値]
(計算式は  =[a]+[b])

フォーム上につくったボタンのコード

Private Sub コマンド6_Click()

Me![kotae] = Me![kotae2]

End Sub


です。

試してみてください。

QAccess フォーム上で計算する方法とそれをテーブルに反映させる方法を教えてください。

こんばんは。色々試したのですが、わかりませんでしたので質問します。
Accessのフォーム上で計算する方法とそれをテーブルに反映させる方法を教えてください。

サブフォーム入りのサブフォームの中の、「売上」と「原価」を入力すると自動的に「原価率」が表示させ、その「原価率」をテーブルに反映させたいのですが、どうしたらよいのでしょうか。

途中まで考えたのは、選択クエリ上で計算させて、それをフォームにしたら表示のみは出来たのですが、テーブルに反映させる方法までたどりつきませんでした。
どうぞ宜しくお願い致します。

Aベストアンサー

> プロパティ-更新後処理のところに
> Me![原価率]= Me![原価]/Me![売上げ] と式を入れました。

更新後処理の横に…となっているところがあるのでそこをクリックして
コードビルダを選択すると(原価の場合)
Private Sub 原価_AfterUpdate()

End Sub
と表示されるので
Private Sub 原価_AfterUpdate()
    Me![原価率]= Me![原価]/Me![売上げ]
End Sub
となるようにしてください。
各コントロールが存在するものとして考えてます。

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

よろしくお願い致します。

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

QACCESS フォームで入力した日付をクエリで読み

ACCESS フォームで入力した日付をクエリで読み替えたい

ACCESS フォームで入力した日付をクエリで使用しているテーブルの書式に変換したい

フォーム テキスト名:日付にyyyymmdd で入力します

クエリ テキスト名:日付はパラメータとして使用しています
クエリ内で使用しているテーブルの日付書式は 日付:yyyy/mm/ddです

パラメータは 「日付始」と「日付終」の2箇所のテキストに入力されたデータを使用しています。以下がパラメータです。

Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終]

フォームのテキストボックスにyyyymmddと入力してもクエリでエラーが出ることない パラメータを日付に設定したいのですがどうしたらよいでしょうか?

ちなみに、以下の式を入れたらエラーです。

Between CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) and CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) と入力しましたところ、、、、「式が複雑すぎるか、、、」のエラーメッセージが出てしまいました。
どなたか助けてください。お願い致します。

ACCESS フォームで入力した日付をクエリで読み替えたい

ACCESS フォームで入力した日付をクエリで使用しているテーブルの書式に変換したい

フォーム テキスト名:日付にyyyymmdd で入力します

クエリ テキスト名:日付はパラメータとして使用しています
クエリ内で使用しているテーブルの日付書式は 日付:yyyy/mm/ddです

パラメータは 「日付始」と「日付終」の2箇所のテキストに入力されたデータを使用しています。以下がパラメータです。

Between [Forms]![フォーム]![日付始] and [...続きを読む

Aベストアンサー

> Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終]
これで合ってると思います。

> クエリ内で使用しているテーブルの日付書式は 日付:yyyy/mm/ddです
フォームの値が正しく日付として認識できてますか?
YYYYMMDDのつもりで8桁の入力なら、ダメですよ。
YYYYMMDDのつもりの8桁の入力なら、betweenを設定する日付の列をformat文で
yyyymmddに編集してテキスト同士として比較するとか。

QACCESSサブフォームにデータ反映されない

よろしくお願いします。

Access2010を使っています。
メインフォームにあるテキストボックス2つに条件を入力し、
抽出したデータをサブフォームで表示させたいと思います。

●メインフォーム名「フォーム1」
テキストボックス2つ「tex1」「tex2」

●データ元クエリ「q1」
フィールド名「ID1」「ID2」「Name」

●サブフォームSQL
SELECT q1.Name
FROM q1
WHERE (((q1.ID1) = Forms![フォーム1]!tex1) And
((q1.ID2) = Forms![フォーム1]!tex2)));


フォームを開き、tex1とtex2に入力してもサブフォーム表示が変わりません。
サブフォームをデータシートで別に開くと、データ抽出できていることは確認できました。

サブフォームのコントロールソースへSQLを入力するだけでは、
メインフォーム内でのデータは反映されないんでしょうか??

Aベストアンサー

>サブフォームをデータシートで別に開くと、
>データ抽出できていることは確認できました。

の部分がよくわかりませんが。


普通は、たとえば、
メインフォームにボタンを一つ
設定し、そのボタンのクリックイベントで、

Private Sub コマンド0_Click()
Me!埋め込み0.Requery
End Sub

のように設定します。
ここで、「埋め込み0」というのはメインフォームの
デザインビューでサブフォームを表示するために
設定するコントロールのことで、サブフォーム
そのもではありません。初期値は「埋め込み0」
のような名前になっています。サブフォームと
同じ名前に設定しているならば、「埋め込み0」
のところをサブフォームと同じ名前に置き換えても
かまいません。


そのほかには、「tex2」の更新後処理に同様に、

Private Sub tex2_AfterUpdate()
Me!埋め込み0.Requery
End Sub

のように設定してもいいのですが、この場合には
「tex2」に入力後、一旦フォーカスを移動させる
必要があります。たとえば「tx1」にマウスを
移動させてクリックするとか。それによって
「tex2」の更新後処理が起動されます。

>サブフォームをデータシートで別に開くと、
>データ抽出できていることは確認できました。

の部分がよくわかりませんが。


普通は、たとえば、
メインフォームにボタンを一つ
設定し、そのボタンのクリックイベントで、

Private Sub コマンド0_Click()
Me!埋め込み0.Requery
End Sub

のように設定します。
ここで、「埋め込み0」というのはメインフォームの
デザインビューでサブフォームを表示するために
設定するコントロールのことで、サブフォーム
そのもではありません。初期値は「埋め込み0」
のよう...続きを読む

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Qクエリのデータをテーブルに入れたい

アクセス2000での話なんですけど、
クエリではじき出したデータをテーブルに保存したいんですけど、具体的にはどうすればよいのでしょう?
当方、超・超・超初心者なので詳しくお願いします。
わがままで、すみません。

Aベストアンサー

>クエリではじき出した

ということは、その「選択クエリー」(まぁ、普通のクエリーですね)をご自分で作られたわけですよね。
とすると話は簡単で、
その「選択クエリー」をデザインモードで開いて、そのときの画面上方のメニューに[クエリ]がありますから、そこから
(1)既存のテーブルに追加保存したい場合は「追加」を
(2)新規にテーブルを作って保存したい場合は「テーブル作成」を選択します。

各々、選択したときに保存対象とするテーブル名を訊いてきますので(1)なら既存のテーブル名、(2)なら新規に作成したいテーブル名を入力します。

こうすることで「選択クエリー」は「追加クエリー」または「テーブル作成クエリー」に変換されます。

大まかにはこういうことなんですが、その他の詳しいことはイルカ君に訊いてみてください。キーワードは「アクション クエリ」です。

QAccessのフォーム上にレコード数とレコード番号の表示

Accessでクエリを元に表示するフォーム上で、テキストボックス等に関数を使って、レコード数とレコード番号を表示する方法がありましたら教えてください。

フォームの書式設定で「移動ボタン」の表示をすれば目的の事は出来るのですが、表示の大きさが調整できない為、とても見難いのです。

以上よろしくお願いします。

Aベストアンサー

レコード番号のコントロールソースを
=[CurrentRecord]
レコード数のコントロールソースを
=Count("*")-[NewRecord]
としてみてください。


人気Q&Aランキング