Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2019)
クエリで改行後の文字を抽出
投稿日時: 22/03/01 11:46:26
投稿者: ラングドシャ

お願いします。
 
テーブルのデータが次のようになっています。
 
フィールド名:NAIYO
耐熱60度
サイズ20×20cm
赤、黒、白
 
3行にわたってデータが入っています。それぞれエンターにて改行しています。
クエリにて3行目を抽出するために、以前こちらで教えていただいた関数で抽出しています。
 
カラー: Mid([NAIYO],InStr(InStr(1,[NAIYO],Chr(13)+Chr(10),0)+1,[NAIYO],Chr(13)+Chr(10),0)+2)
 
今回、1行目も抽出したいので、上記を応用して次のように作ってみました
 
仕様: Mid([NAIYO],1,InStr(1,[NAIYO],Chr(13)+Chr(10),0)+1)
 
 
これで通常は問題ないのですが、元のデータが1行目しかない場合次のように抽出されてしまいます。
 
フィールド名:NAIYO
耐熱60度
 
 
の場合、

カラー     詳細
熱60度     耐

 
1行目抽出のために作成した関数にあやまりがありますでしょうか?
1行目しかなくても抽出できるようご教示お願いいたします。

回答
投稿日時: 22/03/01 14:54:52
投稿者: Suzu

私なら、VBA で Split を含んだ 自作関数を作り その関数を クエリに仕込みます。
 
 
 
そもそもの テーブル構造に問題があると思います。
 
普通に、属性毎にフィールドに分けていればそんな事をしなくて済みますよね。
 
1行あるのか、2行あるのか、3行あるのか ・・etc
改行を入れる事自体を ユーザーに委ねており、「仕様」は必ず3行目 に 来るとは限らない
そういう あいまい になりかねない 部分を 明確にする為 に フィールドとして分けています。
 
 
あくまでも、ACCESS の クエリの関数のみで なら、
InStr にてChr(13) & Chr(10) の数を数え 分岐させます。

回答
投稿日時: 22/03/01 15:09:50
投稿者: sk

引用:
3行にわたってデータが入っています。それぞれエンターにて改行しています。

引用:
1行目も抽出したい

引用:
Mid([NAIYO],1,InStr(1,[NAIYO],Chr(13)+Chr(10),0)+1)

IIf(InStr(1,Nz([NAIYO],""),Chr(13) & Chr(10),0)>0,Left([NAIYO],InStr(1,Nz([NAIYO],""),Chr(13) & Chr(10),0)-1),[NAIYO])
 
------------------------------------------------------------
 
以上のような式を記述なさればよろしいのではないかと。

回答
投稿日時: 22/03/01 17:06:32
投稿者: よろずや

仕様: Mid([NAIYO],1,InStr(1,[NAIYO] & Chr(13),Chr(13),1)-1)
 
サイズ: Mid([NAIYO],InStr(1,[NAIYO] & Chr(13),Chr(13),1)+2,InStr(InStr(1,[NAIYO] & Chr(13),Chr(13),1)+1,[NAIYO] & Chr(13) & Chr(10) & Chr(13),Chr(13),1)-InStr(1,[NAIYO] & Chr(13),Chr(13),1)-2)
 
カラー: Mid([NAIYO],InStr(InStr(1,[NAIYO] & Chr(13),Chr(13),1)+1,[NAIYO] & Chr(13) & Chr(10) & Chr(13),Chr(13),1)+2)

投稿日時: 22/03/02 17:23:53
投稿者: ラングドシャ

返信が遅くなり申し訳ありません。
 
Suzu様
ありがとうございます。

引用:
そもそもの テーブル構造に問題があると思います。

確かに、扱いにくいです。
システム上は、項目名もあり1行目は詳細、2行目はサイズという風に間違わないように
なっています。
項目追加するたびにお金がかかるため、簡単に項目を増やすことができるような仕組みに
なっていたと思います。
当方にできるとといえば、データを扱う際にアクセスに取り込んで加工するしかないので
このような方法となりました。
 
sk様
ありがとうございます。
midを使わずに取り出すのですね。勉強になりました。
アクセスはあまり使わないので苦手ですが、InStr関数が難しいと思いました。
 
よろずや様
ありがとうございます。
サイズの関数まで教えていただきありがとうございました。
先にも書いたのですが InStr関数がすごく難しいですね。理解するのに時間がかかりそうです。