Private Sub ユーザー情報変更_Click()
If IsNull(PF_CMB_個人ID) Then
MsgBox "編集する人間の個人IDを入れてください"
Exit Sub
End If
DoCmd.OpenForm "ユーザー情報編集フォーム", , , "個人ID=" & Me.PF_CMB_個人ID.Value
End Sub
Private Sub ユーザー情報削除_Click()
Dim strSQL As String
MsgBox "登録情報を削除します"
strSQL = "DELETE * FROM 基礎情報マスタ where 基礎情報マスタ.個人ID=" & UC_個人ID & ";"
DoCmd.RunSQL (strSQL)
Me.Requery
Forms!ポップアップ入力.Requery
DoCmd.Close acForm, "ユーザー情報編集フォーム", acSaveNo
End Sub
(ポップアップ入力がメインフォームの名前です)
「ポップアップ入力」は閲覧用なら、不用意な編集、削除ができないように、フォームの「レコードセット」プロパティを「スナップショット」に設定しておくといいでしょう。
あと「UC_個人ID」テキストボックスか非連結になってますが、コントロールソースを「個人ID」に設定しましょう。
"ユーザー情報編集フォーム"の「追加の許可」は「いいえ」にしておくといいでしょう。「はい」にしておくなんかの表示に新規レコードへ移動してしまう恐れがあります。
あと、「フィルターの使用」は「いいえ」に設定します。これをしておかないと、せっかく対象レコードのみ抽出されているのか、フィルターを解除されて全レコードが表示されてしまう恐れがあります。
とりあえずはそのファイルで状況は把握できます。
コンボボックスのリストに #DELETED が表示される現象の解決法は、コンボボックスを再クエリすればOKです。
ただし、致命的な欠陥かあります。
「ポップアップ入力」のコンボボックスで後の方のレコードを選択してからボタンクリックで「ユーザー情報編集フォーム」を表示させると、テーブルの先頭のレコードが、コンボボックスで選択したレコードで上書きされてしまいます。
「ユーザー情報編集フォーム」を開いた直後は先頭レコードが表示されます。ところが、読み込み時イベント Form_Load() で「ポップアップ入力」のデータで上書きしてしまってます。
Form_Load()のコードは削除してください。
それから、「ポップアップ入力」のコマンドボタンクリック時のコードを下記に変更してください。
これで、"ユーザー情報編集フォーム" のレコードは、「ポップアップ入力」と同じものになります。
再度の質問よろしくおねがいします
質問前にそちらは拝見させていただきましたが

ネットで探した画像を貼ったこともありうまく伝えられませんでした
実際には下記のようなレイアウトになっております
画像にありますように
日付と氏名、車両点検項目をメインである営業日報テーブル
訪問先を訪問先テーブル
休憩を休憩テーブルに、親子関係で入力します
(それぞれ別途主キーなどは用意してあります)
上下に2つ表組みがあるので単純に固定行にしたのでは対応できないのではないか、と困っていました
「詳細」のレコードが並ぶところが2ついるようになるのではないかと
今やっているEXCELでは画像の表に直接入力してVBAを使い別のシートのセルに転記
印刷時に再度転記しております
このような場合フォームにサブフォームを表示させ印刷するものでしょうか?
こんばんわ、ろでますです。
簡素化せず、ごちゃごちゃな物を送付しては失礼とおもいましたので、必要な部分のみを切り出しました結果、シンプルなフォームにしてしましました。その辺のご説明ができてなくて申し訳ございません。
おっしゃる通りで、ポップアップ入力は個人データ閲覧用として、ユーザー情報編集フォームはデータ入力/編集/削除用にして、不用意な削除をできないようにしています。
簡素化するにあたり、消したところがあります。
各人のもつ、障害状況(身体障害であったり精神障害であたったり)も、メインのフォームで見れるようにしており、それらも別フォームで個別に編集できるようにしているため、分けた方が分かりやすいと判断してわけました。
もしよろしければ、そのフォームだけでも見ていただけましたら、状況を把握していただけるとおもうのですが、よろしいでしょうか・・・。(ユーザー追加などは未完成です)
先走ってすいませんが、そのファイルをアップロードさせていただきます。
内容が中途半端で申し訳ありません。
バックエンド2つを同時に開く事はありません。
今回2個目に作成したVBSは、先程のとは別のものです。
こちらはバックエンド一つ、フロントエンドの運用です。
先程書いた1つ目(フロントエンド+バックエンド2つ)の起動用のmdbと2つ目(フロントエンド+バックエンド)の起動用のmdbをそれぞれ作成する、またmdbで起動であれば、bit数の問題もクリアできる、という理解であっていますでしょうか?
何度も申し訳ありません。
サンプルファイルを拝見しました。
「ポップアップ入力」フォームと「ユーザー情報編集フォーム」はほぼおなじ構成ですが、2つに分ける目的はなんでしょうか。
「ポップアップ入力」はデータの閲覧用(ここで更新や削除はしない)、
更新や削除は「ユーザー情報編集フォーム」で行う、ということでしょうか。
閲覧時に不用意に、更新したり削除してしまわないようにするというのが目的でしょうか。
こんばんわ、ろでまです。
すいません、今気づきました。
簡素化するあまり、リレーショナル部分も切ってしまってました。
ただ状況は同じで、ポップアップサブフォームで基礎データ部分を削除すると、メインフォームのコンボボックスで#DELETEDが表示されてしまします。
送付していただいたサンプルファイル
現状のデータベースファイルはフロントエンド(アプリケーション)とバックエンド(データ)に分割しているということですよね。
で、データ量が多いので、バックエンドを最近のものと過去のものに分割している。
通常はフロントエンドに最近のバックエンドからデータをコピーして運用している。場合によっては過去のバックエンドからコピーしてくる。
そのような運用ならフロントエンドは一つでいいと思いますが、なぜ、2つ同時に開く必要があるのでしょうか。
ありがとうございます。
元々私の作り方がいけなかったのか、
元データがあるmdbが2種類あります。
それはデータ量が多かったので、一定の期間で区切ったものです。比較的最近のものが①、過去のものが②とします。
元データ①の片方には毎月数万件追加されます。
フロントエンドのmdbは、社員IDでログインすると、データ追加時に所属拠点の分の一定テーブルデータをコピーしてくるようにしています。
期間外の過去の時は②からコピーしています。
ただし、年度更新の時や何か機能を追加した時はVBAを書き換えて、空のフロントエンドmdbを置いて、access自体をしてコピーさせています。
ここで使っているVBSをmdbで、という事ですよね?VBSを2個使用していたので、起動用のmdbも2個で、32bitと64bitは気にしなくてもいい、という事でましょうか?
ちなみに以前はフロントエンドのmdbをいちいち配布していたのですが、どうにも差し替えを忘れる方がいて、強制コピーしてくるように、こちらのVBSにたどり着いた次第です。
会社のpcからはこの掲示板に繋がらないので、ファイルを送れません(自分の携帯から見ています)見て頂く事も出来ないので、うまく伝わればいいのですが…長々とすみません。
下記のページが参考になると思います。
レコードがない場合も用紙の最後まで罫線を出力する - hatena chips
明細を持つ伝票とその複写を同じページに2分割して表示する - hatena chips
これを参考に試してみて、分からない部分があれば質問してください。
2003なら、MDBファイルを作成してそこから、DAOで更新テーブルをチェックして更新があったら FileCopy、Shell関数でMDBファイルを開いて、自分自身を閉じる、というVBAコードを起動時フォームに記述するという設計にするのが簡単かと。
テスト等、色々ありがとうございます。
お手数をおかけして、すみません。
やはりタスクバーに入れるとダメなんですね…
社内で基幹システムの補助ソフトとして、accessを使用しています。
その為なのか、会社は新しいaccessを購入してくれないようです。それで2003を使用している状態です。
書くのを忘れてましたが、基本的に私のpc以外はランタイム環境です。
VB.Net…勉強してみます。ソフトが入っていないかもしれませんが、visual studio communityからダウンロードしてみます(色々あって少々戸惑いながらやっていますが)
こんにちわ、ろでますです。
たびたびのご厚意ありがとうございます。
簡素化したファイルをアップロードさせていただきます。
フォームは最初に出てくるポップアップフォームと、「削除フォームへ」と押せるボタンから出てくるポップアップフォームだけになっています。
よろしくお願い申し上げます。
ごめんなさい、解決しました。文字が長すぎます、とエラーメッセージが出たりしたと思うのですが、その後コントロール名に記号を使っていたのを除いたらなおりました。
Requeryはコンボボックスに対してしていたのですが、
その後原因?がわかりました。
現在下記のソースを使っていました。
Private Sub Tab1_Change()
Me.Tab2.Pages(Me.Tab1).SetFocus
End Sub
しかし、下記のソースに差し替えたところ、うまくいくようになりました。
Private Sub Tab1_Change()
Me.Tab2 = Me.Tab1
End Sub
勘違い?かもしれませんが、一応ご報告でした。
ご教示、ありがとうございました。
明快な回答ありがとうございました。
勘違いしてました。
コンボボックスの入力チェックプロパティ
ComboBox の "LimitToList/入力チェック" プロパティ (Access)
コンボボックスの値リストの編集の許可プロパティ
ComboBox. AllowValueListEdits プロパティ (Access)
一つのデータベースファイルをタスクバーに最小化すると、症状がでるのを確認しました。
ちょっと解決策はわかりませんね。
複数起動したい場合は、VBSではなく、VB.Net か Accdb で同様の機能を作成する方向で検討したほうかいいかもしれません。
2つのVBSで異なるデータベースファイルを開くという運用がしたことがなかったので、簡単なデータベースファイルを2つ、それぞれようのVBAを作成して、実験してみました。
一つ目のデータベースファイルをVBSから開いて、別のアプリをアクティブにしてから、2つ目のデータベースファイルをVBSから開いても特に問題なく起動できました。
現状の2つのVBSファイルの名前とコードを提示してもらえますか。原因がわかるかも知れません。
フォームに対して Requery してしまっているのでしょう。
コンボボックスに対してRequeryしてください。そうすれば移動しません。
Me.コンボボックス名.Requery
確認してみたところ、以前教えていただいた帳票の、各データに紐づくコンボボックス(テキストボックスと重ねている)の選択肢部分で「Requery」を使っていました。
この機能を使うと先頭レコードへの移動は防げない、ということになりますでしょうか。
わがままな願望ですかね・・申し訳ありません。
追加の質問が発生しました。すみません。
条件式を全部入れたら長すぎて、コントロールソースに入りきれませんでした。(長すぎる、とのエラーが出て、途中で切れていた。)VBAに組み込もうかと思いましたが、きっかけのアクションを判断できず、式が作れません…どのような序文にすればよいでしょうか。
hatena様
回答ありがとうございます。
出来ました。感激です。
このようなやり方があるのですね。勉強になりました。
望み通りの結果を得ることができました。ありがとうございました!
なるほど、そういうことですね…ご確認ありがとうございます。お手数をおかけしました。ご指摘の件を確認してみます。
おはようございます。
説明不足ですみません。
全くその通りです。
IEやメールソフトなどを開いたり、
accessをタスクバーにしまうと、
別のaccessは起動しません。
タスクマネージャー上に表示されない状態です。
そして元々開いていたaccessも操作できなくなります。
タスクマネージャーから元々のaccessを最大化すると再度表示され、使用できます(最小化では表示されません)
そこで一旦元々のaccessを終了し、再度どちらかのVBSを使用して起動すると、最大化して起動しますが、最小化すると極小サイズになります。そこから以前使用していたサイズに戻しました。そのまま別のVBSから別のaccessを起動もできました。
原因がわからず色々テストしてみたのですが、続けて2つのVBSを使用して別々のaccessを起動する事はできます。また単体でも、もちろん起動します。
大変申し訳ありませんが、ご教授お願い致します。
問題ないようですね
インポートのときにtrueを置き換えたりする必要があるかと思いました
ソフトはmementoというスマホとPC版のある半有料ソフトです。ほぼスマホ用ですね
スマホで出先で入力するのにスマホ版ACCESSがないので仕方なく使っています
別のDBソフトとはなんでしょうか。
Accessでは、TRUEかFALSEの値をもつフィールドのデータ型は Yes/No型になりますので、たぶんYes/No型になるでしょう。
インポートするときの設定で、データ型を指定できるのでなんとでもなると思います。
Yes/No型のフィールドはデフォルトではチェックボックス表示になります。設定によって、コンボボックスやテキストボックスにすることもできます。
フォーム上なら、トグルボタンやオプションボタンにもできます。
文章では状況かよくわからないので、右カラムのファイル送信フォームから現状のフォームを送信してもらえますか。
たぶん、連結フォームの使い方が理解できていないのが原因だと思います。
早々のご回答どうもありがとうございます。
ただ、この削除フォームは「ポップアップ」フォームで行っており、リンク親フィールド、凝フィールドの設定自体がなかったことから、仕方なく(?)以下のような形で削除フォームを組んでいます。
まず、親フォームの「個人ID」コンボボックスで個人ID選択すると、親フォームの4つのテキストボックスに
氏名・郵便番号・住所・年齢
が入るようにしています。
そして、その親フォーム上に「ユーザー情報変更」ボタンがあり、これにイベントプロシージャを割り当てて、ポップアップのフォームを上げています。
そして、そのポップアップフォームのロード時に
Me.UC_個人ID = DLookup("個人ID", "基礎情報マスタ", "個人ID=" & [CMB_個人ID])
Me.UC_氏名 = [Forms]![ポップアップ入力]![PF_氏名]
Me.UC_郵便番号 = [Forms]![ポップアップ入力]![PF_郵便番号]
Me.UC_住所 = [Forms]![ポップアップ入力]![PF_住所]
Me.UC_年齢 = [Forms]![ポップアップ入力]![PF_年齢]
Application.SetOption "Move After Enter", 0
End Sub
(「CMB_個人ID」は、メインフォームで入れている個人IDのコンボボックスの値をグローバル変数として代入したものです。Me.UC_氏名・・・等は、このポップアップフォームのテキストボックスのコントロール名です)
というように、メインフォームから値を代入しています。
つまり、メインフォームで
「現在選択している個人IDのユーザー情報をポップアップのサブフォームのテキストのコントロールに代入している」
ということになります。
そして、以下のような削除プロシージャ―を作りました。
Private Sub ユーザー情報削除_Click()
Dim strSQL As String
MsgBox "登録情報を削除します"
strSQL = "DELETE * FROM 基礎情報マスタ where 基礎情報マスタ.個人ID=" & UC_個人ID & ";"
DoCmd.RunSQL (strSQL)
Me.Requery
Forms!ポップアップ入力.Requery
DoCmd.Close acForm, "ユーザー情報編集フォーム", acSaveNo
End Sub
(ポップアップ入力がメインフォームの名前です)
ですので、カレントレコードは1つしかないような形です(レコードセレクタでは1つしかありませんでした)。
ですので、DoCmd.RunCommand acCmdDeleteRecordを実行すると、必ず1レコード目が削除されてしました。
また、ポップアップ型のフォームだと無理なのか、メインフォームにも、ポップアップをしたサブフォームにもRequery、Refreshをかけても、♯DELETEDは消えませんでした。
また、多分根本的な間違いを犯しているんでしょうね・・・。
長々と失礼いたしました。
すいません、読んでいただいてご教授いただけましたら助かります。
テーブルやフォームのデータシートビューでレコードを表示した状態で、別の場所、VBAとか削除クエリとか、、、で削除すると、削除されたレコードが「#DELETED」と表示されるのは、仕様です。
通常は、運用中にテーブルは開かないようにすべきですので、問題は、フォームでの表示の場合ですよね。
フォームでカレントレコードを削除したい場合は、DoCmd.RunCommand acCmdDeleteRecord で削除すればそのようなことにはなりません。
VBAや削除クエリから削除した場合は、その直後にそのフォームをRequeryするか、Refreshすれば「#DELETED」は消えます。
できますよ。
サブクエリを含むSQLでも、SQLに変わりはないので、普通にレコードセットとして開けます。
当方の環境でサンプルファイルで確認してみましたが、質問の症状は再現できませんでした。
サンプルファイルになにか追加してませんか。
例えば、再クエリをすると先頭レコードへ移動しますが、どこかで再クエリをするような処理をしてませんか。
状況がよく分かりませんが、
前に作成したVBSでデータベースファイルを開いて、それが開いた状態で、
新規に作成したVBSで別のデータベースファイルを開こうとしている、という状況でしょうか。
そして、前に開いたデータベースファイルがアクティブの時だけしか、別のデータベースファイルが開かないということでしょうか。
このソフトは特定のソフトでしょうか。それともどのソフトを開いていても起動しないのでしょうか。
そんなことはないはずです。現に、前に作成したVBSではaccessがアクティブでなくても開きますよね。
これは条件に合致すれば「完了」という赤字を表示させたいということでいいでしょうか。
だとしたら、コントロールソースに下記のように設定すればいいでしょう。
=IIf(IsDate([テキストボックス]) AND [チェックボックス] AND [コンボボックス] Like "済","完了","")
前景色は赤に設定します。
テキストボックス、チェックボックス、コンボボックスは実際のコントロール名にしてください。
AND条件という前提です。OR条件の場合は、ANDをORに変更してください。
せっかくなので一般的な方法を提示しておきましょう。
テーブル設計は下記のようにします。
M_商品
商品ID 主キー
商品名
MT_単価
商品ID 複合主キー
Max個数 複合主キー
単価
M_商品のデータ例
MT_単価のデータ例
フォームのレコードソースのテーブルのフィールドは ID(主キー)、商品ID、単価、個数
個数の更新後処理に下記のコードを設定。
以上です。
hiroton様
返信おくれて申し訳ありません。
詳しい回答ありがとうございました。
hiroton様 hatena様
返信おくれました。
回答ありがとうございます。
現実的な方法ではないので、テーブルの設計を見直すことにしました。
回答をいただきありがとうございました。
要件次第。必要ないなら、エクスポートしたデータは削除すればいいし、そのソフトで後で必要になるなら残しておくことになるでしょう。
残しておく場合は、DBのテーブルにエクスポート済みかどうかを格納するフィールドを用意しておくのて一般的に方法ではないでしょうか。エクスポートするときは、エクスポート済みでないデータのみエクスポートしてエクスポート後に済に更新しておけばいいでしょう。
ACCESS側で重複を省く仕組みは、ソフト側の想定外のエラーなどで重複が発生した場合やACCESS側のミスで重複取り込みした場合の保険という考え方です。