• ベストアンサー

アクセスでのコマンドボタンでの上書き保存について。

Private Sub cmd_修正_Click() Dim fname As String fname = "F_kihonn" '転送先のフォーム名 If SysCmd(acSysCmdGetObjectState, acForm, fname) = 0 Then DoCmd.OpenForm fname, acNormal '転送先フォームが開いてない場合は開く End If DoCmd.GoToRecord acDataForm, fname, acNewRec '転送先フォームの新規レコードをカレントにする '値の代入 Forms!F_kihonn!更新日 = Me!更新日 Forms!F_kihonn!コード = Me!コード Forms!F_kihonn!カナ = Me!カナ Forms!F_kihonn!発注者名 = Me!発注者名 Forms!F_kihonn!担当部署 = Me!担当部署 Forms!F_kihonn!郵便番号 = Me!郵便番号 Forms!F_kihonn!住所 = Me!住所 Forms!F_kihonn!ビル名等 = Me!ビル名等 Forms!F_kihonn!電話番号 = Me!電話番号 Forms!F_kihonn!FAX番号 = Me!FAX番号 Forms!F_kihonn!URL = Me!URL Forms!F_kihonn!特記事項 = Me!特記事項 End Sub というのを書きました。これだとコードにキーを持たせているので、転送先フォームでコード以外の内容を修正すると、「重複しているので変更できませんでした」とエラー表示が出ます。上書き保存ができればいいのでしょうけど。上書き保存のコマンドボタンとかを作ればいいのでしょうか??何かいい方法はありますか?わかる方いましたらご教示ください。初心者の質問ですみません。宜しくお願いします。

noname#49321
noname#49321

質問者が選んだベストアンサー

  • ベストアンサー
  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.6

> この方法でしたら、普通の更新可能なフォームでの作成ですよね? > でもこのやり方ができるのであれば、クエリから作成した更新不可 > の画面はいらなくなるわけですかぁ(^^ゞ えっと、そうですね 更新可能なフォームで作成して、開いたら更新不可能にして開いてくれます 1つのフォームの訂正するたびに複数のフォームを訂正するのが面倒なので、データを弄れなくする為に制御掛ける場合は私は、こうしてます 訂正、新規、閲覧等のフォームがレイアウト違うと混乱しますので^^; > でいちお上書き登録はされているのですが、上書きし終わった後も、 > 更新ができるのです。F_kihonnを開いている状態でF_kihonnに転送す > るという表現もおかしい気がしますが、やっぱり変なのでしょうか? よく見る非連結のフォームを使用するパターンとは、かなり違うような気がします DAO、ADO、DLOOKUP等を使用して、非連結のフォームへ値を引用、登録時は、アクションクエリ(追加クエリ、更新クエリ)、DAO、ADOを使っているパターンをよく見かけますが・・・ 更新前処理、更新後処理の間にフォームから自動的にテーブルへデータの書込み、レコード移動時の前にテーブルからフォームへデータを読出、このタイミングで自動的に処理を行っていることを除けば、非連結フォームと連結フォームの間に大きな差はないので、連結フォームを使用するのが、私のパターンです > ただやはりレコード上の上書き保存ボタンが欲しいです。 う~ん、単純に考えるとすれば、新たに作るより表示を変えるほうが場所を取らないかな? > Me.AllowEdits = True Me.[修正というコマンドボタンの名前].Caption = "上書保存" > Me.AllowEdits = False Me.[修正というコマンドボタンの名前].Caption = "修正開始" をそれぞれ追加すれば、上書保存のボタンは新たに作らなくても大丈夫かな?

noname#49321
質問者

お礼

何度も丁寧にご指導ありがとうございました<m(__)m>。できました。

その他の回答 (5)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.5

>tbl_基本情報→qry_基本情報→frm_基本情報検索(閲覧画面) >  ∥ >frm_kihonn ←frm_基本情報登録(非連結) ???非連結のフォームに新規レコードはありませんよ ボタンが置いてあるのはfrm_基本情報検索(閲覧画面)ですよね だったら、Meはこのフォームですから このフォームのカレントレコードの値をfrm_kihonnへ転記しています frm_基本情報登録(非連結)を使用しているつもりになっておられるみたいですが そうはなっていないですよ 選択したレコードを転記、修正を加えて書き戻しのようにしたければ 非連結フォームかワークテーブルを基にしたフォームに転記、 修正後更新クエリという流れにしなきゃ

noname#49321
質問者

補足

ご回答、ありがとうございます。確かに非連結には新規レコードはないですよね。試しにコメントブロックして、動かしても全然動きました。クエリから作成したfrm_基本情報検索のレコード内容をfrm_kihonnに転記するように作っています。frm_基本情報登録は登録するときのみ使用しています。 新規情報を登録(frm_基本情報登録)「非連結」→frm_kihonnに転記。(frm_kihonnに転記されることによって、tbl_基本情報に登録内容がはいっていく。→更新不可能なフォーム(閲覧用)が欲しかったため、クエリを作成。(qry_基本情報)→frm_基本情報検索 という流れで作りました。 閲覧したいときは、frm_基本情報検索を見るわけで、情報を修正したいときは修正ボタンを押したら、frm_kihonnに転記し、frm_kihonnが開くように。 要は情報の登録画面、修正画面、削除画面が欲しいわけです・・。で、登録以外で見るときは更新できないようにしたいのです。修正・削除等を行うときは、更新可にしたいわけです。自分で作っていても、フォームが多いな・・とは正直思いました。。一つのフォームで可能なんでしょうが、なんか作っていくうちにこんな感じになってしまいました。勉強不足ですみません。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.4

> 修正用のボタンを用意して・・・クリック時に > Me.AllowEdits = True > を追加(手抜きかな?) の部分やっぱり手抜きだね~^^; If Me.AllowEdits Then DoCmd.RunCommand acCmdSaveRecord Me.AllowEdits = False Else If MsgBox("修正開始しますか?", vbYesNo) = vbYes Then Me.AllowEdits = True End If End If の方が、使い勝手としては良いかな? 更新可能な状態であればレコードを保管して更新不可能な状態へもどす 更新不可能な状態であれば修正するか確認して更新可能な状態にする

noname#49321
質問者

補足

ありがとうございます<m(__)m> こちらの方が細かくていいですね~。ただやはりレコード上の上書き保存ボタンが欲しいです。で、クリックしたら更新不可と。おかげ様でフォームが一つなくなりそうです♪宜しくお願いします。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.3

> 読み取りになっていて、ボタンを押したら書き込みOKにできるので > しょうか?? まあ、少々、芸を細かくして例えばで作ってみましょう^^; 普通の更新可能なフォームを用意してください テキストボックスを1つ追加して、 (名前は、なんでもお好きにしてください) コントロールソース : =[AllowEdits] 書式 : ;[赤]"編集中";"閲覧中" 使用可能 : いいえ 編集ロック : はい と設定します (これは、なくても良いのですが、編集可能なのか判らなくならないように作成してあります) フォームのレコード移動時のイベントに Private Sub Form_Current() Me.AllowEdits = False End Sub フォームの更新前処理のイベントに (これも無くてもいける、最終確認を取ってるだけ) Private Sub Form_BeforeUpdate(Cancel As Integer) If Me.Dirty Then If MsgBox("修正しますか?", vbOKCancel) = vbCancel Then Me.Undo End If End If End Sub 修正用のボタンを用意して・・・クリック時に Me.AllowEdits = True を追加(手抜きかな?) で、訂正用ボタンをクリックした後だけ、レコードの訂正は可能です レコード移動をすれば、また訂正できないようにプロパティを操作してあります

noname#49321
質問者

補足

細かくご指導ありがとうございます<m(__)m>。早速書き込んでみたのですが、元々はクエリを元に作成したフォームでは実行したかったのです。この方法でしたら、普通の更新可能なフォームでの作成ですよね?でもこのやり方ができるのであれば、クエリから作成した更新不可の画面はいらなくなるわけですかぁ(^^ゞ 読み取り専用のフォームを開き、修正したい箇所があったら、修正コマンドボタンをクリックすると、レコードの訂正などができるようになり、同フォーム上に上書き保存と言うコマンドを作成して、それをクリックしたら、上書きされて、更に更新不可の状態にするということはできるのでしょうか?今、作成したものは・・・。 フォーム名:F_kihonn Private Sub cmd_上書き保存_Click() If IsNull(Me.コード) Then MsgBox "コードが未入力です", vbCritical Me.コード.SetFocus Exit Sub End If If IsNull(Me.発注者カナ) Then MsgBox "発注者カナが未入力です", vbCritical Me.発注者カナ.SetFocus Exit Sub End If If IsNull(Me.発注者名) Then MsgBox "発注者名が未入力です", vbCritical Me.発注者名.SetFocus Exit Sub End If If IsNull(Me.住所) Then MsgBox "住所が未入力です", vbCritical Me.住所.SetFocus Exit Sub End If If IsNull(Me.電話番号) Then MsgBox "電話番号が未入力です", vbCritical Me.電話番号.SetFocus Exit Sub End If If MsgBox("上書きしてもよろしいですか?", vbOKCancel) = vbCancel Then Exit Sub Dim fname As String fname = "F_kihonn" '転送先のフォーム名 If SysCmd(acSysCmdGetObjectState, acForm, fname) = 0 Then DoCmd.OpenForm fname, acNormal '転送先フォームが開いてない場合は開く End If '値の代入 Forms!F_kihonn!更新日 = Me!更新日 Forms!F_kihonn!発注者コード = Me!発注者コード Forms!F_kihonn!発注者カナ = Me!発注者カナ Forms!F_kihonn!発注者名 = Me!発注者名 Forms!F_kihonn!担当部署 = Me!担当部署 Forms!F_kihonn!郵便番号 = Me!郵便番号 Forms!F_kihonn!住所 = Me!住所 Forms!F_kihonn!ビル名等 = Me!ビル名等 Forms!F_kihonn!電話番号 = Me!電話番号 Forms!F_kihonn!FAX番号 = Me!FAX番号 Forms!F_kihonn!URL = Me!URL Forms!F_kihonn!特記事項 = Me!特記事項 MsgBox "正常に登録されました", vbInformation End Sub でいちお上書き登録はされているのですが、上書きし終わった後も、更新ができるのです。F_kihonnを開いている状態でF_kihonnに転送するという表現もおかしい気がしますが、やっぱり変なのでしょうか? 更新不可ができるのでしたら教えてください<m(__)m>宜しくお願いします。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.2

> DoCmd.GoToRecord acDataForm, fname, acNewRec と、書いている時点で・・・新規レコードになってます 上書きしたいのであれば、レコードを指定して移動しなくてはならないのではないでしょうか? 私は、面倒なので非連結のフォームは使いませんが、非連結の場合、こう言う複雑な事を行うの? 修正であれば、ボタンで、フォームの「更新の許可」を「はい」、レコード移動時に「更新の許可」を「いいえ」で設定しても変らないと思うのですが・・・

noname#49321
質問者

補足

frm_基本情報検索画面に修正ボタンをもたせてあります。文字の追加や修正をさせたくないのですが。もし修正・削除する場合はコマンドボタンをクリックしたら修正・削除ができるように作りたかったんです。別フォームではなく一つのフォームでもできるのでしょうか?読み取りになっていて、ボタンを押したら書き込みOKにできるのでしょうか??

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

何をしようとしているのですか? アップされたコードだとボタンが置かれたフォームのカレントレコードの値を 別のフォームの新規レコードに転記しているだけですね 別のフォームのソースはボタンのあるフォームと同じテーブルなの? だったら 新規レコードに入力すればそれは新規レコードの追加ですから 主キーを変えてやらない限りエラーになるのは当然ですね

noname#49321
質問者

補足

tbl_基本情報→qry_基本情報→frm_基本情報検索(閲覧画面)   ∥ frm_kihonn ←frm_基本情報登録(非連結) クエリをもとにしたfrm_基本情報検索に修正というコマンドボタンを作成して、それをクリックしたら、frm_基本情報登録というフォームが開くように作ったのですが。上記のような作りかたしか思いつかなかったのですが、やはり変でしょうか??すみません。宜しくお願いします。

関連するQ&A

  • Access2003 条件を指定してフォームを開く

    アクセス初心者です。 初歩的な質問で本当に申し訳ないんですが、教えてください! 下記コードに条件を追加してフォームを開きたいのですが、どのようなコードを追記すればよろしいでしょうか? 今までは「SAPコード」が一致するものを表示していましたが、それにプラス「品番」も一致するもので条件を変更したいです。 ※今回の対象フォーム名:SCALE  メインフォーム名:発注実績 Else ' [SCALE] フォームを開き、現在のSAPコードのSCALEを表示します。 strDocName = "SCALE" strLinkCriteria = "[SAPコード] = Forms![発注実績]![SAPコード]" DoCmd.OpenForm strDocName, , , strLinkCriteria DoCmd.MoveSize (1440 * 0.78), (1440 * 1.8) End If 下記コードに条件式を追記すればいいと思いますが、ちょっと上手くいきませんでした。。。 strLinkCriteria = "[SAPコード] = Forms![発注実績]![SAPコード]" よろしくお願いします!!

  • Access2003にて、メインフォーム上に設置した「コピー」ボタンを

    Access2003にて、メインフォーム上に設置した「コピー」ボタンをクリックすると、メインフォームとサブフォーム9個のレコードを一括で新規レコードにコピーするVBAを作成しています。 ですが、ボタンをクリックすると、 「3164  フィールドを更新できません」 とメッセージが表示されて、メインとサブ1だけがコピーされ、サブ2~9はコピーされません。 テーブルの構成は以下のようになっています。 メイン(テーブル名:00メイン)  ・計画書番号(オートナンバー型)※主キー  ・コピーフラグ(数値型)  ・コピー実行日(日付型)  ・作成フラグ(数値型)  ・作成日(日付型)  ※この他40程フィールドがあります。 サブ1~9(テーブル名:01~09サブ)  ・計画書番号(長整数型)※インデックスは「はい(重複なし)」  ・レコード作成用番号(長整数型)  ※この他各サブテーブルごとに、20~40程のフィールドがあります。 サブ1~9の計画書番号はメインの計画書番号とリレーションシップしています。 サブフォームに計画書番号を表示するようにしてみると、コピーボタンをクリックしたときサブ2だけがメインで取得した新しい計画書番号が表示されていて、サブ2~9はコピー元の計画書番号が表示されています。 以下にコピーボタンをクリックした時のコードとBeforeUpdate時のコードを記載します。 また、「Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No」の箇所はメインの新規作成時にサブ1~9にレコードを作成するようにしています。 (メイン作成と同時にサブにもレコードを作成したかったので・・・) サブ2~9までのコピーができるようにするにはどうしたらよいのでしょうか? よろしくお願いいたします。 Private Sub cmdコピー_click() DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend Me!コピーフラグ = 1 Me!コピー実行日 = Date Me!サブ1.SetFocus DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend Me!サブ2のサブフォーム.SetFocus DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdCopy DoCmd.GoToRecord , , acNewRec DoCmd.RunCommand acCmdPasteAppend ※以下サブ3~9までサブ2と同じコードを記述しています。 MsgBox "レコードのコピーが完了しました。" End Sub Private Sub Form_BeforeUpdate(Cancel As Integer) Dim dlgret As Integer dlgret = MsgBox("編集内容を保存しましすか?", vbQuestion + vbOKCancel, "保存確認") If dlgret = vbCancel Then Cancel = True Else '新規作成の場合、作成日フラグは既定値0のため1に変更 If Me!作成フラグ = 0 Then Me!作成フラグ = 1 Me!作成日 = Date If Me!コピーフラグ = 1 Then Forms!メイン!サブ1.Form.Requery Forms!メイン!サブ2.Form.Requery ※サブ3~9も同様にRequeryを行ないます。 Else MsgBox "コピーフラグは" & Forms!メイン!コピーフラグ & "です。" & Chr(13) & _ "新規作成を実行します。""" Forms!メイン!サブ1.Form.レコード作成用番号 = Me.txt計画書No Forms!メイン!サブ2.Form.レコード作成用番号 = Me.txt計画書No ※サブ3~9も同様に処理します。 End If Else End If End Sub

  • ACCESS 別フォームから別フォームの処理を

    ACCESSでメインフォームから別フォームを 【メインフォーム】 DoCmd.OpenForm "FM_商品検索", , , , , acWindowNormal 【商品検索フォーム】 検索画面でJANコードを選んだらJANコードをセットして、商品マスタの読込等の処理をしたい Forms!F_仕入!F_仕入sub.Form!JANコード = Me.JANコード ↑これは動く Forms!F_仕入!F_仕入sub.JANコード_BeforeUpdate ↑これがエラーになります 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 でエラーになります。 Forms!F_仕入!F_仕入sub.JANコード_BeforeUpdate Public Sub JANコード_BeforeUpdate(Cancel As Integer) 何がおかしいのでしょうか? 宜しくお願いします

  • レコードを保存するコード アクセスvba

    アクセスですが DoCmd.Save acForm, Me.Name このコードはフォームを保存するコードですよね? フォームではなく、レコードを保存するコードはありますか?

  • Access2007 コントロールの削除

    イベント内プログラムで以下のようにフォームのコントロールの削除を行っていますが、 コントロール名が条件に合っていても削除されません。 DeleteControlが失敗しているのではなく、 If Left(ctlSche.Name, 6) = "lblBox" Then にひっかからないようです。 しかも、同じように 頭に"lblBox"とつくラベルコントロールでも、ひっかかるものとそうでないものがあります。 以下のコーディングでは不十分でしょうか? Dim ctlSche As Control DoCmd.Close acForm, FName, acSaveYes DoCmd.OpenForm FName, acDesign, , , , acHidden Set ctlSche = CreateControl(FName, acLabel) For Each ctlSche In Forms!TestForm.Controls If Left(ctlSche.Name, 6) = "lblBox" Then 'コントロールの削除 DeleteControl FName, ctlSche.Name End If Next DoCmd.Close acForm, FName, acSaveYes DoCmd.OpenForm FName, acDesign, , , , acHidden

  • コマンドボタンを押してフィルタを掛けたい(vba)

    すいません、、、教えてください。 テーブル1を作成し(図:左)、そのテーブルを元にフォームを作成したました。(図:右) フォーム上のコマンドボタンを押したら、 「いぬ」だけをフィルタ掛けるにはどういうコードを書けばいいですか? http://www.tsware.jp/study/vol4/docmd_5.htmを参考に Private Sub コマンド_Click() Forms!テーブル1.Filter = "名前 = 'いぬ'" DoCmd.RunCommand acCmdApplyFilterSort End Sub としてみたのですが 実行時エラー2046となって止まってしまいます。 続きを教えてくださいませ、、、 よろしくお願いします。

  • Access2003でフォームにあるコマンドボタンで更にフォームを開く

    Access2003でフォームにあるコマンドボタンで更にフォームを開くときのVBA記述で困っています。 Access2003で社員情報管理のデータベースを作成中です。 社員の情報を入力するにあたり、【基本情報】と【詳細情報】とでフォームを分けてあり、【詳細情報】を入力したい場合は、"基本情報フォーム"にあるコマンドボタンをクリックして"詳細情報フォーム"を開くようになっています。 この際、"基本情報フォーム"で開いている社員の【社員番号】を"詳細情報フォーム"の【社員番号】欄にも自動的に表示させるため、以下のようなVBAを記述しました。 Private Sub コマンドボタン_Click() DoCmd.OpenForm "詳細情報フォーム" Forms![詳細情報フォーム![社員番号].DefaultValue = Me![社員番号] End Sub 【社員番号】は7ケタの半角英数で、社員によって、数字だけの場合と、英数混じっている場合とがあります(データ型はテキスト型にしてあります)。 困っているのは、 1.上記を実行した際に、数字だけの社員番号は問題ないのですが、英数混じりの場合だと"社員番号"テキストボックスが「#Name?」という表示になってしまう 2."基本情報フォーム"のコマンドボタンをクリックして新規の"詳細情報フォーム"を開き(社員番号のみが反映され、他の項目は空欄の状態)、詳細情報を入力→保存したあと、別の社員番号で"基本情報フォーム"を開き、コマンドボタンで"詳細情報フォーム"を開くと、前に入力した社員の情報が出てきてしまう。 (つまり、"詳細情報フォーム"のもととなるテーブルに、1行でもレコードがあると、それが出てきてしまう。) 【詳細情報】は、 1.データを入力する社員としない社員とがいる 2.新規でレコードを作成する場合と、既存のレコードを上書きする場合とがある ので、もととなる"詳細情報テーブル"にその【社員番号の】レコードがなければ新規入力画面を、レコードがあればそのレコードを呼び出す形にしたいのですが、英数混じりの表示の件も含め、どうすれば、正しく表示されるか教えていただきたいです。 ぜひぜひよろしくお願いします。

  • 全てのコマンドボタンの名前を変更したい

    先日質問した「オブジェクト(コントロール)の名前を変更したい」 http://okwave.jp/qa/q7896863.html?by=datetime&order=DESC の応用で、 前回はDexMachina様にご回答いただいて解決したのですが今度は違う部分で詰みました。 フォームに乗っかっているコマンドボタンの名前を変更しつつ、 インデックスを付けていこうと思うのですが ************************************** Sub オブジェクト名変更() Dim ctl As Control Dim i As Long Dim f As String f = "フォーム1" i = 1 DoCmd.OpenForm f, acDesign 'デザインビューで開く For Each ctl In Forms(f).Controls If ctl.ControlType = acCommandButton Then Forms(f)!Controls(ctl.Name).Caption = i Forms(f)!Controls(ctl.Name).Name = i End If Next ctl DoCmd.Close acForm, "フォーム1", acSaveYes '保存する End Sub ************************************** のControls(ctl.Name).でエラーになります。 エラー内容は 実行時エラー2465 指定した式で参照されている’ Controls’フィールドが見つかりません。 です。 イミディエイトで?ctl.Nameして見ると コマンド0となるので問題ないと思うのですが文法がおかしいのでしょうか? Forms(f)!コマンド0.Caption にすると問題なく動作します。 ご回答よろしくお願いします。

  • Access2000 抽出について

    どうしてもわからないので教えてください。 選択クエリで、「フリガナ」というフィールドに、 Like IIf(IsNull([Forms]![F_顧客検索]![カナ検索]),"*",[Forms]![F_顧客検索]![カナ検索] & "*") でフォームからクエリを実行させるようにしているのですが、 フリガナが空白のレコードは抽出されてくれません。 「*」でなく、なんと入れればいいのでしょうか? ちなみに他に、「自宅電話番号」というフィールドに、 Like IIf(IsNull([Forms]![F_顧客検索]![電話検索]),"*" & "*",[Forms]![F_顧客検索]![電話検索] & "*") など、似たような感じで抽出をかけています。 よろしくお願いします。

  • Accessボタンで並び替え

    ACCESS97を使用しています。 フォーム上のボタンで、並び替えを実行したいのです。 対象フォームは、あるデータ(テーブル名:AAA)の 項目BBと項目CCの条件を使って選択クエリーGG を元に 帳票フォームで表示しています。 フォームFFF上には、BBと CCの入力テキストBOX、BB,CCがあるととします。 BBとCCでフィルタをかける場合、 DoCmd.ApplyFilter "", "[GG]![BB] =[Forms]![FFF]![BB]" & _ "AND [GG]![CC]= [Forms]![FFF]![CC]" というマクロでフィルタ実行されたデータが表示されますが、 項目BB、CCで、昇順、降順にソートしたい場合、 そのようなマクロはあるのでしょうか? 宜しくお願いします。

専門家に質問してみよう