プロが教える店舗&オフィスのセキュリティ対策術

図のようにフォームの上にサブフォームを設置して、
コマンドボタンとテキストボックス(txt_高さ)を設置しました。

コードは、
Private Sub コマンド1_Click()
Me.サブフォーム.Height = Me.txt_高さ.Value
End Sub
です。

コマンドボタンを押すと、サブフォームの高さを設定する仕様なのですが、
サブフォームの高さを変化させて(例えば、2500twips)、
CTRL+Sを押して、バツボタンでフォームを閉じて、
再度フォームを開いても、2500twipsの高さではないです。

フォームを開いている最中に、VBAで変化させたサイズで保存して、
再度開いた時もその高さにしたいのですが、無理なのでしょうか?

ヘルプ(SubForm."Height/高さ" プロパティ)には
「値の取得および設定が可能です。」と書いてありますから
設定も可能なのでは?と思っています。

「保存されない理由は?accessvba」の質問画像

A 回答 (5件)

> 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」という名前のテーブルを上書保存する場合の例)


・・・以上、参考まで。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/11/03 18:50

フォームを閉じて、閉じる前に設定した高さで再び開く


ということで回答します。
コード中の
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



以上、わからないところがあれば補足してください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/11/03 18:50

No2です。


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

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

お礼日時:2012/11/03 18:50

No2、No3です。

質問のプロパティはデザインビューで
設定する必要があります。したがってNo2のコードの
最初で、

DoCmd.OpenForm Me.Name, acDesign, , , , acHidden

として acDesign すなわちデザインビューで開き、
その後、プロパティを設定しなおして保存して閉じ、


DoCmd.OpenForm Form_フォーム1.Name

のようにして開き、設定を確認します。
その後、フォームを閉じ、再び開くと
閉じる前に設定したサブフォームの高さが
維持されている、ということです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/11/03 18:50

No.1です。


すみません、記憶に頼って動作確認を怠っていました。
No.1の方法では、保存されないことを確認しました。
ご指摘ありがとうございます。

お詫びの上、別案を提示します。
(とりあえず、概略のみを提示しますが、必要であれば
 コードも作成します)
この方法であれば、VBAのソースコードを削除して、
デザインビューに切り替えることもできないMDEファイル
であっても適用可能です。

【概要】
 ・サブフォームの高さを、新設したテーブルに記録
 ・フォームを開くときにその値を取得し、サブフォームの
  高さに適用
<参考(以前のQ&A)>
 http://oshiete.goo.ne.jp/qa/6814037.html

【手順の概略】
1)新規テーブルを作成
 <フィールド構成の一例>
  『フォーム名』『コントロール名』『プロパティ名』『値』
  (ご質問のフォーム以外でも同様に、サブフォーム等
  の高さや幅を変えることがある場合を想定)
2)フォームの『開くとき』イベントで、上記テーブルの値を
 DLookupなどで取得し、サブフォームの高さに適用
 (DLookup関数の第3引数にフォーム名などを指定して、
  必要な設定値を取得)


・・・以上です。
大変失礼致しました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/11/03 18:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています