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
コメント