プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

フォームA
  リストボックスがあり、その中の項目として[金額]があります。
  そこに表示しているソースのテーブルの[金額]フィールドは通貨型です。

フォームB
  [金額]テキストボックスがあり、書式は通貨にしてます。

フォームAのリストボックス上でダブルクリックするとフォームBが開き、フォームAで選択した金額がフォームBの[金額]テキストボックスにコピーするようにしてます。

Forms[フォームB]![金額] = Forms![フォームA]![リスト].Column(3)

金額のコピー自体は問題なくできておりますが、通貨型になりません(\やカンマが付かない)。
但し、テキストボックスに直接数字を入力すると通貨型で表示されます。

フォームAをダブルクリックするときに、
Forms[フォームB]![金額] = Format(Forms![フォームA]![リスト].Column(3),"\\#,###")とすれば、表示上はOKなのですが、このようにしないと通貨型でコピーは出来ないのでしょうか。

ご教授の程、宜しくお願い致します。

A 回答 (3件)

【要旨】


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の『金額』テキストボックスの
更新前イベント/更新後イベントが発生します。

同イベントでの処理の有無や内容によって、この点が利点にも
欠点にもなりますが、併せて参考まで。
「Access テキストボックスの通貨型」の回答画像1

この回答への補足

『入力されてない場合は空白(Nullもしくは"")』 がちょっと分かり辛いと思いましたので補足させて頂きます。

テーブルの金額フィールドにNullが入っているかもしれないし""が入ってるかもしれない・・・ということであり、そいうケースの場合はフォーム上、空白にしておきたいという意味です。

補足日時:2013/03/04 15:40
    • good
    • 0
この回答へのお礼

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

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
とすることで、やりたいことが出来ました。
ありがとうございました。

お礼日時:2013/03/04 15:32

#2です



質問者さんには、私の意図したことが伝わっていればよいのですが。

通貨型の「金額」は、 Null のものはない・・・・
これが質問内容から読み取れませんでした。
なので、蛇足として Null は "" で得られることを記述していました。

確かに CCur("") であれば、エラーになります。
ただ、このエラーは検証時に発覚するものです。

要は、Null を 勝手に 0 として扱わない・・・・・これが前提であります。
単に比較する時には Null を 0 とかに置換えて・・・・等することがありますが、
値を設定する場合、Null は Null であるべきだ、と思っています。
私の考えを押し付けるわけではありませんが、上記エラーを処理するには、

On Error Resume Next
Forms[フォームB]![金額] = CCur(Forms![フォームA]![リスト].Column(3))

とでもしておけば良いと、私は思います。

※ Forms[フォームB]![金額]  の初期値が気になりますが・・・・

この回答への補足

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

補足日時:2013/03/04 18:47
    • good
    • 0
この回答へのお礼

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

おっしゃる通り、初期値は¥0という訳ではなく、Nullの場合もありえますし””(0文字)の場合もありえます。

なので、Nullか0文字かを判定し、そうであれば何もせず(もしくはフォームBの金額テキストボックスにNullを入れる)、値が入ってる場合のみ金額表示するように致しました。

ご教授ありがとうございます。

お礼日時:2013/03/04 16:20

横から失礼します。




リストボックスに表示していた型で変換された方が良いと思います。

通貨型という事なので、
リストボックス上では ¥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 ではなく "" になるようです。(うそかも)
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています