こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

access2003のコンボボックスより取り出した値の型

こんにちは、Blackwinglsです。

以下のようなテーブルがあります。

所属マスター
所属コード 所属名
010 本社
100 東京
110 大阪
200 福岡
300 札幌
400 秋田

所属コード 所属名 ともに文字列にて定義、主キーはなし。

これをフォームのコンボボックスより開始所属~終了所属で抽出条件を指定して取り出して、別途作成した所属一覧表というレポートに渡したいのですが、うまくいきません。

コンボボックスは、所属コード、所属名を表示(所属コードは0cm)しています。

印刷時のコードは

DoCmd.OpenReport "所属一覧表", acViewPreview, , "所属コード Between " & Me.開始所属 & " and " & Me.終了所属

とすると、
抽出条件でデータ型が一致しません
とでます。

あれと思い、

MsgBox Me.開始所属
MsgBox IsNumeric(Me.開始所属)

とすると
MsgBox Me.開始所属 は、010 が表示され
MsgBox IsNumeric(Me.開始所属) は、true (数値)が表示されます。

MsgBox Str(Me.開始所属)
MsgBox IsNumeric(Str(Me.開始所属))

としてみましたが、

MsgBox Str(Me.開始所属) は、10 が表示され
MsgBox IsNumeric(Str(Me.開始所属)) は、true (数値)が表示されます。


Me.開始所属 で取り出した値が、なぜ数値になっているのか理解できません。
また、Str(Me.開始所属) としても数値のままなのは何故なのでしょうか?

ps accessのSQL画面の抽出条件に、Between "010" And "200" では正常に動きます。

投稿日時 - 2006-03-27 14:18:57

QNo.2054568

困ってます

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

DoCmd には、↓の用に入れましょう。
DoCmd.OpenReport "所属一覧表", acViewPreview, , "所属コード Between '" & Me.開始所属 & "' and '" & Me.終了所属 & "'"

今のままだと、Where文が
[ Where Between 010 and 200]
 ↑になってしまい、直接数値で条件を指定していることになります。
SQL文なら、文字列は基本的に「'」シングルクォーテーションでいいと思います。

あと、Str()についてですが
Strに合わせて[F1]を押すとヘルプが出てくると思いますが
そこに、書いてある事を見ればなんとなくわかると思います。
引数に、数値を代入する仕様になっている為
数値に変換されたものを、バリアント型で返しているからです。

文字列型にしたいのであれば、
Format()を使った方が良いと思います。

一度、試してみてください。

投稿日時 - 2006-03-27 15:40:00

お礼

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

> DoCmd.OpenReport "所属一覧表", acViewPreview, , "所属コード Between '" & Me.開始所属 & "' and '" & Me.終了所属 & "'"

を見た瞬間、思わず声が出てしまいました。
なんでこんな事に気がつかなかったんですかねえ。

大変役立ちました。
感謝いたします。

投稿日時 - 2006-03-31 17:14:30

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

DoCmd.OpenReport "所属一覧表", acPreview, , "Val(所属コード) >=10 AND Val(所属コード) <=100"
DoCmd.OpenReport "所属一覧表", acPreview, , "所属コード >='010' AND 所属コード<='100'"
DoCmd.OpenReport "所属一覧表", acPreview, , "所属コード BETWEEN '010' AND '100'"
DoCmd.OpenReport "所属一覧表", acPreview, , "所属コード IN ('010','100')"

4番目は非現実てきですが、残りの3つは目的を達すると思います。
冒頭の Val("010")=0 と思ったのですが、所属コード=10 を表示したので驚きです。
参考までに!

投稿日時 - 2006-03-27 17:31:58

お礼

ご回答頂きましてありがとうございます。
BETWEEN 以外の処理は頭になかったので参考になりました。
今後もよろしくお願いします。

投稿日時 - 2006-03-31 17:18:22

ANo.2

こんにちは。

「文字列はシングルクォーテイテョンで囲む」との回答は出てますので、ISNUMERICについて少々。

ヘルプには「引数が数値と評価できればTRUEを返す」と書いてありますね。
言い換えると「数値と評価できれば」たとえ「文字列」であっても「TRUE」返すということです。
例えば、以下のように文字列で宣言してあっても、全角数字でも「TRUE」が返る。

Sub test()
 Dim S As String
 S = "234"   '(全角数字)これは数値と評価できるのでTRUE
 MsgBox IsNumeric(S)
End Sub

これで質問のISNUMERICでなぜTRUEが返えるのかお分かりになりましたね。
そして今回のような判断にはISNUMERIC関数は適さないということも。
以上です。
 

投稿日時 - 2006-03-27 17:02:38

お礼

ご回答頂きましてありがとうございます。
ISNUMERICの件は参考になりました。
今後もよろしくお願いします。

投稿日時 - 2006-03-31 17:16:47

あなたにオススメの質問