オブジェクト(コントロール)の名前を変更したい

このQ&Aのポイント
  • 諸事情があり、フォーム上のコマンドボタン40個くらいの名前を変更したいですが、メモリが不足しています。
  • 試しに一つだけ名前を変更してみましたが、うまくいきませんでした。
  • バージョンは2007で、指定のコントロールを追加、名前を変更、または削除することはできません。
回答を見る
  • ベストアンサー

オブジェクト(コントロール)の名前を変更したい

諸事情があり、フォーム上のコマンドボタン40個くらいの名前を変更したいのですが まず、一つだけ変更できるか実験してみたのですがうまくできません。 Sub オブジェクト名変更() DoCmd.OpenForm Form_フォーム1.Name, acDesign Form_フォーム1.コマンド0.Name = "あああ" DoCmd.Save acForm, Form_フォーム1 End Sub を実行すると メモリが不足しています。(Error 7) と出たり、 実行時エラー 29054 指定のコントロールを追加、名前を変更、または削除することはできません。 と出たりします。 これって無理って事でしょうか? バージョンは2007です。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

> これって無理って事でしょうか? 当該フォーム以外から実行するのであれば、コントロール名の変更は可能です。 ただ、そのコントロールの各イベントにコードを割り当てていたり、コード上でそれらを 参照していた場合、名前が一致しなくなるため、注意が必要です。 (「Private Sub コマンド0_Click」が呼び出せなくなったり、「コマンド0.SetFocus」が  コンパイルエラーになったり、といった事態になります) 以下のコードを適用する際は、以上の注意事項を踏まえた上で行ってください。 (なお、以下のコードでは、フォームを閉じる際に、確認メッセージなしで変更を保存  させるよう、DoCmd.Closeの第3引数に「acSaveYes」を指定していますので、  併せてご注意下さい) Public Sub オブジェクト名変更()   DoCmd.OpenForm "フォーム1", acDesign   Forms("フォーム1")!コマンド0.Name = "あああ"   DoCmd.Close acForm, "フォーム1", acSaveYes End Sub 上記のように、「Form_フォーム1.Name」ではなく、「"フォーム1"」と定数式を 使用すれば、変更が可能になります。 これは、「Form_フォーム1」を参照すると、「フォーム1」が非表示でメモリに 読み込まれる(≒フォームビューで開かれたのに近い状態になる)ためです。 このため、せっかくデザインビューで開く指定をした意味がなくなってしまって います。 (DoCmd.OpenFormで開くのとは異なり、「Form_フォーム1」の形で参照すると、  同じフォームを同時に複数表示が可能になるため、このようなことが起こります) 詳細については、以前のQ&Aを参照してみてください: http://okwave.jp/qa/q7888223.html

PVTETEJPB8
質問者

お礼

名前を変更したいコントロールにvbaコードが書いてあったり、 フォーカスが当たる場合は要注意という事ですね。 ん?ん?ん? いまいちよくわからないのですが >当該フォーム以外から実行するのであれば、 コントロール名の変更は可能です。 との事ですが、 Forms("フォーム1")!コマンド0.Name = "あああ" これは、該当フォームから実行してる事にはならないのですか? と思ったら、 >上記のように、「Form_フォーム1.Name」ではなく、 >「"フォーム1"」と定数式を使用すれば、変更が可能になります。 >これは、「Form_フォーム1」を参照すると、 >「フォーム1」が非表示でメモリに読み込まれる >(≒フォームビューで開かれたのに近い状態になる)ためです。 との事なのですね。 要するに Form_フォーム1 と Forms("フォーム1") は別物のようですね。  Forms("フォーム1")形式に変えたらうまくできました。

関連するQ&A

  • フォームを開くと同時にコントロールを削除したい

    フォームを開くと同時にコントロールを削除したいのですが、 Private Sub Form_Load() イベントで、 DoCmd.OpenForm Me.Name, acDesign DeleteControl Me.Name, "コマンド9" こうしてみたのですが、別のビューに切り替えることはできません、となります。 DoCmd.OpenForm Me.Name, acDesign これをナシにすると、 DeleteControl Me.Name, "コマンド9" この部分で コントロールの作成と削除は、デザインビューまたはレイアウトビューで行います。 となります。 どうすればいいでしょうか? アドバイスよろしくお願いします。

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

    先日質問した「オブジェクト(コントロール)の名前を変更したい」 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 にすると問題なく動作します。 ご回答よろしくお願いします。

  • vbaでフォームを作成しつつ、指定した名前で保存す

    vbaでフォームを作成しつつ、指定した名前で保存するには? Sub フォームを作成する() Dim myBtn As TextBox Dim myForm As Form Set myForm = CreateForm myForm.DefaultView = 1 ' 帳票フォーム DoCmd.Save acForm, "F帳票" End Sub これを実行すると 実行時エラー2489 オブジェクト ’F帳票’が開いていません。 になってしまうのですが、新規でフォームを作り名前を付けて保存する方法はありますか? ご回答よろしくお願いします。

  • フィルターの文字列を空にしたいのですが

    親フォームからサブフォームを閉じる時に、フィルターの文字列を空にしたいのですが Private Sub Form_Close() Me.Controls("F_SubMain").Form.Filter = Empty DoCmd.Save acForm, Me.Name MsgBox Me.Controls("F_SubMain").Form.Filter DoCmd.ShowToolbar "Ribbon", acToolbarYes End Sub としても、フィルターの文字が残ってしまいます。 親フォームにサブフォームに入れてるので、 そのサブフォームのフィルタの文字列を空白にしたいのですが DoCmd.Save acForm, Me.Name で保存できないようなのですが DoCmd.Save acForm, Me.Controls("F_SubMain").Form もエラーになりました。 こういうことをやりたい場合、どうすればいいでしょうか?

  • クリックイベントなのに、2回クリックしないとフォー

    クリックイベントなのに、2回クリックしないとフォームが閉じないです。 フォームに閉じると言うコマンドボタンがあり、クリックイベントで Private Sub cmd_閉じる_Click() DoCmd.Close acForm, Me.Name End Sub としてるのですが、なぜか1回ボタンを押しただけではフォームが閉じません。 2回目押した時にフォームがとじます。 ダブルクリックでも閉じます。 Private Sub cmd_閉じる_Click() 'DoCmd.Close acForm, Form_Fフォーム.Name End Sub のように、フォーム名を指定すると1回のクリックで閉じます。 しかしMe.Nameだと2回目じゃないと閉じない理由がわかりません。 Fフォームは他フォームから DoCmd.OpenForm Form_Fフォーム.Name, acNormal で開いたから2回クリックしないと閉じないのでしょうか?

  • 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

  • 標準モジュールだとエラーになる理由を教えてください

    アクセスのフォームの上にコマンドボタンを一つ設置して、 クリックイベントで Private Sub コマンド0_Click() DoCmd.Close acForm, Me.Name End Sub とすれば、自身のフォームが閉じます。 しかし、 Private Sub コマンド0_Click() Call test End Sub と、 標準モジュール Option Compare Database Option Explicit Sub test() DoCmd.Close acForm, Form_フォーム1 End Sub にすると、 実行時エラー2498 指定した式は、 いずれか の引数とデータ型が対応していません。 になります。 行ってる意味は同じだと思うのですが、 なぜエラーになるのか教えていただけますか?ご教授よろしくお願いします。

  • コマンドボタン名を取得して変数に代入したい。

    OS:windowsXp Access Version:Xp 既出でしたらすみません。 INDEXのフォームにて複数コマンドボタンを作り、それを押すと各登録フォームや集計フォームが開くようにしています。 さて、質問なのですが、コマンドボタンで別のフォームを開く時の処理を(フォーム名が違うだけで後は同じなので)まとめて書きたいのです。 現在は次のようにやっています。 ------------------------------------------------- Private Sub F_メニュー_Click() Call close_form DoCmd.OpenForm "F_メニュー", acNormal, , , acFormEdit, acWindowNormal End Sub Private Sub F_売上伝票_Click() Call close_form DoCmd.OpenForm "F_売上伝票", acNormal, , , acFormEdit, acWindowNormal End Sub      (中略) Private Sub 事業所別集計_Click() Call close_form DoCmd.OpenForm "F_事業所別集計", acNormal, , , acFormEdit, acWindowNormal End Sub Private Sub 消費税変更_Click() Call close_form DoCmd.OpenForm "F_消費税変更", acNormal, , , acFormEdit, acWindowNormal End Sub Private Sub システム終了_Click() Call close_form DoCmd.RunCommand acCmdExit End Sub Private Sub close_form() msgbx = False DoCmd.Close acForm, "index", acSaveYes End Sub ------------------------------------------------- これを  ボタン名_Click() ではなく  frm_open() 押されたボタン名を変数に取得(ボタン名=Form名にします。) DoCmd.OpenForm 押されたボタン名変数 のように共有したいのです。 どうすれば出来ますでしょうか?ご指導よろしくお願いします。

  • フィルタの情報を保存したい

    Me.Form.Filter = "" Me.Form.FilterOn = を保存したいのですがどうすればいいでしょうか? フォームにテキストのフィールドと 抽出とクリアのコマンドボタンを設置して、フィルタをかけたり解除したりしています。 途中でフォームを閉じても最後にフィルタをかけたなら、 再度フォームを開いたときに最後に検索したワードでフィルタが開く用にしたいし フォームを閉じる前にフィルタを解除したのなら、 再度フォームを開いたときはフィルタが解除された状態にしたいです。 Private Sub cmd_クリア_Click() Me.Form.Filter = "" Me.Form.FilterOn = False DoCmd.Save acForm, Me.Name End Sub Private Sub cmd_抽出_Click() Me.Form.Filter = "フィールド2 like '*" & Me.txt_フィールド2テキスト.Value & "*" & "'" Me.Form.FilterOn = True DoCmd.Save acForm, Me.Name End Sub としてるのに、フィルタの情報が保存されてません。 再度開きなおしたときは、 必ず全レコードが表示されてしまいます。 フィルタの状態を保存する方法を教えてください。ご回答よろしくお願いします。

  • サブフォームの新規レコードに移動したい アクセス

    親フォームのコマンドボタンをクリックしたら 親フォームにはまっているサブフォームの新規レコードに移動したいのですが、 うまくできません。 サブフォームのオブジェクト名は、"F_SubForm"です。 サブフォームはデータシートビューです。 VBAコードは Private Sub cmd_test_Click() DoCmd.SelectObject acForm, "F_SubForm" DoCmd.GoToRecord , , acNewRec End Sub です。 上記コードを実行すると DoCmd.SelectObject acForm, "F_SubForm" の部分で、 「実行時エラー 2489  オブジェクトが開いていません。」 となります。 だからと言って、 DoCmd.GoToRecord , , acNewRec だと、何も起こりません。(新規レコードに移動しません) 解決方法をご教授ください。

専門家に質問してみよう