Private Sub Form_Load()
If Me.OpenArgs = "ShowObj" Then Exit Sub
Dim dTime
Dim nSyoukei As Long
Dim nKeikaFun As Integer
Dim s1 As String
Dim c1 As Integer
Echo False
If Me.Recordset.RecordCount = 0 Then
Me.txt時刻.TabStop = False
Me.TimerInterval = 10 '10ミリ秒後にタイマー時イベント実行
Else
'略
End If
Echo True
End Sub
Private Sub cbo食材ID_GotFocus()
Me.cbo食材ID.Dropdown
End Sub
[cbo食材ID]の値集合ソースは
SELECT T食材.食材名, T食材分類.食材分類名, Format([㌍],"@@@") AS カロリー, T食材.食材ID, [×Q食材1].食材名のカウント
FROM (×Q食材1 RIGHT JOIN T食材 ON [×Q食材1].食材ID = T食材.食材ID) INNER JOIN T食材分類 ON T食材.食材分類ID = T食材分類.食材分類ID
ORDER BY [×Q食材1].食材名のカウント DESC , T食材.食材名;
です。
教えていただいたVBAで全て書き直したところ下記のエラーが出ます。
INSERT INTO ステートメントに、認識できないフィールド「11」があります。名前が正しいことを確認して、再度実行してください。
ちなみに11というのは maxIDと同じ値になっています。
ありがとうございます。今回クエリで作ったもののSQLで、自動でカッコがついてしまっていたのですが、SQL画面で外そうとすると
「INSERT INTOステートメントの構文エラーです」と表示され、保存できませんでした。
[DMax("主キーフィールド", "メイン")]
の部分は、
[
]
で囲まずに、DMax("主キーフィールド", "メイン")
に修正してください。
[
]
で囲むとフィールド名して認識されます。すみません。
開いた時に最初にフォーカスするのがコンボボックスで
その時、症状がでるのは、分かっていることでした。
なにぶん、長期間にわたり、解決しなかった事が
一瞬で解決してしまった事に、戸惑っています。
本筋から外れるかもしれませんが、
もう一つの帳票は、コンボボックスにフォーカスする前に
日付を入力するようになっているため、そこでは正常にドロップダウンして、
サブフォームを入力する場合は、最初にコンボボックスにフォーカスします。
一つの入力フォームしか、見せていないのに
なぜ、開いた時最初にフォーカスするのがコンボボックスの時に症状がでると
判断できたのか、知りたいです。
コードに一部ミスがありましたので記載しなおします。
また、エラーもDMamxと記載してしまいましたが、DMaxの書き間違いです。スミマセン
VBAを教えていただいたのですが、accessのクエリで作成してみようと思ったところつまづいてしまいました。
メインはうまく追加できるのですが、サブの追加クエリがエラーで止まってしまいます。
(エラーを飛ばしてメインだけ作成されたりもする)
エラー内容
⇒INSERT INTO ステートメントに、認識できないフィールド'DMamx(・・・・)'があります。名前が正しいことを確認して、再度実行してください。
力不足で申し訳ありません。ご助言宜しくお願いいたします。
開いた時最初にフォーカスするのがコンボボックスの時に症状がでるとの指摘が
的を射ていました。
私は、まったく気づきませんでした。
なぜかは、分かりませんが、問題は解決しました。
ありがとうございました。
hatenaさま>
なるほどです…
もし今後、変更が必要になった際には頑張ってフィールドごと変えてみます(関連する年齢計算とか在職年数とかの変更を考えるとちょっと気が遠くなりましたが(^-^;;
ありがとうございました。
hirotonさん>
ありがとうございます!
希望通りの挙動になりました。
助かりました。
また何かありましたらどうぞよろしくお願いします。
ありがとうございました。
すみません。
今、新しい仕入データを入力すると
やはり、ドロップダウンしませんでした。
ひとつ変化がありました。
なんと、Enter に変更した仕入伝票のサブフォームの明細入力が
一行目からドロップダウンしました。
指摘された時は、ドロップダウンしなかったのですが、
今、新しいデータを入力すると、ドロップダウンしました。
送信した 食事明細入力.accdb はドロップダウンしないことは
一度確認しましたが、なんだか訳が分かりません。
送信ファイル、拝見しました。
開いたときに最初にフォーカスがくるのがコンボボックスのとき、症状がでるようです。
txt時刻の「タブストップ」を「はい」にすると開いたときこれに最初にフォーカスがきますので、その後、コンボボックスにフォーカスを移動するようにすればいいでしょう。
ただし、開く時イベントでフォーカス移動しても同じ症状になるので、タイマーイベントを使って少し遅らせてフォーカス移動させるようにすれば、コンボボックスのリストを開いた状態にできます。
txt時刻
タブストップ いいえ
フォーム
タイマー時 [イベント プロシージャ]
タイマー間隔 0
「開く時」のイベントプロシージャのコードは「読み込み時」(Form_Load)のイベントプロシージャに移動して、下記のように修正してください。
修正済みファイルは下記からダウンロードできます。
修正ファイル
ありがとうございます!クエリの中身までVBAで記載する勉強にもなりました。
仕入データのあるものは、控えました。
もう一つの、日々の食事データを入力しているものを
送信しました。よろしくお願いします。
わかりました。
ただ、仕入先等の情報がありますので
今日中には、データを作って送信します。
こちらで現象を再現できないので、実際のファイルを見ないと原因の特定は難しいですね。
症状の出るAccessファイルを送信してもらえたら原因が特定できるかもしれません。
よろしければ右カラムの下にあるファイル送信フォームから送信もらえますか。
2つとも
フォーカス取得時イベント(Enter)
に変更してみましたが、同じでした。
そして、2行目からは正常にドロップダウンします。
フォーカス取得後イベント(GotFocus)をフォーカス取得時イベント(Enter)に変更したらどうなりますか。
私の場合は、Enter を使っています。
以下の2つがイベントプロシージャのコードです。
そのままを、コピペしました。
帳票で以下のコードでは正常にドロップダウンするのです。
Private Sub cbo仕入先ID_GotFocus()
Me!cbo仕入先ID.Dropdown
End Sub
入力後、サブフォームで以下のコードの時は、一瞬だけドロップダウンして、
すぐ、消えます。しかし、2行目からは正常にドロップダウンするのです。
Private Sub cbo商品ID_GotFocus()
Me.cbo商品ID.Dropdown
End Sub
[cbo商品ID]の値集合ソースは
SELECT T商品マスタ.商品ID, T商品マスタ.商品名, T商品マスタ.仕入先ID
FROM T商品マスタ
WHERE (((T商品マスタ.仕入先ID)=[parent]![cbo仕入先ID]))
ORDER BY T商品マスタ.商品名;
です。
以下は、サブフォームを使用せず、表形式のフォームなのですが、
先頭行でのみ、一瞬だけドロップダウンして、すぐ消えます。
これも同様に2行目からは正常にドロップダウンします。
Private Sub cbo食材ID_GotFocus()
Me.cbo食材ID.Dropdown
End Sub
[cbo食材ID]の値集合ソースは
SELECT T食材.食材名, T食材分類.食材分類名, Format([㌍],"@@@") AS カロリー, T食材.食材ID, [×Q食材1].食材名のカウント
FROM (×Q食材1 RIGHT JOIN T食材 ON [×Q食材1].食材ID = T食材.食材ID) INNER JOIN T食材分類 ON T食材.食材分類ID = T食材分類.食材分類ID
ORDER BY [×Q食材1].食材名のカウント DESC , T食材.食材名;
です。
今まで、コピーしたり、新規にも何度となく試したのですが
だめでした。私ではお手上げです。
どちらも2行目以降は正常にドロップダウンするのです。
他には、特に変わった設定はしてないと思います。
どちらもフォーカス取得後以外にイベントはありません。
hatenaさんが未経験なことか、私に起こるとはなんとも不思議です。
その仕様は私もよく使いますが、そのような現象は経験ないですね。
新規にフォームを作成して、同様の設定をしても現象が再現しますか。
現状のコンボボックスの設定、フォーカス取得時のコードを提示してもらえませんか。
それで可能ですよ。
まずは、メインの方を追加してから、サブを追加という順番になります。
メインを追加した後で、オートナンバーのIDの最大値(=追加したレコードのID)を取得して、
サブの外部キーの値にします。
下記のような感じのコードになります。
その場限りでなく、レコード移動したりフォームを閉じてから開いても、入力時の書式を保存しておきたいということなら、
日付/時刻型のフィールドでは無理ですね。テキスト型にするか、別に西暦か和暦かを保存しておくフィールドが必要になります。
単票フォームですよね?
TextBox.Text property (Access)
入力中の文字列は
Text
プロパティで参照できるので1文字目が数字かそうでないかで書式を変更すればいいかな?hirotonさま>
ありがとうございます。
自分で書いておいて、IFがあるのをすっかり見落としていました…
確かに今私が行いたい挙動にはいらない部分でした。
>&&99\年99\月99\日;0;_
ありがとうございます!
>実際にどんな入力をするんですか?
提出された履歴書を元に入力しますが、履歴書に書かれているデータが和暦だったり西暦だったりするので、どちらでも入力できるようにしたいと希望があったのです。
おかげさまでどちらでも入力できるようになりました。
ありがとうございます。
ちなみになのですが、年月のみの表示(卒業年月など)のデータで
オプショングループを選択しない状態でも入力することもあるのですが、
入力されたデータの書式(西暦か和暦)通りの書式で
yyyy年m月かge年m月と表示することはできるのでしょうか?
(現在は入力は上記のように自由に選べますが、入力後フォーカスが移動したら、入力がどのような書式だったとしても、表示は指定の書式の表示になります)
もしご教示いただけたら助かります。
よろしくお願いします。
追加クエリで対応しようとトライしていましたが、不可能な気がしてきました。
メインとサブがある部分で引っかかってしまいます。
どのような方法があるかご教示いただけると助かります。
例えば西暦入力に切り替えようとします
新規入力(データがない状態)だと実行されないコードですがそこは大丈夫ですか?
生年月日だけは
で、条件判定がないので常に切り替わります。それぞれの
If
が何をしたいのか確認してみてくださいTextBox.InputMask property (Access)
で、どちらでも入力できるはずですが実際にどんな入力をするんですか?
プロパティの「印刷時の縮小」を「はい」にすると、空の場合詰めて印刷されます。
どうでしょうか。
なるほど!よくわかりました。便利なものができそうです。ありがとうございました!!
同じ内容を入力したくないなら更新後処理で規定値を変更するようにすればいいです
さらに、登録済みデータ(Tデータとする)から種類を選択したいなら登録済みデータからリストを作ってしまえばいいです。フォームを開いた後に追加されたデータはリストに表示されないのでフォーカス取得時にリストを更新するようにします
値集合ソース:SELECT 種類 FROM Tデータ GROUP BY 種類 ORDER BY 種類;
値集合タイプ:テーブル/クエリ
入力チェック:いいえ
登録済みデータのうち一部を表示したいとかだとやっぱり値リストやそれ用に別なテーブルを作る必要があります
上記の設定だけで編集は可能になりますが、リスト項目編集フォームの方で新規レコードへ移動、既定値をコンボボックスに入力した値に設定などをするようにすると使いやすいものにできますね。
③までで、あってますよ。
あと、「入力チェック」を「はい」、「値リストの編集の許可」を「はい」に設定しておけばOKです。
下記も参考にしてください。
■T'sWare Access Tips #471 ~コンボボックスから値集合ソース編集画面を表示する方法~
ありがとうございます。
早速作ってみたのですが、理解しきれていないようです。
①新しくリスト項目のテーブルを作成
②①を基にフォームを作成
③利用したいコンボボックスを選択してプロパティ「リスト項目編集フォーム」から該当のフォームを選択。
④?
④からがわかりませんでした…(③までも間違っているでしょうか)
自宅にあったプロパティ辞典にも乗っておらず…
辞典をパラパラしながらふと思ったのですが、そもそも今回の質問についてですが
何のために行っているかというと、グループ名設定のためになります。
レポートにするときのグループ分けのため、レコード毎に同じグループを入力するのが面倒なので、コンボボックスを設置していました。
(サブに1個ずつと、メインからはチェックしたものに一括で入れるためのコンボボックス)
グループ名設定となると、他に良い方法があったりしますでしょうか…?
以上お手数をおかけいたします。宜しくお願いいたします。
参考に挙げたものは基本的なところなのであとはExcel VBAの知識が必要になります
大まかな書式(罫線や塗りも含め)はテンプレートとしてExcelファイルを作っておき、VBAでシートのコピーや行、セルのコピーで書式を整形して、そうしたらデータを流し込む
こんな流れになると思います。書式の設定からVBAでやってもいいんですが、いずれにせよその部分はEXCEL VBAの知識で組み立てることになります。記述自体はACCESS VBAの上でもできますよ(諸注意あり)という具合ですね
というわけで、「書式の整形がうまくいきません」ならExcel(Excel VBA)の問題になるので情報の調べ方に気を使ってみてください
車庫IDが数値型の場合なら、
車庫IDがテキスト型の場合なら、
DoCmd.OpenReport "L書類", acViewPreview, "車庫ID=" & Me.ID & "AND 印刷=True"""
すみません自己解決しました。印刷のところをコントロールソースにしたらうまくいきました。
テーブルなら、「リスト項目編集フォーム」に値集合ソースのテーブルをレコードソースとするフォームを設定すると、「値リストの編集」をクリックするそのフォームが表示されます。これだとVBAなしでできます。
ListItemsEditForm プロパティ (Access) | Microsoft Docs
hirotonさん紹介のNotInListイベントを使うとVBAが必要ですか、もっと使いやすいUIを構築できます。
ComboBox.NotInList event (Access)
色々と参照ページを教えていただき、ありがとうございます。1つずつ紐解いていけば必ず作成できるんですよね…
聞きなれないワード(バインディング)にビビっていますが、なんとか地道に作成していきたいと思います。ありがとうございました!
ACCESS VBAでそのままEXCELを操作する感じでしょう
AccessからExcelへ出力させるVBAの書き方(note - DeepBlue Writingさん)
Excelセルへ個別出力する基本パターン(T'sWareさん)
事前バインディングと遅延バインディング(実行時バインディング)(鵜原パソコンソフト研究所さん)
VBプログラムで開発環境と実行環境のExcelのバージョンが異なるとき(Qiita -@carbonated3030さん)
AccessのVBAでExcelを参照設定なしで使う方法(てつみのブログさん)
レポートの作成が落ち着いてきたため、Excelへの出力を考えています。
かなり難しそうですね…
無理かもしれませんが・・・イメージを教えてください。
①アクセスから該当のデータをクエリからエクセルにエクスポート(サブとメインあわせて2つ)
②エクセルから2つのデータを取り込み、任意の配置を行う。
④配置されたデータから判断して罫線を引く。色を塗る。
このようなVBAの流れになりますでしょうか。
アクセスでエクスポートして、続きはエクセルのVBAでしょうか。
以上よろしくお願いいたします。