Access を快適に! 暫くココに気が付いた事を書き溜めます
--- 2018-06-07 ---
3度目のアタックチャンス?
(^^);
グルグルの開発サービスかも知れませんが、
so-net か?
相変わらず、この時間帯はカキコしちゃ駄目ね
--- 2018-06-04 ---
色んな、事を追記していきます
画面系を中心に!
(画面系)
<<画面を広く使いましょ>>
Form プロパティ
PopUp = ON
(^^); これだけネ
アクセス自体を小っこくして下さい
で、フォームが画面全体で動かせます
広々ネ
<<フォームの中のサブフォーム>>
サブだから、サブフォームではござらんです
条件画面が1つのフォーム
一覧画面がもう一つ別フォーム
これ分離型ね
通常なサブフォームのカーソル移動
![Fsub].SetFocus
![Fsub].[Item1].SetFocus
2回するって事ね
因みに、VB は、1回でOK
上位な言語だから?
<<基本的には1画面>>
余程の事が無い限り、入力画面は1画面
スクロールなし、Tab も作らない
<<Codeゼロ>>
マスタなどにゼロを使う人が良くいます
私も使いますが、他の人とは意味が違います
必ず、1以上の整数値を使いましょう
<<モーダル、モードレス、システムモーダル>>
モードダル禁止、入力中に他の画面の確認が出来なくなります
もしもモーダルが必要だったら基本的な考え方が間違っています
システムモーダルとの違いも一応、知っておきましょう
<<入力は非連結>>
これも基本的な事
データベースに連結させてる人が殆どです
これだとExcel 以下です、そもそもな事が分かって無いからこう言う事が出来るのネ
何が駄目かは良く考えましょう
<<履歴な一覧入力>>
グリッド的な方法です
別途、ツールが売っていますが、普通の環境では購入出来ません、凄く高いし、似たものも標準搭載されていますが、極めていませんが使えるレベルでは無いです
どうするか?
一時テーブル入力用を作成し、ここで編集、その後、本番へコピーする
<<Option丸ポチ、トグル?>>
VB = 項目(x) 配列可能、Frame 範囲もOK
Access = 1つづつ
★回避方法
![Fxxx].Controls("項目" & ix) = "1234"
ix = 数値
項目名を、項目1、項目2、などにする
これは、レコードなどでも同じ
配列的参照は良く使います
Cells(x, y) な感じです
(^^); お願い、保存
<<配列的チェックボックス>>
テーブルを作るな方法も有ります
レコードにNo、CheckBox、10個とか
サブフォーム表示、意外と楽チンSIM ね
注意点、DoCmd とかで、変更時保存をする
これが無いと、即保存とはなりません
意外とハマった物件情報(^^)?
<<項目の上に項目を重ねる>>
VB = 最前面で出来る
Access = 上手く画面の上に実行時は重ねられない
計算は、Height?、Width、で計算できます
一覧の上に重ねて、エクセルみたいに表示と入力が切り替えできる
メリットは、視覚的に入力可能
Access は、入力行を表示させ、非連結でチェックした後に行登録
これが1番、確実です
一覧に全ての項目を表示させる事は出来ないので!
エクセルみたいに全部表示させると見辛くなり一覧表示のメリットが無くなります
(^^); アタックチャンス?
<<フォームの起動時指定>> 2018-06-10
オプションに有ります
通常メニューは、SwichingBord
これ、ms 分は、小さ過ぎニャので、
左10個、右10個で加工して使ってます
フォーム、ロジックの配列変数だけ修正
他は、各フォーム画面の余ったところをダブルクリックでメニューが表示される様にしています
アクセスの場合、小さい画面にしても、それぞれがタスクバーに表示されません
小さくすると、メニューバーの文字も見えません
ニャので、結局、メニューは閉じる事が多いです
メニューを閉じると、ボタン表示で、各画面に付けるか、上記の方法か?になります
ボタンをそれぞれ配置するのは面倒なので、共通マクロを作って、そこでメニュー表示、フォームにダブルクリック時のイベントにマクロを指定するダケです
本格的に業務系を作るのであれば、メニューやフォームの最小化時の事も考えた方が良いです
ms が、もう少しフォームのバーを大きくすれば良いのですが、黒の組織が担当ニャので言っても意味が分からないと思いますので諦めています
(^^);
使える範囲で工夫して使う!ms 使用時の大原則です
期待しちゃ駄目って事です
<<MSGBOX のデフォルト>>
必ず、No、キャンセル、です
これ絶対です
セブンの人に多い傾向!
レジでお金を扱ってるのに、良く確認もせずに、
パ、ぱぁ〜ん、ってEnter Key 的なキーを叩く人がいます
業務も同じ
それがカッコイイと思ってる様です
必ず、間違えてエンターを叩いても、更新させない様にしましょう
<<Access からExcel へ>> 2018-06-11
アクセスから制御するエクセルのコードが分かりませんネ
これは、
Excel 側で、マクロの記録で確認します
必要な所だけをコーディング
注意点は、定数です
Excel は、エクセル用の定数なので、コード(数値) を直接数値で指定します
調べ方、F2 これで検索して下さい
コメントなどに転記しておけば後で、分かり易いです
因みに、
Shift F2 で、Call しているサブルーチンが参照できます
滅多に使いませんけどネ
<<画面の切替え>> 2018-06-14
![Fxxx].SetFocus
複数画面を表示していて、その画面も更新したい時
例えば、
一覧系の入力画面 --> ジャンルに特化した入力画面
の場合など
画面をモーダルにする人は、こう言う細かい作業が苦手な人ね、簡単に言うと面倒くさい
画面項目を削除 --> Insert、更新が確実で速いので!すると一覧画面が、Delete ???、みたいな感じになります
元画面をリクエリすれば良いですが、画面もセレクトして置きたい時などに使用します
別画面の時は、サブ画面的なので有れば無条件に
![Fxxx].ReQuery
これは、画面のクエリごと更新するので、最新になります
色々実験しましたが、無理な時は諦めた方が良いです
上手く出来ない的な例)
.Visible 切替え、フォーカスの関係で自爆する事も有る
.Select 系、Object 等どれも出来ない気がします
タイマで、最小化-->元に戻す
他、、、多数
<<Form 最小化時でも画面を元に戻す>>
これは、単純に、
DoCmd.Open Form xxx
で良いと思います
起動中でも問題ないです、起動チェックは不要
<<再表示後の画面位置>>
リクエリすると画面が初期状態になります
画面一覧の位置がトップになります
例えば、クエリのソートであいうえお順
リクエリ後は、あ になります、入力作業中は、か行です
これを回避するには、
レコード保存です、チェックボックス参照
この違いを理解できるまで検証しましょう
上手く出来ないケース、PC スペック的な部分な場合も有るので、その時は、別の方法か?諦める!
ナゼ、スペックかと言うと?
タスクの切り替えが速かったり、グラボの性能?って感じる事があるからです
高性能なPC が多いので、気にならない事が多いですが、古いPC でも単純入力は出来ますから、端末が複数ある方が便利な事もあります
そして古いPC も近くに置いてる!で、2つで作業、的な事
又は、
忙しい時だけ、古いPC で応援して貰う、など
ms 流の出来ない時は諦める!も必要です
でも、簡単に諦めてはダメです
大体は、解決できますので!
実践は?
例えば、分類コード順、商品コード毎に表示している
ソート順=分類、商品
分類コードは、画面制約上、非表示です
リクエリ前に、分類コードを退避(一時ワークへiX)
![分類].Visible = True
![分類].SetFocus
DoCmd.xxx iX サーチかファインドを使って下さい
![分類名].SetFocus
![分類].Visible = False
大体、こう言う流れです
DoCmd は、エラーが発生すると面倒なので、この前後あたりだけ、エラートラップしてた方が良いです
On Error ReSume Next... ★別途、記載参照
この後、入力フォームが別画面だとすると?
上記の画面切替えが必要になります
当然ですが、
画面をサーチする訳ですから、アクティブ状態で無いと動作しません
画面切換えが先に必要です
その後、戻す!
これも考え方で、登録ボタンを押したら?
自分の画面を閉じるのが、入力が楽なのか、
表示させたままの方が良いのかは、その時々で考えましょう
一律、閉じると不便な時が有ります
そう言う画面は、最初から、一覧画面に入力項目を作っておく方が良いです
レコード単位の処理なのに、サブ画面がイチイチ開くと入力作業に時間が掛かります
あの、1件の入力に5分かかるソフトと同じです
<<右側から画面が左へ戻らない>>
これは、右列にフォームの項目が隠れている場合です
沢山の項目が表示しきれないので、見えない位置にある
エクセルみたいな感じです
一旦、右側へ行ってしまうと?
画面を再表示させても、そのままだったりします
検索だけの画面だと、これはコレで便利です
表示項目の位置がズレないので!
でも、入力画面の一覧だと、
一応、右端の細かい方も確認はしますが、やはり、元の位置、左へ戻って欲しいです
当然、スクロールバーでユーザ側に戻して貰えば良いですが、、、多分、不便です
(^^)?
回避させるには?
左の端に、横スクロールさせる為だけの、テキストボックスを作ります
![ITEM1].Visible = True
![ITEM1].SetFocus
これだけネ(^^)
あとは、非表示にするだけです
上記の注意点も踏まえて、手順は確認しましょう
<<サブ画面付きのリサイズ>>
ReSize です
サブ画面は、自分で調整しないと出来ません
メイン画面の高さ、幅、
サブ画面の高さ、幅、で計算し、フッタなどと共に、プラスマイナスしましょう
これは、かなりイベントが発生するので、エラートラップは必須で!
難しくは無いですが、
コードが長いので、謎のページにアップ予定で!
ロジック自体は簡単です
フッタが有る時は、増減値は計算せずに、直接、変更しながらテストした方が早いです
VB は、普通だったと思いますが、VBA は、計算通りでは動作しなかったので、直接、数値を適当に変更しています
一度、合わせてしまえば、項目が増えて、サイズが変わらない限りは、修正する事は有りませんので!
<<画面のクルクル、更新一時停止>>
これも、適宜、使用しましょう
画面を更新しない方が、見た目も良いですし、処理もはやいです
が、、、更新的な事の場合は、メッセージを出したりする事が有れば、画面の更新はそのままが良いです
イベントでキャンセルを拾う時など!
DoEvents
をループに入れれば、拾えます
なるべく、1分以内で処理が完了する様に作りましょう
別途記載の台帳的なエクセルリンクだと、帳票自体がNo.xls なので、印刷も一覧画面から選択印刷が良いです
10件くらいならリンクを開いて、エクセルで印刷
閉じて、又、開く!
でも良いですが、100件だと、疲れますョ
(^^);
普通は、変更分、一括印刷だと、1000枚以上にはなると思いますので、頑張って作りましょう
ペーパーレスの時代ですが、
やはり大切な部分は、紙として持って置く方が良いかもネ
(^^)?
停電時でも見れますから!
(データベース系)
<<オートナンバ不要>>
確かに有ると便利な時も有りますが、不要
設計が間違えています
<<リレーショナル>>
不要、こう言う所を楽しようとすから動きが遅いSQL が発生します
私のAccess が、どのバージョンでも動作するのは、こう言う所を使わないからです
<<唯一、動作しなかった事象>>
win7、Office2010Pro
自らが重くなり過ぎて? メモリ不足な感じになりました
駄目OS の所以です
256メモリ、壊れかけPC のXP でさえ快適に動作してました
イベント待ちを解消させて終わり
DoEvents
<<レコード項目の記述の違い>>
多分、初めてだと?こう言う違いが分からないんですョね
SELECT [ITEM1] FROM TBL1 AS [MF]...
REC = OPEN ...
<ロジック>
REC![ITEM1]
REC("ITEM1")
REC(0)
<SQL 内>
[ITEM1]
[TBL1].[ITEM1]
[MF].[ITEM1]
これ全部、同じです
ロジックなREC(0)、多分、これが高速です
REC!("ITEM1")、きっとコレが遅い
普通が、最初の書き方ね、分かり易い
遅いと言っても、分かるレベルでは有りません
(0)=項目の順番、0〜 ネ、PCのアドレスはゼロから
アドレス参照的なので、考える事もなく、ソコ指せるのでPC も簡単なのです
<<SQL 条件文>> 2018-06-12
多分?多くの人が勘違いしてると思うのネ
ex) FLG=Boolean スペル合ってる?ON/OFF ね
WHERE [FLG1]
WHERE [FLG1] = True
WHERE [FLG1] = -1
どれも同じです
更に?
WHERE [ITEM1] = "りんご"
WHERE ([ITEM1] = "りんご") = True
これ同じネ!
条件文は、真True -1 が抜けるのです
イコール =、が抜けてる気がするかも知れません
が、、、ビミョ〜に意味が違います
ここ重要!
抜けるのは、真の条件で有ってイコールでは無い
True は省略可能な暗黙の了解!ニャのです
更に、
WHERE [FLG1] = False
WHERE NOT [FLG1]
は、同じ意味です
WHERE NZ([ITEM1], 777) = 777
WHERE ISNULL([ITEM1])
WHERE [ITEM1] IS NULL
これも同じ意味ね
NULL の時は、IS になります
WHERE NZ([ITEM1, 0) > 0
だったら?
入力ありの項目が抜けます
ゼロの用途が違います
っとカキコしたのを読みましたか?
ゼロは、例えば、外部からのインポートで、
通常であれば、文字列の りんご、みかん、が入ってるハズの分類的な項目が、未入力の場合に設定したりします
元々入っていませんでした
っと言う事ね
ユーザ側の登録では、分類は必須入力にします
しかし、
見ず知らずのシステムやエクセル加工では?
この様な事が普通に発生しています
<<クエリなどのOpen>> 2018-06-14
テーブルのレコードをレコードセットで開きます
この時点で、一時的にその時点のレコードを取得しています
なので、追加、変更が有っても、更新はされません
画面でクエリを指定しますが、これは、タイマ的に表示されます
速ければ、即反映、遅いと一定時間後です
その為に、画面の場合はリクエリが必要になります
即反映させたい為です★上述の項目参照
スクロールできるのは?
内部テーブルを持っている、なイメージが良いかも知れません
一旦、その時点の情報を内部で読み込むので、その後、変更したとしても内部テーブルの配列項目は変更されませんョね
レコードは更新されていますが、、、!
ここは、分かり辛い所かも知れません
納得いくまで、テストしましょう
<<違うテーブルだけど、一緒に合体>> 2018-06-16
これは、滅多に無いですが、台帳などではたまに有ります
帳票制限があるので、出来れば、この欄に一緒に表示したい
例)
資格情報と講習会の情報
国家資格的な物と内部的な資格
テーブルは別々ネ、多分そうかな?
分類コードで分ける場合も有りますが、
コレ結合させる時に意外と面倒です
例)
分類=1、国家資格
分類=2、内部資格
VBA などコードを書けば簡単ですが、
Access だと、結合コード1だけ結合が難しいケースが有ります
出来なくは無いですが、プライマリが複数あり、しかも、抜きたいコードが限定してる
意外と面倒、キーで無ければ良いのですが、、、
取り敢えず、結合です、△=半角空白
SELECT ITEM1, DATE1 FROM TBL1
UNION△
SELECT ITEM5, DATE5 FROM TBL5
項目数は最初に依存します
5個なら、次も、5個です
それぞれに、JOIN、WHERE 条件は指定できます
但し、ソート
ORDER BY
は注意が必要です
最初のテーブル名が、全体のSQL、テーブルのレコード名になります
なので、使える名称は、ITEM1、DATE1 です
この場合、ソートですが、違うテーブルなので、
キーと言っても重複する訳です
日付だけで、ソートで良いです
で、有れば簡単ですが、
TBL1、5、の順にしたい
又は、
同じ日付の時は、最初が1、次が5、にしておくと
キーがユニークなので、
帳票を作る毎に順番が変わってしまう事が無くなります
例)
SELECT 1 AS [SORT-KEY] ... FROM TBL1
UNION
SELECT 2 ... FROM TBL2
1、2、が自分が決めた順番です
更に、コードも一緒に付加したい
キーは、1000も絶対有り得ません!
ニャらば?
SELECT ITEM1 + 1000 AS [SORT-KEY]
ORDER BY [SORT-KEY]
又は、1番目なら、
ORDER BY 1
になります
慣れれば簡単ですが、マニュアル通りなのにエラーが出る!
書き方、下手ね?私のも(^^)?
まっ、自分が分かる書き方の人が書いた本を探すしか無いです
後は?自分で納得いくまで実験する!
他の方法は?件数が多ければ、キーだけ、一時テーブルに書き込んだ方が高速です
帳票作成用、ローカル側に作ります
サーバ側では有りません
人それぞれに、作れる様に、ローカルです
(その他諸々)
コードを書く場所、標準モジュール
クラスやイベント処理に書くのは、VB などの開発専用環境ね
ここを信じ過ぎると自爆する
更には、メンテナンス性も悪くなる
VB なども同じかナ
結局、自分が開発しているつもり?かも知れませんが、誰かが決めた環境下で、作ってるダケね
末端のユーザで有る事を忘れない事!
大元がコケたら自分もコケます、全く悪くないですが!
<<インデックスキー自動作成>> 2018-06-10
オプションに、ID、番号、などデフォルトが組む込まれています
絶対に、クリア(空白) にしておきましょう
これ、知らずにデータベースをあれコレ作っておりました
遅い、と言う事は無かったのですが、、、
重複キーとなり引っ掛かり、自分がボケていたのかと思い、全部を見直した経験が有ります
(^^);
要らないので! 他は、環境依存させない様に、なるべくデフォルトで使う様にしていますが、コレだけは絶対にハズします
例) 分類番号は重複します
---
明日見むら
村長さんでした
(^^)/ Access