Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : 指定なし)
テーブルの特定のフイールドを検索です
投稿日時: 21/02/24 13:08:26
投稿者: miyama2305

access2019
 
テーブル(T工事)のフイールドは以下です
5412/5431/5441/5453/5456は工事科目です。
月/伝票番号/相手科目/摘要/5412/5431/5441/5453/5456
 
フオーム名は[F入力]です
テキストボックスを配置
月、伝票番号、相手科目、摘要、工事科目、金額です
入力方法は
月、伝票番号、相手科目、摘要、工事科目は5412、5431、5441、5453、5456のいづれかを入力
、金額の順で入力します。
 
たとえば、月に2021/2/20、伝票番号を1、相手科目に現金、摘要に材料費、
工事科目に[5441]と入力して、金額を1000と入力した場合以下のように
テーブルに表示したいのですが。
 
月-------/伝票番号/相手科目/摘要--/5412--/5431--/5441--/5453--/5456
2021/2/20/-------1/現金----/材料費/------/------/1000--/------/----
工事科目の5441を検索して、そのフイールドに1000を入力したいのですが。この
方法がわかりません。
ご指導お願いします。

回答
投稿日時: 21/02/24 14:06:42
投稿者: Suzu

簡単な方法としては
 
フォームは連結フォームで、
テキストボックス「5412」、「5431」、「5441」、「5453」、「5456」を同じ位置に重ねて配置。
 
工事科目の値によって、
配置済みの テキストボックス 5412、5431、5441、5453、5456 それぞれについて
可視/不可視 の制御を行えば良いでしょう。
 
 
可能なのであれば
 
テーブルのフィールドを
月、伝票番号、相手科目、摘要、工事科目、金額
 
とする方法もあるでしょう。
 
 
どちらが良いのかは、累積したデータの使い方にもよるので
一概にどのようにしたら良いかは、これまでの提示頂いた情報では言い切れません。

回答
投稿日時: 21/02/24 14:08:38
投稿者: sk

引用:
テーブル(T工事)のフイールドは以下です
5412/5431/5441/5453/5456は工事科目です。
月/伝票番号/相手科目/摘要/5412/5431/5441/5453/5456

(どのフィールドが主キーであるのかが不明ですが)
テーブルの正規化を実施されることをお奨めします。

投稿日時: 21/02/24 15:48:14
投稿者: miyama2305

Suzu様 sk様ありがとうございます
ご指導のことは検討させてください。
 
以下のコードを使用して処理していましたが。
コードが長いので、他の効率的な方法があればと思ったものですから。
Dim dbk As Database, rstk As Recordset
Set dbk = CurrentDb
Set rstk = dbk.OpenRecordset("T工事", dbOpenDynaset)
rstk.AddNe
If Forms![[F入力].工事科目 = 5412 Then
rstk![5412] = Forms![F入力].[金額]
end if
If Forms![[F入力].工事科目 = 5431 Then
rstk![5431] = Forms![F入力].[金額]
end if
If Forms![[F入力].工事科目 = 5441 Then
rstk![5441] = Forms![F入力].[金額]
end if
If Forms![[F入力].工事科目 = 5453 Then
rstk![5453] = Forms![F入力].[金額]
end if
If Forms![[F入力].工事科目 = 5456 Then
rstk![5456] = Forms![F入力].[金額]
end if
ご指導いただけたらと思います。
 

回答
投稿日時: 21/02/24 17:01:49
投稿者: Suzu

フォーム F入力 のクラスモジュールにて処理しているとして、
 
・Forms![フォーム名] は、Me で代用可能
・レコードセットの、Fieldオブジェクトは、
  Fieldsコレクションに対し、名称を指定して参照可能
 
ですので
 

Dim dbk As Database, rstk As Recordset

Dim varValue  As Variant

'工事科目 に フィールド名に合致する値が入っていない場合を考慮
varValue = Me.工事科目
If varValue = 5412 Or varValue = 5431 Or varValue = 5441 Or varValue = 5453 Or varValue = 5456 Then

    Set dbk = CurrentDb
    Set rstk = dbk.OpenRecordset("T工事", dbOpenDynaset)

    rstk.AddNew
    rstk.Fields(varValue).Value = Me.金額
    rstk.Update
End If

こんな風にできるかと。
 
でも。。
Accessのいいところは、連結フォームが手軽にできる事。
VBAにて、レコードセットを使う必要性は 提示された情報からのみでは 無いように思います。

投稿日時: 21/02/24 17:48:14
投稿者: miyama2305

Suzu様 感謝します
 
>Accessのいいところは、連結フォームが手軽にできる事。
この方法は、自身が無能なため、考えられません。
勉強します。
 
sk様
ありがとうございます。