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

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

  • コントロールに入力された内容をチェックして、ダメならフォーカスを移したくありません。でも、SetFocus メソッドが効かないみたいなんです...
  • それ、コントロールの更新後処理でやってるでしょ。実は、こういう入力内容チェックに一番適したイベントは更新前処理。なんでかってと、ここでも書いてるけど、更新前処理はキャンセルできるから。コントロールの更新前処理イベントをキャンセルすると、フォーカスは移動しないっす。
    更新後処理でいくら Setfocus しても、その Setfocus が終わったあとで通常のキー操作によるフォーカス移動(これがあったから更新後処理イベントが動いてるはず)が起きるんで無駄になっちゃうんですな。
    やるなら更新前処理イベントでやりましょう。ただ、ヘタすると正しいデータを入力できず、フォーカス移動ができないからにっちもさっちも行かなくなって、結局終了させるしかないなんてクソなプログラムになる可能性があるから十分気をつけてね。
  • VBでMDB扱ってるんですが、テーブルをcsvファイルに出力するのに簡単な方法ないですか?

    この文書は必見ですよ。
    [VB5] 他形式のファイルから Jet データベースへのインポート方法
    これはテキスト、Excelからのインポートの方法ですが、入と出を逆にすればエクスポート(出力)だって可能だし、応用でcsv形式を扱うことだって可能です。
    つまり「Connect プロパティ」で参照できる相手先ならなんだって扱えちゃうってことになりますから、(事前にある程度の環境確認は必要ではあるものの)こりゃー利用価値あるでしょう。

  • いま開いてる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」と入力します。
    そのあと、そのコントロールの「集計実行」プロパティを「グループ全体」または「全体」に設定します。
    さぁ、プレビューを見てみましょう。

  • オートナンバー型で欠番ができちゃいました。連番にもどせますか?

  • Microsoft のサポート技術情報を見ましたか?

  • 自分のマシンではちゃんと動いてた MDB ファイルなんですが、他のマシンでは動きません。何故?
  • 突然、Format関数やDate関数でコンパイルエラーが出てしまい、クエリーでも使えなくなってしまいました。

  • 動かないマシンで、なんでもいいですからモジュールコードをデザインビューで開き、「ツール」-「参照設定」を選んでください。
    「参照可能なライブラリファイル」の一覧が表示されますが、その中に「参照不可」となっているものがありませんか?
    そこについているチェックをとりあえずはずし、コンパイルしてみてください。
    その参照ライブラリが絶対必要である場合を除き、これで動作するはずです。
    必要なライブラリがない場合は、そのマシンにライブラリファイルをセットアップしてください。
    ちなみに、Access2000 では、Windows2000でつくった MDB ファイルを他OSへ持っていくと、参照設定で問題が生じ関数がエラーになったりするようです。(ここ参照)Office2000 SR-1 で修正されたらしいですが。

  • Docmd.RunSQL で SQL 文を実行したら、その後の動作につじつまが合わない部分が・・・

  • Docmdオブジェクトの実行は非同期です。つまり、RunSQLで実行したSQL文が終わる前に次のステップが実行されます
    そのSQL文が確実に終わってから次のステップを実行したい場合、Executeメソッドを使いましょう
    逆に、ただ複数のテーブルの中身を全部削除したいだけ、前の処理が終わってようと終わってなかろうとカンケイない、という場合は非同期でがんがん実行する、って手も考えられますね。

  • オートナンバーで絶対に連番にしたいんですが、レプリカを作ったら勝手にランダムに・・・

  • レプリカを作ったってことは、同時に別ファイルに対してデータの入力をするってことですから、インクリメントにしたらあとでデータをマージするときに絶対にダブっちゃうじゃないですか。まぁランダムでも絶対にダブらない保証はないですけど・・・
    しかし、いまどきレプリカ作る人っているのかな?イナイヨネー
  • モジュールで最適化してるんですが、経過状況がステータスバーに表示されません。

  • これ、残念ながらできないようです。メニューバーから手動で最適化したときには出るんですから、なにか方法があってもよさそうですが、私が調べた限りではできないようです。
    もしかすると、隠しメソッドや隠しプロパティがあるのかも??まぁ、想像ですので、真偽のほどは不明。
    メニューバーから実行する「最適化」と、VBAのCompactDataBaseメソッドがそもそも違うものである、という話もありそうですが、これも想像ですので真偽のほどは不明。
    SysCmd 関数で処理インジケータを出すことはできますが、最適化の処理経過がつかめませんので、やっぱしダメですね。
    余談ですが、SysCmd 関数は結構使えそうなんで、Help読んでおくことをお勧めします。なぼもつい最近まで知らんかった(汗)

  • 「月末日」を求める関数ってありますか?

  • DateAdd("d",-1,Format(DateAdd("m",1,[年月日]),"yyyy/mm")&"/01")
    で、どうですか?

  • 「四捨五入」する関数ってありますか?

  • ありません。
    Access2000 のヘルプで検索すると、Round 関数がヒットしちゃいますが、これは四捨五入ではない銀行型丸め関数なので注意しましょう!Excel のワークシート関数がヒットしちゃうこともあり。なんとかなりませんかこのヘルプは。
    0.5 を足して、Int関数で整数にしましょう。小数点以下第何位を四捨五入したい、というなら 10 を掛けて小数点以下1位で計算後、またもとの位に戻しましょう。(つまり 10 で割っていく)
    これを応用すれば、五捨六入だろうが六捨七入だろうが思いのままですね。
    また、Format関数を使って四捨五入するという方法もありますが、Format関数の戻り値はString属性のVariant型(Format$関数はString型)なので、結果を計算に使いたいときには不向きかも・・・?
    例:Format([単価], "##,##0.0") 小数点第2位で四捨五入した結果が返されます。
    [単価]の値が 128.05 だった場合 128.1 が返ります。
    ただし OS が WindowsXP、Access 2000 以降 で使う予定がある場合はやめましょう。
    Windows XP 上での Format 関数の動作について
    この件、最初は「仕様です」つってて、あとから WindowsXP SP-1で修正されたのですよ。まったくなんというかもう、何を信じてよいのやら(汗)
    というわけで、信じるのは己のみ(・_・)ノ の精神で、やっぱり自分でモジュール作ることをお勧めしますわ。

  • 1行前のデータを参照する関数ってありますか?

  • ありません。
    前のデータと同じものを入力したい、というだけなら Ctrl+'を使いましょう。

トラックバック(0)

トラックバックURL: http://www.naboki.net/movabletype/mt-tb.cgi/30