Microsoft Access 掲示板

複数コードによる範囲指定をテキストボックスで指定したい

3 コメント
views
4 フォロー

コード1  コード2 コード3
 1    a    1
 1    a    3
 1    a    4
 1    a    10
 1    a    11
 1    b    1

このような形でコードが入っているテーブルがあります
コード1、コード3が長整数型でコード2がテキスト型です
ここでフォームで二つのテキストボックスでコードを範囲指定抽出する機能を作りたいのですが、
テキストボックスの入力型式は三つのコードを「ハイフンで繋ぐ&前ゼロ無し」(例:1-a-3とか1-a-10)の形で行いたいという事になっています

この場合単純に三つを連結してテキスト化すると 「1-a-1 から 1-a-4 まで抽出」だと上3件のみ抽出となってほしい所が1-a-11までが対象になってしまいます(連結テキストだと1-a-10が1-a-4より前になるので)

そこでうまくテキストボックスに入力された値から範囲指定条件を作りたいのですがうまい作り方が見出せません

なお二つのテキストボックスは空欄も可とし、両方空欄→全件 後ろだけ空欄→前で指定した以降全て
前だけ空欄→後ろ指定した分より前全て としたいです

tetsusi
作成: 2023/01/18 (水) 17:30:35
最終更新: 2023/01/18 (水) 17:38:48
通報 ...
1
hiroton 2023/01/19 (木) 09:02:58 cd1c7@f966d

ヒトの入力はテキストを連結していても、書式が決まっているならデータ処理上では分割してしまえばいいでしょう

ハイフンで区切り、最大2回なので

InStr 関数
InStrRev 関数

最初のハイフン位置 = InStr([抽出用テキスト],"-")
最後のハイフン位置 = InStrRev([抽出用テキスト],"-")

ハイフン位置が分かれば文字列関数(文字列関数とその使い方)で目的の文字が取り出せます

VBA上で操作するなら配列化してしまえばもっと簡単ですね

Dim 抽出用データ As Variant
抽出用データ = split(Me.抽出用テキスト, "-")

'コード1開始 = 抽出用データ(0)
'コード2開始 = 抽出用データ(1)
'コード3開始 = 抽出用データ(2)

※いずれの方式でも入力データの書式が正しいかのチェックは必要になると思います

条件の未入力を含む抽出はVBAで抽出条件(Where句)を生成し適用するのが楽だと思います
VBAが使えないときならこの掲示板でも定期ネタになりつつありそうで、(たぶん)直近の参考になりそうなリンクを貼っておきます→複数の検索ボックス

2
tetsusi 2023/01/24 (火) 14:30:02 81ad1@8888f

ありがとうございます
やはり区切りで分割した方がいいですね

1-a-7  < 2-a-1 となるような処理も入れたかったので何とか分割してから繋ぐ形でできました

3
hiroton 2023/01/25 (水) 11:07:38 c57a5@f966d

1-a-7  < 2-a-1 となるような処理

それぞれ独立させて抽出じゃなくて組み合わせた状態で範囲を取りたいということなんですね

コード1コード2コード3
=1=a7以上
=1aより大きい
1より大きい
2より小さい
=2aより小さい
=2=a1以下

データの桁数気にするのも面倒なので、独立させたまま処理させたほうがいいと思いますが、かなり複雑な条件になりますね。長整数型のコードの最大桁数が決まっている(テキスト型は桁数固定)として桁を揃えたテキスト型化するのであれば、やはりVBAで処理させてしまうのが楽でしょう

Function 桁揃え3_n_3(txt)
    Dim 分割テキスト
    
    分割テキスト = Split(Nz(txt), "-")
    If UBound(分割テキスト) <> 2 Then
        桁揃え3_n_3 = Null
        Exit Function
    End If
    
    分割テキスト(0) = Right("000" & 分割テキスト(0), 3)
    分割テキスト(2) = Right("000" & 分割テキスト(2), 3)
    桁揃え3_n_3 = Join(分割テキスト, "-")
End Function

計算式でやるなら

Right("000" & Left([テキスト],InStrRev([テキスト],"-")),6) & Right(Replace([テキスト],"-","000"),3)