Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
サブフォームの合計値をVBAの中で計算させたい
投稿日時: 22/12/23 08:39:45
投稿者: うみねこ@かもめ

件名通りなのですが、合計値を変数に格納させ扱おうとしても、一行実行(F8)では想定通りに動くのですがまとめて動かすと、変数の値が「0」となってしまいます、おそらくフォームの計算値の格納に間に合わずに次の行の命令に移ってしまうようです、
もちろんSleep()なども試しました、無駄なFor〜Nextなどもかませたり試しましたが、まったく効果がありませんでした、以下にコードを載せていただきます、変数int1が問題の変数で合計値ですからフォーム上の式でだしたもので、int2はフォーム上で手入力した値になります、
言い換えれば式の値を変数に格納させるにはどうしたらいいのか? ということになるのかもしれません。
 
Private Sub 振込データ入力_保存_Click()
 
On Error Resume Next
 
Dim int1 As Currency
Dim int2 As Currency
 
txb_明細合計.SetFocus
 
int1 = 明細データサブフォーム1.Form!txb_小計.Value
 
If int1 = 0 Then
 
  MsgBox "再計算が必要です、もう一度クリックして下さい"
 
  Exit Sub
 
End If
 
int2 = Me!txb_手数料.Value
 
Me!txb_明細合計.Value = Abs(CCur(int1)) + CCur(int2)
 
Me.Refresh
 
End Sub

回答
投稿日時: 22/12/23 09:12:49
投稿者: Suzu

コードを拝見するに、 メイン/サブ の構造のフォームですよね。
ボタンも、メインフォームに配置されているのではありませんか?
 
 
'サブフォームコントロールへフォーカス移動
Me.明細データサブフォーム1.SetFocus
 
'サブフォームコントロール内のフォームの 再クエリまたは再計算
Me.明細データサブフォーム1.Form.Requery
'Me.明細データサブフォーム1.Form.Recalc
 
'サブフォームコントロール内のコントロール txb_小計 フォーカス移動
Me.明細データサブフォーム1.Form!txb_小計.SetFocus
 
int1 = Me.明細データサブフォーム1.Form!txb_小計.Value
 
Me.txb_明細合計.SetFocus
 
 
ではどうでしょう。
 
また、「Me」は入れておいた方が良いと思います。

回答
投稿日時: 22/12/23 09:27:47
投稿者: hatena
投稿者のウェブサイトに移動

下記の演算テキストボックスの再クエリも試してみてください。
 

 Me.明細データサブフォーム1.Form!txb_小計.Requery

 
どうしてもうまく行かないなら、DSum関数でVBA内で合計値を取得するとか。

投稿日時: 22/12/23 17:14:38
投稿者: うみねこ@かもめ

早速の回答ありがとうございました。
Suzu、hatena様、おっしゃるようにメイン/サブ の構造のフォームです、ボタンも、メインフォームに配置しております、コードから理解していただきありがとうございます。
 
'サブフォームコントロール内のコントロール txb_小計 フォーカス移動
Me.明細データサブフォーム1.Form!txb_小計.SetFocus
などからわかるのは、サブフォーム側から値の合計値を取得する狙いかと思われますし、理解できるのですが……ありとあらゆるパターンを試しまた、
結果玉砕です、一行実行ならコードが通るのですが……アドバイスを生かせず申し訳ありません。
でもまあ、二回連続でコードを通そうとすると通るので、いいのかもと、……また、連結フォームですからサブ側のデータを手動で記録し、メイン側も同じく記録すると一回でコードが通るんですがこれでいいのかな? でもそれでしたら手打ちで合計額をテキストボックスに入力すれば変数に格納でき、VBAで計算させそれで済みそうなので、そのほうが手っ取り早かったことになるのかもしれません。
VBAというものはあくまで道具ですから、振り回されるのは嫌ですね、目的は仕事を楽にさせてくれるものであって、VBAに支配されるのはゴメンです、道具が便利になるのはいいことですが、現実には妥協が必要なのかもしれません、なんて泣き言いってみたりして……

回答
投稿日時: 22/12/24 13:11:17
投稿者: hatena
投稿者のウェブサイトに移動

DSum関数で集計結果を取得するというのは試しましたか。
 
下記のように仮定すると、
 
リンク親フィールド/リンク子フィールドのフィールド名を「ID」(数値型)
サブフォームのレコードソースの設定を「テーブル1」
サブフォームの集計するフィールド名を「金額」(通貨型)
サブフォームにはフィルターはかかっていないとする(かかっている場合はFilterプロパティで条件を取得してDSumの抽出条件に追加する。)
 
下記のようなコードになります。
 

Private Sub 振込データ入力_保存_Click()
    Dim int1 As Currency
    Dim int2 As Currency
 
    int1 = DSum("金額","テーブル1","ID=" & Me!ID)
    int2 = Nz(Me!txb_手数料.Value)
    Me!txb_明細合計.Value = int1 + int2 

    Me.Refresh
End Sub

トピックに返信