カレントレコードとは現在選択中のレコードです DAO レコードセットからレコードを削除する
カレントレコードを削除した状態で再度(カレントレコードを)削除しようとすれば当然「カレントレコードが存在しません」となります。時々ということは他の処理の影響でカレントレコードが移動しているのでしょう(エラーが出ないほうがたまたまうまく動いているというだけです)
Public Function myFormOpen( Optional formName As String)
DoCmd.OpenForm IIf( formName <> "", formName, CodeContextObject.ActiveControl.Caption ), , , , ,acDialog
End Function
コードはコピペするようにしてください
Forms!F診断リスト.refresh
↓
Forms!F診断リスト.Requery
ではどうですか?
Form.Refresh メソッド (Access)
Requery メソッド (Access)
カレントレコードとは現在選択中のレコードです
DAO レコードセットからレコードを削除する
カレントレコードを削除した状態で再度(カレントレコードを)削除しようとすれば当然「カレントレコードが存在しません」となります。時々ということは他の処理の影響でカレントレコードが移動しているのでしょう(エラーが出ないほうがたまたまうまく動いているというだけです)
リンク先にある通り
のようにカレントレコードを移す処理を入れてあげればエラーは出ないと思います
ありがとうございます。
昨日書いたあとも削除を何度も試していて、動きが不安定なので(ちょいちょいエラーになる)この機能は取り外そうかと悩んでいました。
最新のレコードから順に消すとエラーが出ない気がしたんですが…エラーが出る法則まではわかりませんでした。
サブフォームがデータシートビューのものと、帳票だけどヘッダーがフィールドタイトルの罫線区切りで埋まってるものの2種類があり、それについては削除ボタンの配置をメインフォームにしていました。
〉ちょっと怖い
危険性があるなら外そうと思います!
チェックボックスをつけて削除クエリで処理するようにしたいと思います。
アドバイスありがとうございました!
下記で回避できそうな気がします。
しかし、
そもそも、この仕様が無理があるように気がします。
サブフォームのレコードを削除するならサブフォームに削除ボタンを置いた方が自然ではないですか?
メインフォームに削除ボタンがあるとメインフォームのレコードごと削除されそうな気がしてクリックするのがちょっと怖いです。
マウス移動も大きくになりますし。
ちなみに、前期のマクロをVBAに翻訳すると下記のよにうなコードになります。
マクロだと下記の画像のようにすればいいでしょう。
マクロでやりたいですか。
VBAはわかりますか。
そろそろ、マクロからVBAへ移行しようという気持ちはありますか。
今回の質問内容から判断するにそろそろVBAへ移行すべきレベルにきているように感じます。
このコードで続けざまにサブフォームのレコードを選択して(どこかのテキストボックスにカーソルを置いて)削除を実行していると、時々「カレントレコードが存在しません」というデバッグエラーが発生します。
何か解決方法はありますでしょうか。
ネットで検索したコードで削除処理しておりましたが、教えていただいたコードで解決しました。ありがとうございます。
それぞれのテーブルの主キーはどれですか。また、テーブル1、テーブル2というのは実際のテーブル名ですか。テーブル名は内容を表すものにすべきです。
あと、それぞれのテーブルのデータ例も提示してもらえませんか。
フィールド名だけではどのようなデータなのか、データ間でどのような関係があるのか分かりません。
あと、担当者とは、何を担当するのですか。顧客毎に担当者が決まっているのか、グループ毎なのか、それによってもテーブル設計が異なってきます。
左右で行の高さがちがうのですね。それなら、リンク先の方法では無理です。
それぞれのレポートを別に作成して、サブレポートしては埋め込んでください。
テーブルはたぶん、伝票のヘッダー部分のテーブルと明細部分のテーブルがあると思いますので、ヘッダーテーブルをメインレポートのレコードソース、明細テーブルをサブレポートのレコードソースとすればいいでしょう。
返信ありがとうございます。
ページ全体の罫線の配置を左右別々に設定してみました。
しかし、詳細に設定している印字データの高さが左右で違うため、左側の送り状の明細にそろえられてしまい、右側の受領書の明細に上手く配置されません。
左右明細の高さが違う場合はどうしたらよいのでしょうか?
よろしくお願いいたします。
フォームの一番上を表示する
そもそも表示位置が変わるような削除処理をしない
明細を持つ伝票とその複写を同じページに2分割して表示する - hatena chips
のサンプルファイル内の「R_納品書_左右」と同じ方法を使っているということでしょうか。
だとしたら、ページ全体の罫線はページヘッダーに配置してますので、そこの罫線の配置を左右別々に設定すればいいだけです。
ただし1ページの明細データが17件を超えないようにしましょう。
17件を超える場合があるときは、17件で改行するようにページフッターの高さを調整するといいでしょう。
標題の質問にお答えいただきありがとうございます!確認します。
上記のコードでもうまくいきませんでした。
また、F診断カルテで情報を追記し、診断テーブルで情報が追記されていることを確認できている状況で
F診断リストで「me.refresh」を試みても更新ができませんでした。
F診断リストを一回閉じて開きなおすと、更新ができます。
閉じて開きなおす、というVBAを実行するべきなのでしょうか…?
クリックしたボタンなら
Me.ActiveControl
で取得できますボタン名:btn診療リスト
フォーム名:F_診断リスト
質問の内容だとボタン名とフォーム名は同じではないですね
ボタンの画面上に表示している文字ならそれは標題です。VBAなら
Caption
で取得できますユーザー定義関数とする場合、一つのフォームで使うだけならそのフォームのモジュールに記述して
Me
キーワードでいいですが、様々なフォームで使おうとするなら標準モジュールに記述することになりMe
は使えません。そんなときにはCodeContextObject
を使いますあとはまぁ、どうしてもフォーム名を直接指定したいなんて場合もでるでしょう
返信ありがとうございます。
送り状,受領書は伝票が左右に並んでいます。1ページに17行印刷されます。
受領印は受領書の右下に配置しようと考えています。
よろしくお願いいたします。
A4横2分割ということは伝票が左右に並んでいるということでしょうか。
明細の行数は同じですよね。
伝票によって明細数が変わったらおかしなことになりますので。
あと、受領印はどの位置に配置しますか。
できれば、印刷イメージの画像をアップロードしてもらうと分かり安いとと思います。
新しいスレッドを立てて違う質問を書くつもりが、うっかり同じスレッドに2つ書いてしまいました。
分けた方がよかったでしょうか?
申し訳ありません。
現在「診断リスト」から、各「診断カルテ」を開くボタンがあります。
「診断リスト」は開いたまま上に「診断カルテ」を開く状態です。
「診断カルテ」にて、フィールド「タイトル」を変更した際、「診断カルテ」を閉じて
「診断リスト」を見ると、「タイトル」は変更されていません。
「診断カルテ」の閉じるボタンを以下にしてみましたが・・・ダメでした。
どうすればリアルタイムで変更が反映されるようになるのでしょうか。
グループコードに対しての担当者を登録するテーブルを作成してみました
テーブル2
グループコード、担当者、氏名
紐づけ方がわかりません。
宜しくお願いします。
(SQL文)はどのように指定していますか?
上で紹介した方法で、実際にクエリを表示してみてください。エラーが表示されると思うので「作品テーブル」に必要なフィールドがないか、SQL文そのものが間違っているか確認してください
やりたいことが理解できていたなら、クエリデザインでクエリを作成し、SQLビューのSQL文をコピーしてVBAコードとして貼り付けという方法で作成するのもありです。
(クエリデザインから自動で作られるSQLは省略可能な部分も表記されるので醜いですが)
不要列がある場合
1.エラーにして無視する
実処理部分が
となってるのでダミーの列を用意すれば取込はできます(処理的にはエラーが出てるのであんまりよくはない)
2.作品テーブルにダミー列を用意する
フィールド名「ダミー」を作っておきます
余計な列が必要なので残念な感じですが、大きな問題はでないんじゃないかなと
3.取り込まない列制御処理を入れる
上記で問題がある場合ケースバイケースで何かしらの制御を入れることもあるかもしれません(複雑な処理を組むくらいなら次の方法のほうが楽なのであんまりやらない)
4.最初の構想通り一時テーブルを用意する
スタートが違う(個別にデータを解析して取り込む必要がある)ので紹介しなかったですが、個別にテーブルを用意してそれぞれから追加クエリを発行すると、フィールド名の対応を取りつつ不要列は取り込まないようにできます。データ形式が決まりきったファイルでインポート定義を使って取り込めるようなデータならこれをやります
かなりサブフォームが便利そうですね。
グループが必ず発生する訳ではなくグループ数も不定なので、適当な数をタブで作成してみようかと思います。
リンク先を参考にさせていただき、取りかかろうと思います。ありがとうございます!
長文ありがとうございます🙇♂️
後ほど試させていただきます✊
ちょっと脱線しますがクエリとSQLについての知識を身につけましょう
ざっくりですが、SQLはデータベースを扱うための命令書の仕様、クエリはSQLに従って作成された実際の命令書といった感じです
ACCESSはSQLを意識することなくクエリを扱えるアプリケーションですが、クエリの実態はきちんとSQLです。クエリデザインでリボンの「表示」からSQLビューとデザインビューを相互に切り替えることができ、ACCESSのGUI(クエリデザイン)で作成するものがSQLであることが確認できます
つまり、SQL構文を記述するというのはクエリを作成すると同じことをしているわけです
それでは、クエリデザインを起動しテーブルの表示では何も選ばずに閉じて、SQLビューを表示してみましょう
と表示された画面が表示されるはずです。選択クエリを作成しようとし、テーブルを一つも選んでいないので選択クエリであることを表すSQLの命令
SELECT
のみが表示されている状態です。これをに書き換えてデザインビュー、データシートビューと切り替えてみましょう。よく使う形のものを見ることができると思います。このデータシートビューをみれば「対応する列を持ったテーブルを作成する」の意味が分かると思います
うまく動いたらSQLビューとデザインビューを切り替えて見比べてみてください。何となくSQL構文のどこがどういう意味なのか分かると思います
そうしたら次に
も同様にSQLビューにコピペして試してみましょう
掲示板ではクエリデザインでのイメージを伝えるのが難しいものです。SQLビューを使ったSQL文のコピペのやり取りができると間違いのないやり取りができるようになるのでうまく活用できるようになりましょう
フォームにはグループ化の機能はないので、
フォームのレコードソースのテーブルにサブタイトルフィールドを追加して、複数行に同じものを繰り返し入力することになりますね。
あるいは、サブフォームにして、非連結の親フォームのテキストボックスでサブタイトルを入力して、リンク親フィールド/リンク子フィールドの設定を「サブタイトル」にしておけばサブタイトルは親フォームで一回入力するだけですみます。
サブフォームを使うのではあれば、下記の方法が使えます。
サブフォームを使わない場合も上記を改良すればできないことはないですが、かなり難易度は高いでしょう。
作成してみたのですが、エラーが出ます。
ありがとうございます。
取込不要の列があった場合にはどうなりますか?以下のように空欄にしてよいでしょうか。
※例えばパターン4の3列目に「取込不要列」があったとする。
ありがとうございました!うまくいきました。
たぶん
If Me.状態.OldValue = "承認前" And Me.状態.Value <> "承認前" Then
↓
If Me.cbo状態.OldValue = "承認前" And Me.cbo状態.Value <> "承認前" Then
メインのデータ取込処理は
ですね。ループ処理になっているのでそれっぽく書き直すと
な感じになります。これの意味するところは
rs
の0番目にDatas
の0番目を入れる、rs
の1番目にDatas
の1番目を入れる・・・ということで、元データのフィールド名も作品テーブルのフィールド名も関係ありません。列番号だけ見て同じ列に値を入れているだけです。(列を飛ばしたりもできません)例えばパターン2なら
tblname
の1列目に「題名」を入れる、2列目に「作られた年」を入れるという処理をしていて、対応した列になっていればフィールド名は不問ですというわけで、「作品テーブル」から元データの列に対応する列を持ったテーブルをクエリ(SQL構文)で用意してあげます
ありがとうございます。
仰る通り合体テーブルは変更して、「作品テーブル」とさせていただきます。
フィールド名は
タイトル、感想、製作年、国、おすすめ度合い、タイプ
でお願いします。
おすすめ度合い、タイプは後から追記するためのフィールドです。
「合体テーブル」のフィールド名を挙げてください
(「合体テーブル」も分割したテーブルがなくなると名前が変わりそうですね)
仰る通り一連の質問の延長でした。
取り込む際に設定して1つのテーブルにすればよかったのですね。
ごめんなさい、例ではフィールド名を同じにしてしまいましたが、
実際は微妙に違う名前ですのでそれで書いてみます。
下記認識で正しいでしょうか…?
パターン1【フィールド名】タイトル、感想、製作年、国
パターン2【フィールド名】題名、作られた年
パターン3【フィールド名】タイトル、思ったこと、国名
パターンごとに3つボタンを作成。それぞれステートメント3行目を下記内容に変える。
以上、何卒宜しくお願いいたします。
ユニオンクエリは重い処理になるとのこと。
作成前に教えていただき、とても助かりました。テーブルを1つにするように考えてみたいと思います。
一連の質問の延長ですかね?
最終的に合体テーブル(タイトル、感想、製作年、国、おすすめ度合い、タイプ、etc...)を作りたい。とか
Database.OpenRecordset メソッド (DAO)
tblname
にはクエリを指定することもできますこんな感じで必要な列と並びを指定してあげればデータごとにインポート用のテーブルを作る必要はないですよ
昨日から色々検索しても解決法が見つからず、自分でも完璧なものは作れなそうだったので、助かりました。
作成してみて、またわからなかったら質問させていただきます。ありがとうございます。
ユニオンクエリでできると思います。
ただ、ユニオンクエリは重い処理になりますし、更新できないクエリになりますので、テーブル設計の変更が可能なら、最初から一つのテーブルにしておいて、必要に応じてクエリで必要なデータを取り出すようにした方がいいでしょう。