Q.一言で終わる「FAQ」大集合!

* Amazon Access 関連書籍情報

どーーしてもわかんない、だけど聞いちゃえば一言でオシマイ。
こんな「FAQ」、ありますあります。
よくある質問を集めてみました。

  • コントロールに入力された内容をチェックして、ダメならフォーカスを移したくありません。でも、SetFocus メソッドが効かないみたいなんです…
    それ、コントロールの更新後処理でやってるでしょ。実は、こういう入力内容チェックに一番適したイベントは更新前処理。なんでかってと、ここでも書いてるけど、更新前処理はキャンセルできるから。コントロールの更新前処理イベントをキャンセルすると、フォーカスは移動しないっす。
    更新後処理でいくら Setfocus しても、その Setfocus が終わったあとで通常のキー操作によるフォーカス移動(これがあったから更新後処理イベントが動いてるはず)が起きるんで無駄になっちゃうんですな。
    やるなら更新前処理イベントでやりましょう。ただ、ヘタすると正しいデータを入力できず、フォーカス移動ができないからにっちもさっちも行かなくなって、結局終了させるしかないなんてクソなプログラムになる可能性があるから十分気をつけてね。
  • いま開いてる mdb のパスが知りたいんですが、VisualBasicで言う「App.Path」ってないんですか?
    App.Path、ザンネンながら無いです。
    開いてる mdb(CurrentDB)のフルパスなら、CurrentDB.Name で取れますが、これはファイル名もくっついてきますので、パスだけが欲しい人は工夫が必要ですね。
    Access2000 以降では CurrentProject.Path というプロパティがふえましたので、これを使えばいいかも。
  • レコードセット作って件数を調べようと、RecordCount プロパティを見たら、全然数字が合ってません。これってバグですか?
    あのね、なんでもかんでもバグバグ言うの恥ずかしいからよしてね。
    RecordCount プロパティのヘルプに書いてあるでしょ?「ダイナセット タイプ、スナップショット タイプ、または前方スクロール タイプの Recordset オブジェクトのレコード数は、すべてのレコードがアクセスされるまでは RecordCount プロパティを調べてもわかりません。」(Access97ヘルプより抜粋) ヘルプ読んでないって証拠じゃん。
    DAOなら MoveLast すれば件数判るけど、これって結局全行読み込んでるからむちゃくちゃ時間の無駄だし(これもしっかりヘルプに書いてある)、ADOになるとOLEプロバイダによってサポートされたりされなかったりしますよ。
    RecordCount プロパティを使うより、あらかじめ同条件で件数数える SQL 文を発行(select count(*) ~)したほうが早いことのほうが多いです。ただ、同じ条件で2回検索することになるから(^^;)ちょっとむなしいですけど…

    それよりか、件数をあらかじめ数えておくって処理、本当に必要ですか???
  • テーブルデザインをいじっていたら、フィールドの数が多すぎますといわれ保存できなくなりました。最大数は 255 個のはずでは?
    フィールド名を変更したり、型を変えたり、フィールドを削除したり追加したり、いろいろいじくっているうちに上書き保存ができなくなることがあります。
    こんなときは、いったん「別名で保存」して、古いテーブルを削除してから名前を変えてあげれば問題なし。
  • 表形式のフォームやデータシートビューで、レコードとレコードの間に新しいレコードを入れたいんですが。
    できません。新規レコードはいちばん下です。
    たとえ途中に挿入したとしたって、テーブルのデータシートビューなら次に開いたときには主キーの順番に並び変わっているし、Access ではデータを挿入した順番なんて持ってませんから意味ないですよ。
  • クエリーにはデータを入力できないんですか?
    できる場合と、できない場合があります。
    クエリー内で集合関数(Sum 等)を使っている場合や、ユニオンクエリーはデータの更新はできません。
    普通の選択クエリーでも、テーブルの結合状態によっては更新できないことがあります。その場合は、結合しているテーブル同志できちんと1対多の関係が保たれているかどうか確認しましょう。
    結合しているテーブルがあまりに多く複雑な場合、この関係がきちんと保たれない場合があります。詳しくはHelpを確認してください。
    わかりにくい場合は、結合しているテーブルを1つ1つはずしていくとどの結合が悪いのかわかります。
  • レポート上で、連番を表示したいんです。
    レポートをデザインで開き、連番を表示したいところに非連結のコントロールをひとつ作成し、レコードソースに「=1」と入力します。
    そのあと、そのコントロールの「集計実行」プロパティを「グループ全体」または「全体」に設定します。
    さぁ、プレビューを見てみましょう。
  • 自分のマシンではちゃんと動いてた mdb ファイルなんですが、他のマシンでは動きません。何故?
  • 突然、Format関数やDate関数でコンパイルエラーが出てしまい、クエリーでも使えなくなってしまいました。
    動かないマシンで、なんでもいいですからモジュールコードをデザインビューで開き、「ツール」-「参照設定」を選んでください。
    「参照可能なライブラリファイル」の一覧が表示されますが、その中に「参照不可」となっているものがありませんか?そこについているチェックをとりあえずはずし、コンパイルしてみてください。
    その参照ライブラリが絶対必要である場合を除き、これで動作するはずです。必要なライブラリがない場合は、そのマシンにライブラリファイルをセットアップしてください。
  • Docmd.RunSQL で SQL 文を実行したら、その後の動作につじつまが合わない部分が・・・
    Docmdオブジェクトの実行は非同期です。つまり、RunSQLで実行したSQL文が終わる前に次のステップが実行されます
    そのSQL文が確実に終わってから次のステップを実行したい場合、Executeメソッドを使いましょう
    逆に、ただ複数のテーブルの中身を全部削除したいだけ、前の処理が終わってようと終わってなかろうとカンケイない、という場合は非同期でがんがん実行する、って手も考えられますね。
  • オートナンバーで絶対に連番にしたいんですが、レプリカを作ったら勝手にランダムに・・・
    レプリカを作ったってことは、同時に別ファイルに対してデータの入力をするってことですから、インクリメントにしたらあとでデータをマージするときに絶対にダブっちゃうじゃないですか。まぁランダムでも絶対にダブらない保証はないですけど・・・
    しかし、いまどきレプリカ作る人っているのかな?イナイヨネー
  • モジュールで最適化してるんですが、経過状況がステータスバーに表示されません。
    これ、残念ながらできないようです。メニューバーから手動で最適化したときには出るんですから、なにか方法があってもよさそうですが、私が調べた限りではできないようです。(2020 年の現在はどうだかわからんです)
    もしかすると、隠しメソッドや隠しプロパティがあるのかも??まぁ、想像ですので、真偽のほどは不明。
    メニューバーから実行する「最適化」と、VBAのCompactDataBaseメソッドがそもそも違うものである、という話もありそうですが、これも想像ですので真偽のほどは不明。
    SysCmd 関数で処理インジケータを出すことはできますが、最適化の処理経過がつかめませんので、やっぱしダメですね。

    余談ですが、SysCmd 関数は結構使えそうなんで、Help読んでおくことをお勧めします。なぼもつい最近まで知らんかった(汗)
  • 「月末日」を求める関数ってありますか?
    DateAdd(“d”,-1,Format(DateAdd(“m”,1,[年月日]),”yyyy/mm”)&”/01″)
    で、どうですか?
  • 「四捨五入」する関数ってありますか?
    ありません。
    今は  Round 関数 が使えるよ!!いい時代になったね!!
  • 1行前のデータを参照する関数ってありますか?
    ありません。
    前のデータと同じものを入力したい、というだけなら Ctrl+’を使いましょう。