Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 37
Screen.PreviousControl.SetFocus
Case 38
Screen.PreviousControl.SetFocus
Case 39
Screen.PreviousControl.SetFocus
Case 40
Screen.PreviousControl.SetFocus
Case Else
End Select
End Sub
Private Sub Form_Open(Cancel As Integer)
Dim T As Long, H As Long, W As Long, L As Long
On Error GoTo Finally
DoCmd.Echo False '画面描画抑制
W = Me.WindowWidth 'オリジナルのウィンドウ幅
L = Me.WindowLeft 'オリジナルのウィンドウ左位置
DoCmd.Maximize 'ウィンドウ最大化
T = Me.WindowTop '最大化時のウィンドウ上位置
H = Me.WindowHeight '最大化時のウィンドウ
DoCmd.Restore 'ウィンドウサイズを戻す
Me.Move L, T, W, H 'ウィンドウ位置とサイズを設定
Finally:
DoCmd.Echo True
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Me.SelHeight > 1 Then
DoCmd.RunCommand acCmdSelectRecord
End If
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If X<= 270 Then
SendKeys “{LEFT}”
End If
If X > 270 And Y<= 240 Then
SendKeys “^ “
End If
デフォルトの動作を拒否するなら
KeyCode=Null
としてなかったことにするほうが常套手段ですね無理矢理ですので、最終的にどうなるかわかりません。
プロパティシートを表示してフォームを選択、デザインタブのキーボード取得イベントをはいに設定。
>> 5
もしくは、サブフォームのプロパティシートでフォームを選択して、イベントタブのキーボードイベント取得を「いいえ」から「はい」に変更すれば、(サブ)フォームのキー解放時イベントであれこれできるのかも。試してないけど。
サブフォームのフィールドそれぞれに、キー解放時
まことにありがとうございます。
マウスアップによる対応でうまくいけました。
再度申し訳ありません。
もう1点助言いただけないでしょうか。
「Shitft+矢印キーでの範囲選択も防止しさせたい」のですが、これはどこのどの条件とすればよいのでしょうか
データシートはサブフォームになっているため、
アドバイス頂いたマウスアップ同様、サブフォームのキークリック時を追加し、
シフトを入力対象から除外すれば行けるのではとも考えたのですが、
そもそもキークリックイベントが発生してくれず、頓挫しました。
どうかよろしくお願いいたします。
ありがとうございます。ありがとうございます。ありがとうございます。
上記に手を加えることで形になりました
最大化させて長さを取ればよかったのですね、盲点でした
いちおう上記の仕様だとしたら、下記でどうでしょう。
そのサブ画面フォームは「ポップアップ」が「はい」になっている、あるいはダイアログモードで開いているということでしょうか。
で、そのフォームの高さをディスプレイの高さに合わせたいということがご希望でしょうか。
締められましたが、最後にアドバイスを。
Accessはまがりなりにもデータベースソフトですのでテーブル設計等の基礎は大事です。
それができていないと、今回のようトラブルになります。
テーブルの設計に関しては、「正規化」をキーワードに調べてみるといいでしょう。
あと、りんごさんも指摘されてますが、リレーションシップについても理解して設定しておくべきです。
リレーションシップを設定した場合の利点 - hatena chips
また、Accessの基本機能でたいていのことはできますので、安易にVBAにせずに、まずは基本機能で作成して、足らない部分をVBAで補うという設計を推奨します。
今回、非連結で設定していますが、連結フォームでVBAをほぼ使わずに同様のことは可能です。基本機能についての学習もされることを推奨します。
りんごさん、ありがとうございます!
勤務先の方に診てもらいました。
無茶苦茶な内容で、
なるべくして成ったとの事でした。
時間に追われて、早く仕上げたく
基本的な内容が割愛されている
難しい本を見よう見真似で
無理矢理こじつけた内容だった
と思います。
急がば回れで、組み直してみます。
hatenaさん、
色々とありがとうございました。
お陰で大事な基礎を飛ばしていた事に
気付く事ができました。
長くなったので、締めたいと思います。
みなさん、ありがとうございました!
私も帳票フォームにすることを推奨しますが、データシートでということなら、下記でどうでしょう。
禁止自体は難しそうなので、マウスアップ時に複数行選択していたら、すぐに1行選択にするというコードです。
データシートの利点を禁止したいなら帳票フォームで作ればいいのでは?
残念ながら禁止は出来ませんでした。禁止選択するんだけどやっぱり駄目だから直ぐにセルに移動しました、という感じです。
データシートビュー
フォームのイベント:マウスボタン解放時。
ググッただけですが、ヘッダーの縦方向を狭くするといいのかも。取り敢えず、10cmまで狭くしてみてどうなりますか?もし解決しなければ新しい質問として別に立てるといいでしょう。
hatenaさん、ありがとうございます!
ご指摘の通り、各部を見直したところ
見事に希望通りになりました!
本当にありがとうございました!
実は、このデータベースとほぼ同じ内容の
ものを、初心者向けの本で一度作ったの
ですが、初心者向けということもあり、
主キーを含め、一から丁寧に解説されて
いて、とてもスムーズに完成しました。
しかし、私の作ろうとしたものは
50人以上4部門で使うDBでして、
本の作例が個人使用に見合ったものだった
ために、一から作り直すことになり、
今回に至りました。
前にも書いたかもしれませんが、
今回参考にした本はVBAに特化した
内容で、初心者向けのそれとは違い
設計とかを割愛したものだったので、
つい主キーを設定し紐付けするのを
忘れた次第です。
ご指摘を受けて、ハッとしました。
最初に作った時の事がよみがえりました。
誠にありがとうございました!
しかし、新たな問題が発生しました。
テーブルにorder fileというローカルな
テーブルがありますが、これを
勤務先の同名のリンクテーブルに差替えると
例の依頼フォーム下部にあるbtn追加ほか
3つのボタンが、消えてしまう現象が
起こってしまったのです。
考えられる事はございますか?
一難去ってまた一難です。
追加ボタンのクリックイベント Private Sub btn追加_Click() 内の下記のコードも修正する必要があります。
1列目以外を代入しているのは、格納値(.Value)を代入するようにしてください。
.Value は省略することかは可能です。
Me!cmb依頼者.Value
とMe!cmb依頼者
は同じ意味になります。上の回答で、この設定は間違いといいましたが、なぜ、まちがいか説明しておきます。
コンボボックスの値集合ソースは下記のようなテーブルになってます。
T_着色作業者
ここで、連結列を3にすると、フィールドには3列目の作業者姓が格納されます。
2行目を選択すれば、「東京」が格納されます。
列幅の設定で3列目が表示されるようになってますので、表示値と格納値が同じになります。
これで、いいように思うかもしれませんが、姓は重複する可能性があります。
例えば、値集合ソースが下記のようなデータの場合、
3行目を選択すると「東京」が格納されます。
あとから、この「東京」からどの作業者か特定しようとしても、2行目の作業者なのか、3行目の作業者なのか判別がつきません。
連結列3の設定の cmb依頼者 で3行目を選択してから、下記を実行してみてください。
格納値: 東京
1列目の値: C02
2列目の値: 5678
3列目の値: 東京
4列目の値: 一郎
というように2行目の作業者がイミディエイトに表示されると思います。重複がある場合、一番上の行が選択されたことになりますので。
つまり、連結列にするフィールドは重複のないユニークなフィールドにする必要があるのです。つまり、主キーフィールドにするというのがデータベース設計の原則です。この値集合ソースなら 連結列 1 です。
コンボボックスに代入しているのに表示されない。
コンボ1: 🔽
コンボ2: 🔽
コンボ3: 🔽
コマンド1
ドロップダウン選択時、連結列が表示されるように変更。
コンボ1: 1🔽
コンボ2: 1🔽
コンボ3:1 🔽
再チャレンジ
コンボ1: 🔽
コンボ2: 🔽
コンボ3: 🔽
コマンド1
コンボ1: 1🔽
コンボ2: 🔽エラー:型が違います。
コンボ3:ほにゃらら🔽
数値型には数値型を代入するように変更。
「Q_依頼履歴」をオートルックアップクエリに修正
検索用のフォーム「F_依頼履歴一覧」の検索フィールドコンボボックス、詳細セクションのテキストボックスのコントロールソースの修正
修正前サンプルファイル
修正後サンプルファイル
変更前と比べてどこが違うか確認してください。
オリジナルをなるべく尊重して最低限の修正しかしてません。
テーブルのフィールド設計が不適切なものがあります。
例えば「T_着色作業者」の「主キー」と「作業者ID」、「主キー」フィールドを主キーにしましたが、「作業者ID」を主キーにしたほうがいいかもしれません。
なぜ、このような2つのフィールドがあるのか、こちらからは意図が分かりません。
主キーの役割を理解したうえで検討してみてください。
オートルックアップクエリの設計例
画像の T_理由、T_理由_1、T_理由_2 は1つの同じテーブルです。T_理由 をテーブルの追加で3回追加すると、別名がついて追加されます。
上記のクエリのSQL
この解決法はデータベースの設計としては間違いです。
連結列は 1 のままにしておいてください。
データベースではほかのテーブルを参照するフィールドはリンク先のテーブルの主キーフィールドを参照する必要があります。
ここで、主キーの値を表示させると、無意味な値になり内容がわかりづらいので、修正前のような表示にしたいですよね。
テーブルのルックアップで表示コントロールをコンボボックスにするとこれが簡単にできるので便利なんですが、データベースの設計について理解できていないと今回のような間違いをしがちです。
初心者のうちはルックアップを使わずにクエリを使って主キー以外のフィールドも表示させるようにするといいでしょう。
このようなクエリをオートルックアップクエリと言ってAccessの必須機能ですので確実にマスターしておくことをお勧めします。
「Access オートルックアップクエリ」をキーワードにWEB検索すると解説ページが多数見つかるのでそのなかからわかりやすそうなサイトで勉強してみてください。
検索用フォームでは、このクエリをレコードソースにすると主キーフィールド以外の列の値で検索することも可能になります。
下記テーブルのフィールドに主キーを設定する。
T_依頼 の下記のフィールドをリンクしているテーブルの主キーの値に変更する。
依頼者
W_No
依頼理由1
依頼理由2
依頼理由2
修正後、「W_No」フィールドのデータ型は「数値型」に変更しておいてください。
送付していただいたサンプルテーブルの場合の修正例
こうすれば、現状の入力フォームで「過去ID読込」ボタンをクリックするとご希望の表示になります。
もし、表示コントロールの修正前のファイルがあるのなら、表示コントロールを変更するだけにして、データを修正しないようにすれば、上記のような手間は不要です。
やっとファイルの中身を見ることができました。
で、原因が判明しました。
これを私は、フォーム上のコンボボックスをテキストボックスに変更したと勘違いしていました。
テーブルのフィールドプロパティで表示コントロールをコンボボックスからテキストボックスに変更したんですね。
で、やりとりに行き違いが生じていました。
で、問題点は、表示コントロールをコンボボックスからテキストボックスに変更したときに、フィールドデータも変更したしまったことですね。
前にもいったように表示コントロールをコンボボックスにした場合、表示されている値と格納されている値が異なる場合があります。
テキストボックスに変換すると格納されている値が表示されますが、それを表示されている値に変更してしまったのが、そもそも間違いです。これを変更してはいけません。
あと、テーブル設計でも、各テーブルに主キーが設定されていません。これもちゃんと主キーを設定する必要があります。
いろいろ修正箇所が生じそうなので、一つずつ説明していくと面倒そうなので、いまから、手直ししたものを作成してそれアップします。
いまから作業しますので少しお待ちください。
hatenaさん、
お手数をおかけします。
よろしくお願いします!
ossannさん、ファイル受け取りました。
今、忙しいので、手が空いたら中身を確認させていただきます。
りんごさん
上手くお伝え出来なかったこと、お許しください!
検索は無事に出来るようになりました。
hatenaさん、社外秘は加工、またはフィールドを削除して
お送りします。
>> 13
>> 20
正直、どうなっているのかよくわかりませんでした。検索できるようになっていればいいのですが。
>> 15
hatenaさんのありがたい提案なので、1度見てもらっていた方がいいと思います。
りんごさん、解決しました!
仰るとおり、頭列の幅を0cmに戻すと、
Private Sub loadForm() で
読み込まなくなります。
で、『連結列』です!
表示したかった列数
例えば依頼者だったら三列目ですので
連結列0 → 連結列3 にしたら
コンボボックス更新後も三列目
読込後も三列目になりました。
ほか、依頼理由1〜3も同様な操作を
行ったところ、無事に解決いたしました。
色々騒がせた結果、こんな所に原因が
あったとは、目から鱗です。
先頭列の幅を0cmに戻すと、Private Sub loadForm() の結果、何も表示されなくなる、という事でよかったですか?また、連結列を1から3に変更するとPrivate Sub loadForm()の内、コンボボックスに代入する所でエラーになる感じで合ってますか?
先頭列の幅を0cm → 0.1cmにしたところ、
先頭列が表示されて
C01🔽
となったのを、三列目を表示させた
ossann🔽
にしたいのです。
🔽
依頼者りんご🔽
1🔽
コンボボックスをドロップダウン選択した後にも、下記のようになって欲しいという事でしょうか
依頼者りんご🔽
hatenaさん、りんごさん
解決の糸口が見えて来ました。
問題のコンボボックスの列幅、先頭列の幅を
0cm → 0.1cmにしたところ、読込にて
三列目の値リストが表示されました。
ただし、コンボボックスで選択した後に、
ボックス内に表示されるのが意図しない
先頭列の値です。
ここで三列目の値が表示されれば、
問題は全てクリアできそうです。
そこで、下記サイトを参考に
集合値ソースで操作しようと試みましたが、
読込で表示されない元の状態に戻ってしまいました。
リンク
コンボボックスで選択後に
集合値ソースT_着色作業者の三列目を表示させ、
且つ読込でも表示させるにはどうしたら良いですか?
りんごさん、ありがとうございます。オートナンバー型をやめてExcelに出力→accessに戻す、でうまくいきました。
自動的に連番を入力するコードが出ていましたので、それでなんとかなりそうです
ありがとうございました!
オートナンバー型を諦める事になりますが、Excelに出力してオートフィルで番号を振ってAccessに戻すのはどうでしょう。以後、データを登録する際に適切な番号を入力する仕組みが必要になります。遅かれ早かれでしょう。
念の為、もともと合わなくなっていないか確認しておくといいかも。
このボタンをクリックしても、何も表示されないということですか。
非常に不可解な現象ですね。
もし、よろしければ、右カラムにあるファイル送信フォームからそのフォームを含むファイルを送ってもらえますか。
テーブルに社外秘のデータがあるなら、データは削除しておいてください。
そうすれば、原因が特定できるかもしれません。
>> 13
なんとも言えないけれど
表面不良一般(格納値は、例えば、1)
txt依頼理由1: 1
依頼者
W_No
品名
希望処置
ロット番号
ロット枝
巻き長さ
依頼理由_1
依頼理由_2
依頼理由_3
補足説明
検品フィードバック
txt検索文字列:
ここに、表示されている値、例えば、表面不良一般を入力すると駄目で、格納されている値、例えば、(ID番号)1だと検索出来るという感じになると思います。
りんごさん
幾つか前に書いた検索コードをうまく利用して
新たに追加したテキストボックスも
検索できるようにできますか?
これが出来れば今回の問題は解決できます。
いっその事こと、コンボボックスをテキストボックスに変更するのでは無く、新しいテキストボックスを作ってコードを変更するのは?txt依頼者、txt依頼理由1、txt依頼理由2、txt依頼理由3
りんごさん
ありがとうございます!
プロパテーシートを確認しましたが、編集ロックは「いいえ」でした。
hatenaさん
コンボボックスに戻すと、しっかり表示されるのです。
ここは、何回か作り直して確認済みです。
コマンドボタンを追加したのち、上記を試しましたが
変化は生じませんでした。
ちょっと気になっている事として、
T_依頼の[依頼者]を以前のようにコンボボックスに戻すと
読み込みで表示される「希望通り」の結果になり、
一方で、コンボボックスの値だけ検索かけてもヒットしないという
「希望通りではない」結果が生み出されています。
コンボボックスを検索ヒットさせる手段はないのでしょうか?
cmb依頼者のプロパティシートのスクショを
2分割にしてみました。何か発見されることを願って,,,