• ベストアンサー

3つのテキストボックスの値を1つのフィールドに保存

ご指南ください フォーム上の3つのテキストボックスの値Q ・S・ DをAというテーブルのBというフィールドに保存したいのです   Bフィールド値 QSD としたいのです よろしくお願いいたします ( アクセス2003 OS XP )

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No2の変更漏れがありました。Bのフィールドの型はテキスト型に する必要があります。 この修正を行なった後に、もし以下のことであれば補足してください。 そこで、No2の補足について、 (1) tx1に表示されているデータは、日付で、たとえば、 2012/10/29 のような表示ですか。それならば、 i = CStr(Format(Nz(Me!tx1), "yymm")) & CStr(Nz(Me!tx2)) & CStr(Nz(Me!tx3)) または、 i = CStr(Format(Me!tx1), "yymm")) & CStr((Me!tx2)) & CStr((Me!tx3)) というなかで、 CStr(Format(Nz(Me!tx1), "yymm")) または、 CStr(Format(Me!tx1), "yymm")) というのは、Format関数で2012/10/29 を 1210 のように変換して、 その上、CStr関数で文字列に変換する、というコードです。 したがって、tx1のフィールドの型が日付型であっても構わないのですが。 そこで、 >先に変更して実行したのですが とはどの時点でどのような変更を実行したのですか?、

tom2011
質問者

お礼

ありがとうございます 自己解決しました ほんとうに 助かりました ありがとうございます

tom2011
質問者

補足

ありがとうございます >先に変更して実行したのですが 変数宣言を変更して実行していましたがFormat関数の使い方がごちゃごちゃでMID関数を使ったりしていて上手くいきませんでした  i = CStr(Format(Nz(Me!tx1), "yymm")) & CStr(Format(Nz(Me!tx2), "000")) & CStr(Nz(Me!tx3))としまして1210001と格納できましたが  最後のtx3のSが格納できません なぜでしょう 格納先フィールドはテキスト型です。 ご指南お願いできませんでしょうか

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

>tx1には YYMM  tx2には 3桁の数字 tx3には アルファベット >1文字が入っています >tx1が問題で1210と表示していますが データはDATE()なので >Bに1210001Sと格納したいのです ということなので、少しコードを修正します。 (1) 変数宣言で、 Dim i As Long を Dim i As String に変更してください。 (2) i = Clng(CStr(Nz(Me!tx1)) & CStr(Nz(Me!tx2)) & CStr(Nz(Me!tx3))) を i = CStr(Nz(Me!tx1)) & CStr(Nz(Me!tx2)) & CStr(Nz(Me!tx3)) に変更してください。なお、テキストボックスの未入力のチェックを しているので、Nzはいらないと思いますので、 i = CStr(Me!tx1) & CStr(Me!tx2) & CStr(Me!tx3) でもいいと思います。 これらについて二つのクリックイベントについて 修正してみてください。実際にテーブルには追加なのか、 1レコードのみ格納してそれを修正を繰り返すのか わからないのでクリックイベントを二つ用意しています。 どちらか合うほうを使ってください。 また、メッセージボックスの最初の行に結合したデータが表示され 確認できるようになています。 何かあれば補足してください。

tom2011
質問者

補足

ありがとうございます 説明不足ですいません 先に変更して実行したのですが 結果が2012/10/291Sとなります 1210001Sとしたいのですが ご指南をお願いいたします

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

一応、以下のように設定します。 (1) フォーム上の三つのテキストボックスの名前を、   tx1  tx2  tx3 とします。 AというテーブルのBというフィールドの型を数値型 としておきます。 (2) フォーム上の三つのテキストボックスには必ずすべて 数値を入力するものとします。 (3) フォームにボタンを一つ設定し、そのクリック時のイベント を以下のように設定します。 なお、Aというテーブルにはデータを追加していくのか、 あるいはデータはレコードは一つだけでそれを更新して いくのか分からないので一応、両方をあげておきます。 設定が終わったら、コード表の「ツール」から「参照設定」 を選択し、Microsoft DAO xxx Object Library にチェックを いれ、保存してください。なお、xxxは3.6のような数字です。 '追加する場合 Private Sub コマンド1_Click()   Dim db As DAO.Database   Dim rs As DAO.Recordset   Dim i As Long   'データの記入漏れのチェック   If IsNull(Me!tx1) Or IsNull(Me!tx2) Or IsNull(tx3) Then     MsgBox "データの記入漏れがあります"     Exit Sub   End If    i = CLng(CStr(Nz(Me!tx1)) & CStr(Nz(Me!tx2)) & CStr(Nz(Me!tx3)))   If MsgBox(i & Chr(13) & "テーブルに追加しますか", vbYesNo) = vbNo Then     Exit Sub   Else     Set db = CurrentDb     Set rs = db.OpenRecordset("A", dbOpenDynaset)     rs.AddNew       rs!B = i     rs.Update     rs.Close: Set rs = Nothing     db.Close: Set db = Nothing   End If End Sub '更新する場合 Private Sub コマンド2_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim strUPSQL As String Dim strTableName As String Dim i As Long   If IsNull(Me!tx1) Or IsNull(Me!tx2) Or IsNull(tx3) Then     MsgBox "データの記入漏れがあります"     Exit Sub   End If   i = CLng(CStr(Nz(Me!tx1)) & CStr(Nz(Me!tx2)) & CStr(Nz(Me!tx3)))   If MsgBox(i & Chr(13) & "テーブルを更新しますか", vbYesNo) = vbNo Then     Exit Sub   Else     Set db = CurrentDb     Set rs = db.OpenRecordset("A", dbOpenDynaset)     If rs.RecordCount > 0 Then       rs.Edit         rs!B = i       rs.Update     Else     rs.AddNew       rs!B = i     rs.Update     End If     rs.Close: Set rs = Nothing     db.Close: Set db = Nothing   End If End Sub 以上ですが、設定の(1)、(2)、(3)の中で条件や設定に違いが ある場合などやわからないところがあれば補足してください。

tom2011
質問者

補足

早々のご指南ありがとうございます 大きな勘違いでした tx1には YYMM  tx2には 3桁の数字 tx3には アルファベット1文字が入っています tx1が問題で1210と表示していますが データはDATE()なので Bに1210001Sと格納したいのです すいません ご指南いただけますでしょうか