Access

Accessのフォームのプロパティで「並べ替え」を設定しても表示されているレコードのが並べ替えられない現象が発生!

なぜこの様なことが発生してしまうのかいろいろと調べた結果、あることをすると並べ替えが無効になってしまうことがわかりましたので、下記に明記しておきます。

状況

まず、状況ですが、使用しているAccessは少々古いAccess 2000(もう10年前にもなるんですね)です。フォーム上にはサブフォームがあり、そのサブフォームのレコードの並べ替えができません。サブフォームのレコードソースには

SELECT * FROM (テーブル名) WHERE ID=○○

で設定。そして、もちろんサブフォームのプロパティーの「並べ替え」ではその項目のフィールド名を指定していて、フォームが開く時に

Me.OrderByOn = True

として並べ替えを有効にしています。

症状

通常、この状態であればフォームを開けばサブフォーム上のレコードは「並べ替え」で指定したフィールドで並べ替わっているはずですが、表示されている画面を見ると全然変わっていません。

 「???何で???」

なぜ並べ替えができないのかを調べてみると、フォームが開き終わったところで、サブフォームのOrderByOnがFalseになっています。つまり、サブフォームが開く時に設定したOrderByOnがいつの間にかFalseに切り替わっているのです。

原因

更に原因を追及してみるとやっと発見しました。

実は、上記に明記していませんが、サブフォームのレコードセットはフォーム上から設定しています。AccessでレコードセットをVBAで設定するとOrderByOnはFalseになるようです。

ちなみに、Accessはフォーム内にサブフォームが設定されていると

サブフォームを開く

フォームを開く

の順番で表示されます(多くの方が逆のフォームが開いてからサブフォームが開くイメージだと思いますが、実はサブフォームから開きます)。

今回、サブフォームの「開く時」のイベントで設定した「OrderByOn = True」はその後にフォームが開く時に設定するサブフォームのレコードソースで「OrderByOn」はFalseに戻ってしまい、今回のような並べ替えが実行されなくなってしまいます。プログラムの流れで書くと下記のようになります。

'サブフォームを開く時
Private Sub Form_Open(Cancel As Integer)
    With Me
        .OrderByOn = True
        .OrderBy = "(フィールド名)"
    End With
End Sub
'フォームを開く時
Private Sub Form_Open(Cancel As Integer)
    With Me.Controls("sfmMiddleMitsumori")
        .RecordSource = "SELECT * FROM WHERE ID=○○"
        '↑この設定時にサブフォームのOrderByOnがFalseになる。
    End With
End Sub

ちょっとわかりにくいかもしれませんが、これがわかるのに1,2時間掛かってしまいました(^^ゞ。もし同じようなことで悩んでいる人がいたら参考になればと思います。(こんな特殊な状況は他にはいないかな?)

Access VBAプログラミング開発工房 データベース構築実践編

著者/訳者:緒方 典子

出版社:ソシム( 2005-11 )

定価:

単行本 ( 379 ページ )

ISBN-10 : 4883374610

ISBN-13 : 9784883374618