Microsoft Access 掲示板

検索のテキストが消えてほしい / 13

14 コメント
views
4 フォロー
13
hiroton 2020/09/07 (月) 16:49:01 2d6b2@f966d

Mid関数もちゃんと使ってください

DoCmd.OpenForm "F_案件", acNormal, "", Mid(strFilter, 6), , acNormal
'または'
DoCmd.OpenForm "F_案件", acNormal, "", Mid(strFilter, Len(" AND ") + 1), , acNormal

6はマジックナンバーってやつですね。テンプレ的な記述ですが、意味のある形で記述しておくと後で見直した時も何をやっているのか分かりやすいコードになります

こういった検索なんかで複数の中からいくつかを選ぶ場合、例えば
「A and B and C」
「B and C」
「A and C」
「A」
のように、選択された項目数nに対して連結するための文字列がn-1必要という形になります。
コードを記述するなら

If (Aの条件があった場合) Then
  If strFilter <> "" Then strFilter = strFilter & " AND "
  strFilter = strFilter & Aの条件
End If
If (Bの条件があった場合) Then
  If strFilter <> "" Then strFilter = strFilter & " AND "
  strFilter = strFilter & Bの条件
End If
If (Cの条件があった場合) Then
  If strFilter <> "" Then strFilter = strFilter & " AND "
  strFilter = strFilter & Cの条件
End If

のように、毎回Ifでチェックしてもいいんですが、

If (Aの条件があった場合) Then strFilter = strFilter & " AND " & Aの条件
If (Bの条件があった場合) Then strFilter = strFilter & " AND " & Bの条件
If (Cの条件があった場合) Then strFilter = strFilter & " AND " & Cの条件

If strFilter <> "" Then
  '先頭に必ずいらない" AND "がついているので取り除く'
  strFilter = Mid(strFilter, Len(" AND ") + 1)
End If

のように作りこむとコードがすっきりするというテクニックです。このテクニックを使っているので、最後にフィルター文字列を指定する部分でMid(strFilter, 6)とするわけです


ついでですが
BuildCriteria関数の2番目に指定している「10」もマジックナンバーってやつです。関数の動きを切り替えるためのいわばモード指定なんですが、ここにはデータ型を指定することとなっています
標準関数で使うこういう数値には組み込み定数というのが用意されていて、このデータ型の場合、DataTypeEnum 列挙 (DAO)が使えます

BuildCriteria("伝票NO", 10, "" & Replace(Me.txt伝票NO, vbCrLf, " And ") & "")
'次の記述でも同じ'
BuildCriteria("伝票NO", dbText, "" & Replace(Me.txt伝票NO, vbCrLf, " And ") & "")

「10」だと10ってなんだよってなりますが「dbText」だと何となく意味がわかりますね。何か調べようと思った時も「dbText」なら検索のキーワードに使いやすいです

通報 ...