Microsoft Access 掲示板

コードの説明をお願いします

4 コメント
views
4 フォロー

Option Compare Database

Private Sub コマンド101_Click()
Dim myStr As String     '条件
myStr = ""

   '-------------------------------------日時検索--------------------

    If IsDate(開始日.Value) And IsDate(終了日.Value) Then
        myStr = myStr & " And (日時 Between #" & 開始日.Value _
            & "# And #" & 終了日.Value & "#)"

    ElseIf IsDate(開始日.Value) Then
        myStr = myStr & " And 日時=#" & 開始日.Value & "#"

    ElseIf IsDate(終了日.Value) Then
        myStr = myStr & " And 日時=#" & 終了日.Value & "#"
    End If
'-------------------------------------日時検索終了--------------------

'-------------------------------------周知者検索---------------------

  If Not IsNull(Me.周知者) Then
        myStr = myStr & " And 周知者= '" & 周知者.Value & "'"
    End If

'-------------------------------------周知者検索終了---------------------

'-------------------------------------分類---------------------

  If Not IsNull(大分類) Then
        myStr = myStr & " And 大分類 Like '" & 大分類.Value & "'"
    End If

    If Not IsNull(中分類) Then
        myStr = myStr & " And 中分類 Like '" & 中分類.Value & "'"
    End If

  If Not IsNull(小分類) Then
        myStr = myStr & " And 小分類 Like '" & 小分類.Value & "'"
    End If

'-------------------------------------内容---------------------

    If Not IsNull(内容) Then
        myStr = myStr & " And 内容 Like '" & 内容.Value & "'"
    End If

'-------------------------------------検索フォーム起動---------------------

If myStr = "" Then
        MsgBox "抽出条件を入力してください。", vbCritical, "エラー"
    Else
        DoCmd.OpenForm "F_周知", , , Mid(myStr, 6)
        DoCmd.Close acForm, Me.Name
            End If
End Sub

上のコードは検索フォームのコードで、ACCESSの書籍の参考にして自分で記載しました。

 DoCmd.OpenForm "F_周知", , , Mid(myStr, 6)

↑のこのコードの意味が調べても意味がわからないのです。
どのような意味なのか、お手数ですが、ご教示をお願いします。

naoki
作成: 2020/07/07 (火) 10:00:00
通報 ...
1

 DoCmd.OpenForm "F_周知", , , Mid(myStr, 6)

↑のこのコードの意味が調べても意味がわからないのです。
どのような意味なのか、お手数ですが、ご教示をお願いします。

コードの意味が分からないときは、まずはヘルプを参照しましょう。
OpenForm をクリックしてカーソルを置いてF1キーを押すとヘルプページが表示されます。下記のページです。

DoCmd.OpenForm メソッド (Access) | Microsoft Docs

構文
expression.OpenForm (FormName, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs)

上記の構文をみると4番目のパラメータ(引数)は WhereCondition です。
この下のほうにそれぞれのパラメータの役割が説明してあります。WhereConditionの説明は下記です。

有効な SQL WHERE 句を文字列式で指定します。ただし、WHERE という語を指定する必要はありません。

ちょっと遠回りな説明ですが、抽出条件式を文字列として設定するということです。

Mid(myStr, 6) の部分は、やはりMidにカーソルを置いてF1キーを押してヘルプを表示させます。「キーワード」というページが表示されました。下の方にスクロールしていくと「Mid 関数」というリンクがありますのでそれをクリックします。下記のページか表示されます。(ダイレクトにこのページにいけないところがちょっち使いづらいですね。)

Mid 関数 (Visual Basic for Applications) | Microsoft Docs

これを読めば、Mid(myStr, 6) は myStrに格納されている文字列の6桁目以降を取り出しているとわかります。
上の方のコードで myStr変数に条件式を格納しているのですが、" And 条件式" というように前に不要な" And "が付いているので、それを削除しているのです。

分からないコードがあったらこんな感じで調べてみてください。F1でのヘルプは結構目的のページにたどり着けない場合もあります。その場合は「VBA 分からないコード」というようなキーワードで調べればたいてい解説ページにたどり着けます。

2
naoki 2020/07/07 (火) 11:25:34 09c37@96514

いつもご丁寧ありがとうございます。
ヘルプを熟読します。
ありがとうございました。

3
hiroton 2020/07/07 (火) 11:31:54 3dd82@f966d

Mid(myStr, 6)はMid()関数を使った複数の中からいくつかを選ぶときに使うよくある手法ですね。これをそうだと解説しているのはあまり見ない気がします。

謎の数字「6」はLen(" And ") + 1で求められる数値です。(「And」の前後に空白スペースが入っています)

条件が複数選ばれると前後の条件を" And "でつなぐことになりますが、そのままコードにするならば、条件追加の時にはすでに条件があるかどうかをチェックするということになります

ex)前提条件を考えた検索条件の追加コードの一部

'-------------------------------------分類---------------------

  If Not IsNull(大分類) Then
    If myStr <> "" Then myStr = myStr & " And "    '初めての条件でなければ" And "でつなぐ
    myStr = myStr & "大分類 Like '" & 大分類.Value & "'"
  End If

  If Not IsNull(中分類) Then
    If myStr <> "" Then myStr = myStr & " And "    '初めての条件でなければ" And "でつなぐ
    myStr = myStr & "中分類 Like '" & 中分類.Value & "'"
  End If

  If Not IsNull(小分類) Then
    If myStr <> "" Then myStr = myStr & " And "    '初めての条件でなければ" And "でつなぐ
    myStr = myStr & "小分類 Like '" & 小分類.Value & "'"
  End If

:
        DoCmd.OpenForm "F_周知", , , myStr

:

何回も同じことをしているIfが出てきて手間だし読みにくいですね
そこで、最初かどうかにかかわらず、条件にはすべて先頭に" And "をつけておこう、処理の最後に先頭の" And "を削除するようにしようというのがMid(myStr, 6)です

4
naoki 2020/07/14 (火) 14:04:18 09c37@96514

hiroton様

返信おくれて申し訳ありません。
詳しい回答ありがとうございました。