• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access テキストボックスの通貨型)

Access テキストボックス通貨型の問題

このQ&Aのポイント
  • フォームAのリストボックス上でダブルクリックすると、フォームBが開きます。そして、フォームAで選択した金額がフォームBのテキストボックスにコピーされます。しかし、コピーした金額が通貨型にならない問題があります。
  • テキストボックスに直接数字を入力すると通貨型で表示されますが、フォームAをダブルクリックして金額をコピーする場合は通貨型になりません。
  • 解決策として、フォームAをダブルクリックする際に、コピーする金額を通貨型に変換する処理を追加することで解決できます。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

【要旨】 Columnプロパティの値を直接代入すると、書式は適用されなく なります。 Val関数を使用すると、テキストボックスに設定した書式が適用 されるようになります: Forms![フォームB]![金額] = Val(Forms![フォームA]![リスト].Column(3)) 【詳細】 こちらの環境(Access2007/WinXP Home)で確認したところ、 ListBoxのColumnプロパティの値は、「(書式情報を持たない) 文字列」(=Text)として扱われるようです。 つまり、フィールドでの格納値が「2000」、リストボックスでの 表示値が「\2,000」だった場合、Columnで取得した値は 「"2000"」という文字列になります。 一方、書式に「通貨」を指定したテキストボックスで、その 書式が適用されるのは数値だった場合に限られます。 「"2000"」という文字列として受け取ったテキストボックス側は その値を文字列としてしか認識できず、結果、書式の適用対象外 と判定した、ということのようです。 ですので、最もシンプルなのは、Val関数を使用して数値型 に変換する形になるかと思います。 Forms![フォームB]![金額] = Val(Forms![フォームA]![リスト].Column(3))  または(フォームA側にコードを記述している前提で:以下2行とも) Forms![フォームB]![金額] = Val(Me![リスト].Column(3))  または Forms![フォームB]![金額] = Val([リスト].Column(3)) 【別解】 上記よりも手間が増えますが(汗)、TextBoxのTextプロパティを 使用する方法もあります。 (なお、Textプロパティを使用する場合は、対象となるTextBox にフォーカスを移動する必要があります) Forms![フォームB]![金額].SetFocus Forms![フォームB]![金額].Text = Forms![フォームA]![リスト].Column(3) ※こちらも「Forms![フォームA]」は上と同様の書き換えが可能。 なお、こちらの場合は、フォームBの『金額』テキストボックスの 更新前イベント/更新後イベントが発生します。 同イベントでの処理の有無や内容によって、この点が利点にも 欠点にもなりますが、併せて参考まで。

naoto0216
質問者

お礼

ご回答ありがとうございます。 Columnでの値の代入は書式が適用されないんですねぇ。。 勉強になります。 早速Valで試したところうまくいきました。。が、金額のデフォルト値は\0という訳ではなく、入力されてない場合は空白(Nullもしくは"")、金額が入力されている場合のみその金額を表示したいところです。 説明不足ですみません。 なので、  If IsNull(Forms![フォームA]![リスト].Column(3)) or Forms![フォームA]![リスト].Column(11) = "" Then    Forms![フォームB]![金額] = Val(Forms![フォームA]![リスト].Column(3))  Else    '空白の場合は何もしない。  End If とすることで、やりたいことが出来ました。 ありがとうございました。

naoto0216
質問者

補足

『入力されてない場合は空白(Nullもしくは"")』 がちょっと分かり辛いと思いましたので補足させて頂きます。 テーブルの金額フィールドにNullが入っているかもしれないし""が入ってるかもしれない・・・ということであり、そいうケースの場合はフォーム上、空白にしておきたいという意味です。

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#2です 質問者さんには、私の意図したことが伝わっていればよいのですが。 通貨型の「金額」は、 Null のものはない・・・・ これが質問内容から読み取れませんでした。 なので、蛇足として Null は "" で得られることを記述していました。 確かに CCur("") であれば、エラーになります。 ただ、このエラーは検証時に発覚するものです。 要は、Null を 勝手に 0 として扱わない・・・・・これが前提であります。 単に比較する時には Null を 0 とかに置換えて・・・・等することがありますが、 値を設定する場合、Null は Null であるべきだ、と思っています。 私の考えを押し付けるわけではありませんが、上記エラーを処理するには、 On Error Resume Next Forms[フォームB]![金額] = CCur(Forms![フォームA]![リスト].Column(3)) とでもしておけば良いと、私は思います。 ※ Forms[フォームB]![金額]  の初期値が気になりますが・・・・

naoto0216
質問者

お礼

ご回答ありがとうございます。 おっしゃる通り、初期値は¥0という訳ではなく、Nullの場合もありえますし””(0文字)の場合もありえます。 なので、Nullか0文字かを判定し、そうであれば何もせず(もしくはフォームBの金額テキストボックスにNullを入れる)、値が入ってる場合のみ金額表示するように致しました。 ご教授ありがとうございます。

naoto0216
質問者

補足

#1様の回答に記載した「・・・とすることで、やりたいことが出来ました。」ですが、ThenとElseでやる処理を逆に記載しておりましたので、ここで訂正させて頂きます。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

横から失礼します。 リストボックスに表示していた型で変換された方が良いと思います。 通貨型という事なので、 リストボックス上では ¥1,234 の様に表示されているのでしょうか。 (表示上 ¥ にするため全角で置換えてます) であれば、 Val("¥1,234") → 0 Val("1,234") → 1 となるので、CCur を使った結果と異なるものになります。 CCur("¥1,234") or CCur("1,234") → 1234 上記、違いを記述しましたが、実際のリストボックスでは、 表示上は、¥1,234 だけど、Column(3) で得られるものは "1234" 見たいなので、 現状では Val / CCur どちらでもよいと思います。 Val を使う時の注意点という事で・・・・ 表示上 / Column の違い等、意識したくない・・・・ 表示の型での変換をやっておけば、後々他の人が見ても分かりやすいかと・・・ Column では文字列で得られるので、通貨型への変換・・・・ (文字列は "¥1,234" であろうが "1234" であろうが) 蛇足) リストボックス上に表示した、元々 Null のものを参照した時には、 Null ではなく "" になるようです。(うそかも)

関連するQ&A