VBAを使用してフォームの高さを設定する方法

このQ&Aのポイント
  • Access VBAを使用してフォームの高さを変更する方法について教えてください。
  • フォームの上に設置されたサブフォームの高さをVBAで設定した後、フォームを閉じて再度開いても、設定した高さが保存されません。
  • サブフォームの高さを保存するためにはどうすればよいでしょうか?
回答を見る
  • ベストアンサー

保存されない理由は?accessvba

図のようにフォームの上にサブフォームを設置して、 コマンドボタンとテキストボックス(txt_高さ)を設置しました。 コードは、 Private Sub コマンド1_Click() Me.サブフォーム.Height = Me.txt_高さ.Value End Sub です。 コマンドボタンを押すと、サブフォームの高さを設定する仕様なのですが、 サブフォームの高さを変化させて(例えば、2500twips)、 CTRL+Sを押して、バツボタンでフォームを閉じて、 再度フォームを開いても、2500twipsの高さではないです。 フォームを開いている最中に、VBAで変化させたサイズで保存して、 再度開いた時もその高さにしたいのですが、無理なのでしょうか? ヘルプ(SubForm."Height/高さ" プロパティ)には 「値の取得および設定が可能です。」と書いてありますから 設定も可能なのでは?と思っています。

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

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

No.1です。 すみません、記憶に頼って動作確認を怠っていました。 No.1の方法では、保存されないことを確認しました。 ご指摘ありがとうございます。 お詫びの上、別案を提示します。 (とりあえず、概略のみを提示しますが、必要であれば  コードも作成します) この方法であれば、VBAのソースコードを削除して、 デザインビューに切り替えることもできないMDEファイル であっても適用可能です。 【概要】  ・サブフォームの高さを、新設したテーブルに記録  ・フォームを開くときにその値を取得し、サブフォームの   高さに適用 <参考(以前のQ&A)>  http://okwave.jp/qa/q6814037.html 【手順の概略】 1)新規テーブルを作成  <フィールド構成の一例>   『フォーム名』『コントロール名』『プロパティ名』『値』   (ご質問のフォーム以外でも同様に、サブフォーム等   の高さや幅を変えることがある場合を想定) 2)フォームの『開くとき』イベントで、上記テーブルの値を  DLookupなどで取得し、サブフォームの高さに適用  (DLookup関数の第3引数にフォーム名などを指定して、   必要な設定値を取得) ・・・以上です。 大変失礼致しました。

wrpmxubb7985
質問者

お礼

回答ありがとうございました。

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No2、No3です。質問のプロパティはデザインビューで 設定する必要があります。したがってNo2のコードの 最初で、 DoCmd.OpenForm Me.Name, acDesign, , , , acHidden として acDesign すなわちデザインビューで開き、 その後、プロパティを設定しなおして保存して閉じ、 DoCmd.OpenForm Form_フォーム1.Name のようにして開き、設定を確認します。 その後、フォームを閉じ、再び開くと 閉じる前に設定したサブフォームの高さが 維持されている、ということです。

wrpmxubb7985
質問者

お礼

回答ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No2です。 書き忘れましたが、No2のあと一旦フォームを閉じて 再び開くと、閉じる前に設定したサブフォームの 高さで開かれます。

wrpmxubb7985
質問者

お礼

回答ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

フォームを閉じて、閉じる前に設定した高さで再び開く ということで回答します。 コード中の Dim a As Long はクリックイベントの外に以下のように設定します。 なお、"サブフォーム"という名前はサブフォームを 表示するコントロール名で初期値は"埋め込み0"の ような名前です。したがって名前を変更して"サブフォーム" というようにサブフォーム表示コントロール名が変更 されているものとします。 また、メインフォームの名前は"フォーム1"としています。 もし、メインフォーム名が"ABCメインフォーム"というような ものであれば、以下のコードの中の"メインフォーム1"を "ABCメインフォーム"に置き換えてください。 以下のコードで少し特殊なのは、デザインビューにしたときに そのメインフォームの名前の取得はコード表のプロジェクト で表示されている名前を使うというところです。 Option Compare Database Option Explicit Dim a As Long Private Sub コマンド1_Click() a = Me.txt_高さ.Value DoCmd.OpenForm Me.Name, acDesign, , , , acHidden Form_フォーム1.Controls("サブフォーム").Height = a DoCmd.Save acForm, Form_フォーム1.Name DoCmd.Close acForm, Form_フォーム1.Name DoCmd.OpenForm Form_フォーム1.Name End Sub 以上、わからないところがあれば補足してください。

wrpmxubb7985
質問者

お礼

回答ありがとうございました。

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

> CTRL+Sを押して、バツボタンでフォームを閉じて、 Officeでの「Ctrl+S」のショートカットキーは、   ExcelやWordでは「ファイル(ブック/ドキュメント)の保存」ですが、   Accessの場合は、「レコードの保存」 となっていて、このショートカットキーではフォームやテーブルなどの デザイン変更を保存することはできません。 ※但し、AccessでもVisual Basic Editor(VBE)の画面では、   「Ctrl+S」でフォームが保存される仕様になっています。 フォームやテーブル等をキーボード操作で保存する場合は、 「Alt+Fを同時押し」した後、「S」を押して下さい(=上書保存)。 (Accessでは、フォームやテーブルのデザインビューでこのショート  カットキーを使用した場合、そのMDBファイル全体ではなく、  現在アクティブにしているAccessObject(→フォームやテーブル  等の総称)だけが保存されます) また、サブフォームの高さを設定すると同時に保存もVBAで行う 場合は、高さを設定した後に以下のコードを記述すればOkです: DoCmd.Save  または DoCmd.Save acForm, Me.Name なお、以下のような記述をすれば、コードを記述したのとは別の AccessObjectを上書保存することも可能です。 (詳しくはヘルプを参照下さい) DoCmd.Save acTable, "テーブル1" (「テーブル1」という名前のテーブルを上書保存する場合の例) ・・・以上、参考まで。

wrpmxubb7985
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • 親フォームからサブフォームのレコードソースを設定

    親フォームからサブフォームのレコードソースを設定するには? フォーム1にテーブル1をドロップアンドドラッグして、「テーブル1のサブフォーム」を作成しました。 フォーム1にあるコマンドボタンから「テーブル1のサブフォーム」のRecordSourceを設定する方法を教えてください。 「テーブル1のサブフォーム」からなら Private Sub Form_Load() Me.RecordSource = "" End Sub とできるのですが、 やりたいことはフォーム1からのイベントなので 「テーブル1のサブフォーム」からのイベントは使えません。 だからってフォーム1の Private Sub コマンド2_Click() Me.テーブル1のサブフォーム.RecordSource = "テーブル1のサブフォーム" End Sub とするとコンパイルエラーになります。 良い方法があれば教えてください。アドバイスよろしくお願いします。

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

    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 だと、何も起こりません。(新規レコードに移動しません) 解決方法をご教授ください。

  • 親フォーム名を取得するには?

    フォーム1を作り、さらにフォーム2を作り、 フォーム1にはめ込んで、フォーム2をサブフォームとしました。 そのフォーム2にコマンドボタンを作成しました。 そしてそのコマンドボタンをクリックしたときに、メッセージを表示させたいのですが、 内容は 「現在のフォームの親フォームはフォーム1です」です。 Private Sub コマンド0_Click() MsgBox Me.Name & "の親フォームは " & Me.Parent & "です" End Sub だと実行時エラー450になります。

  • AccessVBA RecordSourceのリセットについて

    こんにちは。 フォーム上で、データベースを検索するものを作っています。 SELECT ~ WHERE ~ で条件に合致するレコードを、サブフォームを連続表示しています。 リセットボタンを作成して、検索結果を消したい(カラにしたい)と思うのですが、 Me![subform].Form.RecordSource = "" Me![subform].Requery 上記のVBAを実行すると、1レコードだけ表示され、コントロール上では「#Name?」が出てしまっています。 参照するテーブルが無いためにこういうことが起きているのだと思うのですが、防ぐ方法が分かりません。 教えてください。 宜しくお願いします。

  • サブフォームのビューを切り替えたい

    親フォーム(フォーム1)にサブフォームとして、 テーブルをソースとするサブフォーム(テーブル1のサブフォーム)を配置しました。 親フォームからサブフォームのビューを変更したいのですが どうすればいいか教えてください。 親フォームのコマンドボタンにはそれぞれ Private Sub 単票フォームへ切り替え_Click() Me.Controls("テーブル1のサブフォーム").Form.DefaultView = 1 '帳票フォーム End Sub Private Sub 帳票フォームへ切り替え_Click() Me.Controls("テーブル1のサブフォーム").Form.DefaultView = 0 '単票フォーム End Sub としたのですが、 実行すると 実行時エラー 2136 "このプロパティを設定するには、フォームまたはレポートをデザインビューで開きます"。 となってしまいます。 Private Sub 帳票フォームへ切り替え_Click() DoCmd.SelectObject acForm, "テーブル1のサブフォーム" DoCmd.RunCommand acCmdFormView End Sub にしたところ、 実行時エラー 2489 “オブジェクト テーブル1が開いていません、” になります。 サブフォームに埋め込んでいて親フォームを開いていても 開いてない事になるのですね。 フォームビューの時に、切り替える事は不可能なのでしょうか? 帳票ビュー表示用フォーム、 単票ビュー表示用フォーム を作るしかないのでしょうか?

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

    アクセスのフォームの上にコマンドボタンを一つ設置して、 クリックイベントで 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 指定した式は、 いずれか の引数とデータ型が対応していません。 になります。 行ってる意味は同じだと思うのですが、 なぜエラーになるのか教えていただけますか?ご教授よろしくお願いします。

  • AccessVBAにおけるOpenArgsの使用について

    AccessVBAを最近はじめた初心者です。 ~~~フォーム1~~~ Private Sub コマンド0_Click() DoCmd.OpenForm "フォーム2", , , , , , "コマンド0" End Sub Private Sub コマンド1_Click() DoCmd.OpenForm "フォーム2", , , , , , "コマンド1" End Sub ~~~フォーム2~~~ Private Sub Form_Load() Dim strFormName As String strFormName = Forms.フォーム1.OpenArgs DoCmd.PrintOut strFormName End Sub 上のプログラムのようにフォーム1でクリックしたボタンによってフォーム2を読み込んだ時の動作を変えるプログラムを作成しようとしています。 しかし、実際に起動させると、『strFormName = Forms.フォーム1.OpenArgs』の辺りで 「Null の使い方が不正です。」 というエラーメッセージが表示されます。 Accessのヘルプを参照に組んでみたのですが、どの箇所が間違っているのでしょうか? 回答、よろしくお願いします。

  • サブフォームをリクエリしたい

    メインフォームのコマンドボタンを押下するとvbaを使ってテーブルのデータを更新します。 メインフォームの中にはサブフォームがあり、 そのサブフォームとテーブルがリンクしています。 サブフォームにはテーブルのデータが表示されており、 メインフォームのコマンドボタン押下→テーブルデータ更新 がされると、全て#Deletedという文字が表示されます。 なので、 Private Sub cmd_データ更新_Click() Call データ更新 Me.Controls("Fサブ").Form.Requery End Sub としたのですが、 「実行時エラー’2465’:指定した式で参照されている’Fサブ’フィールドが見つかりません。」 が発生します。 Me.Controls("Fサブ").Requery これにしても同じでした。

  • 【C#】サブフォームからメインフォームを操作

    サブフォームに設定したボタンをクリックしたらメインフォームのイベントを実行とかは可能でしょうか? メインフォーム→Main サブフォーム→Sub Mainに、ウェブブラウザ(webbrowser1)を用意して、 サブフォームのボタン(button1)をクリックしたら、 webbrowser1に、http://www.yahoo.co.jp が表示すると言うプログラムを作りたいです。 以下のプログラムではエラーが出てしまいました。 まず、Mainのフォームロード時にSubが開くように設定。 ※webbrowser1のModifiersをinternalに設定。 private void Main_Load(object sender, EventArgs e) { Sub subform = new Sub(); subform .Show(); } 次に、Subで Main mainform; private void button1_Click(object sender, EventArgs e) { mainform.webbrowser1.Navigete("http://www.yahoo.co.jp") } と書いて、実行時のエラーは無く実行できたのですが、 button1をクリックすると、エラーが出て止まってしまいます。 逆に、Subにウェブブラウザを置いて、Mainから操作するのは上記のプログラムで問題なく動きました。 どうすれば、Subからメインのイベントを操作できるのでしょうか? よろしくお願いします。

専門家に質問してみよう