プロが教えるわが家の防犯対策術!

サブフォームの高さをVBAで調整するには

顧客の基本情報が表示されてるフォーム1に、その顧客が購入した商品の履歴一覧が
フォーム1の中のサブフォームに表示されるようになってます。
顧客が商品を20回購入した時の大きさ(高さ)にサブフォームをデザインビューで作成しました。
顧客が20回以下で商品を購入した場合、その高さにサブフォームを合わせたいんです。
VBAでサブフォームの高さを調整することは可能でしょうか?
現在、1回しか購入履歴がない顧客も、20回購入履歴がある顧客と同じ高さのサブフォームで表示されてます。

A 回答 (4件)

#3です



訂正です(中ほどあたりの)

> その広げた部分に、フォーム「F1」をドラッグ&ドロップします。

その広げた部分に、フォーム「F2」をドラッグ&ドロップします。
    • good
    • 0

#2です。



サブフォーム部分の作り方が関係すると思いますので、
#2の検証用DBの作り方を以下に。(2007でのものですが・・・・)
(30分あれば十分検証できると思います)


・新規DBを作成します。
・テーブル「T0」「T1」2つを以下の内容で作成します。

テキスト型では、確認がしやすいように IME は「オフ」と設定しておきます。

テーブル「T0」
ID:数値型、長整数、主キー
名前:テキスト型(10文字程度)
電話:テキスト型(20文字程度)

テーブル「T1」
an:オートナンバー(主キー)
ID:数値型、長整数(「T0」と結びつけるもの)
商品名:テキスト型(10文字程度)
数量:数値型、長整数


まず、サブ側のフォームを作っていきます。

フォームウィザードを使って、
テーブル「T1」を元に、「商品名」「数量」を表示するようにして
表形式で作成し、フォーム名を「F2」にして編集します。
(「ID」は親を見ればわかるし、「an」は特に必要とは思わないので)

フォームのプロパティ「移動ボタン」を「いいえ」に、
「スクロールバー」を「垂直のみ」にします。
「挿入前処理」を「イベントプロシージャ」にして、右横の「...」をクリックします。
表示された部分を #2 の子側への記述例部分を、コピー&貼り付けし、
保存し、閉じておきます。

メイン(親)側のフォームを作っていきます。

フォームウィザードを使って、
テーブル「T0」を元に、すべてを表示するようにして
単票形式で作成し、フォーム名を「F1」にして編集します。

フォームの「レコードセレクタ」を「いいえ」にして詳細部分を広げます。
(余裕を持って広げておきます)
その広げた部分に、フォーム「F1」をドラッグ&ドロップします。

そうするとリンク親/子フィールドは共に「ID」が埋められるので、そこはそのままにして
「名前」部分を「FSUB」に変更します。

フォームのプロパティ「レコード移動時」を「イベントプロシージャ」にして
右横の「...」をクリックします。

表示された部分を #2 の親側への記述例部分を、コピー&貼り付けします。
確認上 20 件は多いので、
Const iShow As Long = 20
部分は
Const iShow As Long = 5
にしておきます。(表示のMAXは5行と言う事に・・・)

で、保存後、フォーム「F1」を起動します。

親側のレコードを作っていきます。
「ID」は自分で採番しないといけないので、重複しないものを何件か・・・

登録した部分で、サブフォームへ入力していきます。
5行になるまでは、チョコチョコと増えていくと思います。
途中、レコードを削除してみるとか・・・・
新規作成中にキャンセルしてみるとか・・・・

そこそこ動くと思います。


実際の入力操作を強固にするには、親の「ID」が未入力ならサブ側で編集させないとか・・・
記述の追加が必要です。
この場合の例としては、子側の処理で

Private Sub Form_BeforeInsert(Cancel As Integer)
  Call Me.Parent.SetSubHeightB
End Sub

部分を

Private Sub Form_BeforeInsert(Cancel As Integer)
  If (IsNull(Me.Parent.ID)) Then
    Cancel = True
  Else
    Call Me.Parent.SetSubHeightB
  End If
End Sub

にするとか・・・


サブフォームコントロールに、直にテーブル/クエリを表示する方法もありますが、
私はフォームをかえして入力チェック等を行うようにしています。

この辺は考え方次第だと思いますけど・・・


なお、サブフォーム側で、
新規登録はない、削除もない・・・となると、かなりスッキリとした記述になると思います。



参考にする/しない/したくない等々、自己責任でお願いします。



※ #2での
> サブフォームがデータシートであれば、
は、
サブフォームがデータシートビューであれば、

になります。
    • good
    • 0

雰囲気だけで良いですか



サブフォームの高さをVBAで調整するには
http://detail.chiebukuro.yahoo.co.jp/qa/question …

をみると Access で良いのでしょうか


サブフォームに表示した件数分(MAX 20 件)だけを見るようにする
・・・で良かったでしょうか
解釈違いであればスルーという事に・・・


サブフォームコントロール名を「FSUB」と仮定します。
サブフォームに表示しているものは、帳票フォームであると仮定します。
リンク親子フィールドが設定されているものと仮定します。

サブフォームコントロールの高さを変更するので、メイン(親)側で処理させます。

親側への記述例)

Private Sub SubHeightSet(iAdd As Long)
  Dim iCnt As Long
  Dim iH As Long
'  Const iRecMov As Long = 300 ' ★
  Const iRecMov As Long = 0 ' ★
  Const iShow As Long = 20

  With Me.FSUB
    With .Form
      With .RecordsetClone
        If (.RecordCount > 0) Then .MoveLast
        iCnt = .RecordCount + iAdd
      End With
      If (.AllowAdditions) Then iCnt = iCnt + 1
      If (iCnt > iShow) Then iCnt = iShow
      iH = .Section(acHeader).Height _
        + .Section(acDetail).Height * iCnt _
        + .Section(acFooter).Height
    End With
    .Height = iH + iRecMov
  End With
End Sub

Public Sub SetSubHeightA()
  Call SubHeightSet(0)
End Sub
Public Sub SetSubHeightB()
  Call SubHeightSet(1)
End Sub

Private Sub Form_Current()
  Call SetSubHeightA
End Sub


子側への記述例)

Private Sub Form_BeforeInsert(Cancel As Integer)
  Call Me.Parent.SetSubHeightB
End Sub

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
  Call Me.Parent.SetSubHeightA
End Sub

Private Sub Form_AfterDelConfirm(Status As Integer)
  If (Status <> acDeleteOK) Then
    Call Me.Parent.SetSubHeightA
  End If
End Sub

Private Sub Form_Undo(Cancel As Integer)
  Call Me.Parent.SetSubHeightA
End Sub


★部分、サブフォームに「移動ボタン」を表示している時にはそれなりの高さを設定します。

※ 新規の行がなかったら・・・・等で不要になるものもあります。
(2007 で動きを見てみましたけど・・・・)

他のタイミングでやる場合でも、
SetSubHeightA / SetSubHeightB を使い分ければよいと思います。

メインの高さに余裕がない場合は、
メインを大きくしてからサブフォームコントロールの高さを広げます。
でないと、エラーになったような・・・・

サブフォームがデータシートであれば、
RowHeight を設定し、レコード数 + 1 分(20 の範囲で)を・・・
見出し分と移動ボタン分を足しこめば良いと思います。
RowHeight の既定は -1 のようで、デフォルト値が使われる見たいな雰囲気です。
デフォルト値はどこかにあるのでしょう。
自分で設定してやった方が楽そうです。

データシートビューのセルサイズを固定する : Access裏技Tips
http://www.accessclub.jp/urawaza/60.html



参考にする/しない/したくない等々、自己責任でお願いします。
    • good
    • 0

サブフォームと言われてもどのコントロールをどのように使っているのか何も情報が提示されていませんから、誰も答えられません。



サブフォームとして使っているコントロールのheightを履歴数によって変えればいいのでは???。

この回答への補足

DreamyCatさん、ありがとうございます。
どのコントロールをどのように?…すみません、コントロールってなんですか?

補足日時:2011/07/23 10:12
    • good
    • 0

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

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


このQ&Aを見た人がよく見るQ&A