重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

アクセス2007で、分割フォームにて、以下のようなコードを搭載したボタン(抽出)を作製しています。

private sub 抽出_Click()

Dim strFilter as string

strFilter = "("
If ka1.Value = True Then strFilter = strFilter & "ka = 1 or "
If ka2.Value = True Then strFilter = strFilter & "ka = 2 or "
If ka3.Value = True Then strFilter = strFilter & "ka = 3 or "
If ka4.Value = True Then strFilter = strFilter & "ka = 4 or "
If ka5.Value = True Then strFilter = strFilter & "ka = 5 or "
strFilter = Left(strFilter, Len(strFilter) - 3) & ") and ( "
If kb1.Value = True Then strFilter = strFilter & "kb = 1 or "
If kb2.Value = True Then strFilter = strFilter & "kb = 2 or "
If kb3.Value = True Then strFilter = strFilter & "kb = 3 or "
If kb4.Value = True Then strFilter = strFilter & "kb = 4 or "
If kb5.Value = True Then strFilter = strFilter & "kb = 5 or "

strFilter = Left(strFilter, Len(strFilter) - 3) & ") "

Me.Filter = strFilter
Me.FilterOn = True
End sub



これを For i = 1 to 5
で簡略化することは可能でしょうか?
チェックボックスka1~ka5、kb1~kb5について、
ka1、kb2がチェックされたらフィールドkaが1でフィールドkbが2のレコードを、
ka1,ka2、kb1,kb2がチェックされたらフィールドkaが1 or 2でフィールドkbが1 or 2のレコードを、
抽出するようにしていますが、実際はチェックボックス・フィールドは
kc、kd、ke、、、、と続いていて、コードがかなり長くなってしまい、そのまま書いたら
エラー(プロパティの設定値が長すぎます)になってしまいました。

もしくは、ka、kb、、、を文字変数にした方がよいのでしょうか?

A 回答 (4件)

No.2です。



> ka、kb、kc は 1~5ですが
> kd、ke は 1~6
> kf は1~10
> のチェックボックスがある場合も対応は可能なのでしょうか?

チェックボックス毎に上限の数を持たせれば良いかと思います。


private sub 抽出_Click()

Dim strFilter As String
Dim strFilterWork As String
Dim iLoop As Integer
Dim jLoop As Integer

Dim chkObjList(5) As String
Dim chkObjCount(5) As Integer
chkObjList(0) = "ka": chkObjCount(0) = 5
chkObjList(1) = "kb": chkObjCount(1) = 5
chkObjList(2) = "kc": chkObjCount(2) = 5
chkObjList(3) = "kd": chkObjCount(3) = 6
chkObjList(4) = "ke": chkObjCount(4) = 6
chkObjList(5) = "kf": chkObjCount(5) = 10

strFilter = ""

For jLoop = 0 To UBound(chkObjList)
strFilterWork = ""

For iLoop = 1 To chkObjCount(jLoop)
If Me(chkObjList(jLoop) & iLoop).Value = True Then
If strFilterWork <> "" Then
strFilterWork = strFilterWork & ","
End If
strFilterWork = strFilterWork & iLoop
End If
Next iLoop

If strFilterWork <> "" Then
If strFilter <> "" Then
strFilter = strFilter & "and "
End If
strFilter = strFilter & chkObjList(jLoop) & " in (" & strFilterWork & ") "
End If

Next jLoop

Me.Filter = strFilter
Me.FilterOn = True

End sub


「Dim chkObjCount(5) As Integer」を追加する形にしちゃってますが、本当は、二次元配列とか使った方がいいかも・・・です。
    • good
    • 0
この回答へのお礼

できました、助かりました。
詳しく教えて下さりありがとうございます。

お礼日時:2020/05/13 14:40

そういう事です。


なので処理コード変えても解決には至りません。

SQLのIN句が利用できると思います。
これで試してみてください。

とりあえず、最大文字数を手入力するなり算出してみて、その時点でアウトなら別案を考えましょう。
    • good
    • 0
この回答へのお礼

なるほど、、、ありがとうございます。

お礼日時:2020/05/13 14:40

こういうことでしょうか?



private sub 抽出_Click()

Dim strFilter As String
Dim strFilterWork As String
Dim iLoop As Integer
Dim jLoop As Integer

Dim chkObjList(2) As String
chkObjList(0) = "ka"
chkObjList(1) = "kb"
chkObjList(2) = "kc"

strFilter = ""

For jLoop = 0 To UBound(chkObjList)
strFilterWork = ""

For iLoop = 1 To 5
If Me(chkObjList(jLoop) & iLoop).Value = True Then
If strFilterWork <> "" Then
strFilterWork = strFilterWork & ","
End If
strFilterWork = strFilterWork & iLoop
End If
Next iLoop

If strFilterWork <> "" Then
If strFilter <> "" Then
strFilter = strFilter & "and "
End If
strFilter = strFilter & chkObjList(jLoop) & " in (" & strFilterWork & ") "
End If

Next jLoop

Me.Filter = strFilter
Me.FilterOn = True

End sub
    • good
    • 0
この回答へのお礼

ありがとうございます、できました。
ka、kb、kc は 1~5ですが
kd、ke は 1~6
kf は1~10
のチェックボックスがある場合も対応は可能なのでしょうか?

お礼日時:2020/05/13 13:23

プロパティ設定値とは、何のプロパティか理解されてますか?

    • good
    • 0
この回答へのお礼

ボタン(抽出)を押したときに表示されるので、ボタン(に設定したイベント)のことだと思っていましたが、、

Me.Filter = strFilter にエラーが示されてるので、そもそも抽出条件が複雑すぎるということなのでしょうか?

お礼日時:2020/05/11 17:08

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