• ベストアンサー

アクセス2003で文字列から数値型への変換。

いつも大変お世話になっています。 アクセス2003で、商品の規格単位を「20mlが4本」のところを「×4」と入力しています。 「単位表示(2)」のフィールドに文字列で「×4」と入力してあるものを「単位表示(3)」のフィールドに「4」と数値型に変換したいです(「単位表示(3)」はあとで計算に使用したいので)。 どのようにしたらよいのでしょうか。どなたかよろしくお願いいたします。

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

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

フォームの「単位表示3」を表示するテキストボックスの コントロールソースを、 =funcChange(Nz([単位表示2]) としてください。これで表示されるはずですが。 この場合の「単位表示2」は フォームのレコードソースになっているテーブル、 またはクエリのフィールドの「単位表示2」を意味します。 フォームのコントロールの「単位表示2」ではありません。 この場合は、テーブルの「単位表示3」のフィールドに 書き込むことはしていません。まだ、表示している だけす。このままでも利用できますが、 もし、テーブルのフィールドに書き込む必要が あるのならば、方法として (1)更新クエリ (2)レコードセットを利用してVBAでテーブルに書き込み (3)テーブルの「単位表示3」を表示するテキストボックスを   隠しコントロールとして新たに設定しそれにデータを挿入   してテーブルに保存 などの方法をとります。 それで、フォームのレコードソースはテーブル ですか、あるいはクエリですか。いずれにしても テーブルに主キーがあり、フォームに設定 してあると思うのですが。いかがでしょうか。 なお、関数funcChangeは「単位表示2」に「X]が なかったり、「X]のかわりに「*」であったり、 データが未入力の場合は0を返します。

その他の回答 (7)

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

訂正です。 関数に抜けたいた部分がありました。 以下です。 Function funcChange(ByVal str As String) As Long If str = "" Then Exit Function Else If InStrRev(str, "X", , vbTextCompare) = 0 Then Exit Function Else funcChange = CLng(Right$(str, Len(str) - InStrRev(str, "X", , vbTextCompare))) End If End If End Function データに「X」がない場合、データが入力されていない 場合に対応します。

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

少し、変更してください。#5の場合とデータが 無い場合に対応する必要があるようです。 (1)関数の変更 Function funcChange(ByVal str As String) As Long If str = "" Then Exit Function Else funcChange = CLng(Right$(str, Len(str) - InStrRev(str, "X", , vbTextCompare))) End If End Function (2)使い方の変更 funcChange(Nz([単位表示2])) のように、Nz を付加して使ってください。 以下のように。 クエリ1: 以下を、 単位表示3;funcChange(Nz([単位表示2])) 以下のクエリデザインビューの(3)に貼り付ける。 フィールド名 | ID    |商品名  |単位表示2 | (3) |  テーブル   |テーブル1 |テーブル1|テーブル1|   |  並べ替え   |      |     |     |   |  表示     |      |     |     |   |  抽出条件   |      |     |      |   |  フォーム: 単票形式でテーブル1をレコードソース として作った場合。 テキストボックスを一つ追加して、名前を単位表示3とする。 そのコントロールソースに、 =funcChange(Nz([単位表示2])) を貼り付ける。

ayanohina
質問者

補足

何度も申し訳ありません。エラーは出なくなりましたが、すべてのレコードの「単位表示3」に「0」が表示されます。これはフォームが単票フォームでなく、帳票フォームであることも関係するのでしょうか?よろしくお願いいたします。

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

>「型が一致しません」 >デバック時のカーソルの位置は >funcChange = CLng(Right$(str, Len(str) - InStrRev(str, >"X", , vbTextCompare))) >になります。 これは、たぶん 「×4」 とすべきところが、 「*4」 のように「X」が「*」になっているのではと思いますが。 こちらで確認すると同じエラーが出ます。 なお、 >それから、テーブルに単位表示3というフィールドを設定していました。 については問題ありません。

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

> 「単位表示(2)」のフィールドに文字列で「×4」と入力してあるものを > 「単位表示(3)」のフィールドに「4」と数値型に変換したい 『単位表示(2)』に入っているデータは、「20ml×4」ではなく「×4」のみ ということでよろしいでしょうか。 そうであれば、更新クエリを新規作成して、『レコードの更新』欄に以下の 式を指定してやれば、『単位表示(3)』フィールドに「4」を記録できます。 ※「更新クエリ」の指定方法は、添付画像の赤線部分を参照下さい。   また、式の入力場所は、黄緑の下線を引いた部分になります。 <「×1.5」など、小数があり得る場合】> CDbl(Replace(Nz([単位表示(2)], 0), "×","")) <「×1.5」などの小数がない場合> CLng(Replace(Nz([単位表示(2)], 0), "×","")) 【式の説明】 括弧の内側から適用されるので、その順で説明します。 なお、より詳しくは、Accessのヘルプで各関数の名前を検索してみて下さい。 (画面最大化時に画面右上に表示される、『質問を入力してください』の欄:  CDbl/CLngについては「データ型変換関数」としてまとめられています) ・Nz関数  指定した値がNullだった場合、第2引数で指定した値に変換します。  (Null以外の値はそのまま変化しません)  ※No.1の補足欄に記載の「型が一致しません」のエラーから、対象   データ内にNull(空白)があるものと推測。   (Nullには通常の演算が行えないため、上記のような変換を行うか、   抽出条件に「Is Not Null」を指定して対象外にする必要があります) ・Replace関数:  第1引数に指定した値に対して、第2引数で指定した文字があれば、  該当部分のみを、第3引数に指定した文字で置き換えます。  ※上の例では、「×」を空文字に変換(「×4」→「4」) ・CDbl関数・CLng関数:  文字列型扱いになっている数字を、数値型に変換します。  (CDblは倍精度浮動小数点型に、CLngは長整数型に、それぞれ変換)  ※Replace関数を適用した段階では文字列扱いのため、数値型に変換。   (「4」(文字列相当:実質「"4"」扱い)→「4」(数値)) 【注意事項】 『単位表示(3)』が空白の場合は「0」扱いとしています。 多分それで問題ないと思いますが、もしも「1」扱い等にしたい場合は、 「Nz([単位表示(2)], 0)」の「0」を「1」等にして下さい。 また、Null(空白)はそのままにしたい場合は、上記更新クエリの『単位表示(2)』 の抽出条件に、「Is Not Null」を指定して、更新対象から外してください。 (添付画像の青色下線部を参照) ※「×」(ばつ)の他に「X」(エックス)や「*」(アスタリスク)などは混在していない   前提になります。

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

こちらでの設定 テーブル1: ID  商品名  単位表示2 1   醤油    X4 2   タバスコ  10mlX10 クエリ1: 以下を、 単位表示3;funcChange([単位表示2]) 以下のクエリデザインビューの(3)に貼り付ける。 フィールド名 | ID    |商品名  |単位表示2 | (3) |  テーブル   |テーブル1 |テーブル1|テーブル1|   |  並べ替え   |      |     |     |   |  表示     |      |     |     |   |  抽出条件   |      |     |      |   |  フォーム: 単票形式でテーブル1をレコードソース として作った場合。 テキストボックスを一つ追加して、名前を単位表示3とする。 そのコントロールソースに、 =funcChange([単位表示2]) を貼り付ける。 このようところですが、「型が一致しない」という エラーが出たとき、デバッグを選択するとどこに カーソルがあたりますか。 あるいはテーブルの単位表示2のフィールドの型は テキスト型だと思いますが。 テーブルに単位表示3というフィールドを設定 しておく必要は無いと思いますが、設定していたり しますか。

ayanohina
質問者

補足

度々申し訳ありません。 デバック時のカーソルの位置は funcChange = CLng(Right$(str, Len(str) - InStrRev(str, "X", , vbTextCompare))) になります。 それから、テーブルに単位表示3というフィールドを設定していました。

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

funcChangeを (1) クエリ (2) フォーム (3) その他 などで、どのような使い方をしましたか?

ayanohina
質問者

補足

遅くなりました。 クエリで、フィールド「単位表示3」の欄に 単位表示3:funcChange([単位表示2]) フォームで、「単位表示3」のコントロールソースに =funcChange([単位表示2]) と入力しています。 この数字がだめなのでしょうか? 申し訳ありません。 よろしくお願いします。

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

標準モジュールに以下を貼り付け、保存。 Function funcChange(str As String) As Long funcChange = CLng(Right$(str, Len(str) - InStrRev(str, "X", , vbTextCompare))) End Function クエリならば、フィールドの欄に 単位表示(3):funcChange([単位表示(2)]) フォームならば、単位表示(3)のコントロールソースに =funcChange([単位表示(2)]) のように使用してみてください。 あるいは、単位表示(2)の更新後処理に Private Sub 単位表示(2)_AfterUpdate() Me!単位表示(3) = funcCange([単位表示(2)]) End Sub なお、単位表示(2)_AfterUpdate() のように オブジェクトの名称に(2)などのように使用できない ことは先刻ご承知だと思います。念のために。

ayanohina
質問者

補足

早々のご回答ありがとうございました。上記のモジュールをそのまま貼り付けたのですが、「型が一致しません」というエラーがでます。どのようにしたらよいでしょうか。申し訳ありません。。。

関連するQ&A