Microsoft Access 掲示板

縦スクロールバーをマウスでつかむときに表示される レコード:13/44 の値を取得したい / 9

19 コメント
views
4 フォロー
9
mae 2022/02/21 (月) 16:55:58 修正

hiroton 様

色々とご説明いただきありがとうございます。
まだまだ勉強不足でございました。

1.「見た目」とツールチップは同じでVBAの結果にずれがある
に該当します。

ツールチップについてはACCESS外の話になるとのことので、また別で考えさせていただきます。

以下、リンク先のコードにそって情報提示致します。

うまくいく場合

ツールチップの値:9/100
実際に見える先頭レコードの番号:9
'カレントレコードを取得
curRecNum = Me.CurrentRecord      '値:16
'現在のセクションの上端からフォームの上端までの距離(twip)を取得
curTop = Me.CurrentSectionTop      '値: 3180
Me.Section("フォームヘッダー").Height  '値:454
Me.Section("詳細").Height        '値: 397

'フォームヘッダー行数を取得
headerHeight = Int(Me.Section("フォームヘッダー").Height / Me.Section("詳細").Height)  '値: Int(454/397)=1
'現在先頭に表示されているレコード番号を取得
topRecNum = curRecNum - (Int(curTop / Me.Section("詳細").Height) - headerHeight)    '値: 16 - (Int(3180 / 397) - 1) = 9
’結果:9 一致

ずれる場合

ツールチップの値:9/100
実際に見える先頭レコードの番号:9

'カレントレコードを取得
curRecNum = Me.CurrentRecord      '値:17
'現在のセクションの上端からフォームの上端までの距離(twip)を取得
curTop = Me.CurrentSectionTop      '値: 3570
Me.Section("フォームヘッダー").Height  '値:454
Me.Section("詳細").Height        '値: 397

'フォームヘッダー行数を取得
headerHeight = Int(Me.Section("フォームヘッダー").Height / Me.Section("詳細").Height)  '値: Int(454/397)=1
'現在先頭に表示されているレコード番号を取得
topRecNum = curRecNum - (Int(curTop / Me.Section("詳細").Height) - headerHeight)    '値: 17 - (Int(3570 / 397) - 1) = 10
’結果:10 ひとつずれる

ご指摘どおり丸め処理がずれていると思います。
うまくいく場合 Int(3180 / 397) = 8.0100...=8 OK
ずれる場合   Int(3570 / 397) = 8.992...=8 (本当は9の値が欲しい)

どのように修正すればどんな条件でも一致するか悩んでおります。

通報 ...
  • 11

    すみません、補足です。上記のように

    Me.Section("フォームヘッダー").Height  '値:454(0.8cm)
    

    の高さだと四捨五入 Int((curTop / Me.Section("詳細").Height)+0.5) をすれば成り立つのですが、

    Me.Section("フォームヘッダー").Height  '値:340(0.6cm)
    

    の高さだと四捨五入すると逆にずれ、どの場所でもそのままで成り立つという現象になり、なかなか安定せずに悩んでおりました。

    13

    なんだか丸め誤差といえるほど小さな誤差じゃなさそうですね
    ヘッダーと詳細セクションの間、詳細セクション同士(レコード同士)の間に高さがあるのかもしれません
    後ほど検証してみようと思いますが、取り掛かりまでしばらくかかりそうです(hatenaさんが素晴らしい回答をされているので甘えます)


    そもそも詳細セクションがいくつ並んでるかを求めるという話なので、詳細セクション合計の高さを詳細セクション個別の高さで割ればレコードの数になるはずです
    CurrentSectionTopはフォーム上端からの高さを返すのでヘッダー分を引かなければなりませんが、「レコード分に換算して引く」という手法がよくわかりません。単純にCurrentSectionTopからヘッダー分の高さを引けば詳細セクション合計の高さが残るはずです

    計算式は((ヘッダー + レコード数 * height) - ヘッダー) / heightとなり、そもそも小数点が出る計算がおかしいというのを焦点にしたかったんですが、結果は検証してみてですね

  • 14
    mae 2022/02/22 (火) 09:27:07 修正 >> 9

    hiroton 様
    考察していただきありがとうございます。
    hatena様のご回答により当初の目的は果たしたのですが、まだモヤモヤがぬぐい切れていないので私もhiroton様の考察をもとに検討させていただきます。

    恥ずかしながらリンク先のコードは世に出回っているものなので必ず正であるという固定概念があり、小数点が出る計算に対して「なぜ」という考えに至りませんでした。
    hiroton様のおっしゃる通り、求めたい値に対してなぜその計算をするのか理屈を考えながら進めていきたいと思います。

  • 15

    hiroton 様
    ヒントをもとに検証したところ、どんなヘッダ高さ、詳細高さでも安定して先頭レコードを表示することができました!

    詳細高さ = Me.Section("詳細").Height
    ヘッダ高さ = Me.Section("フォームヘッダー").Height
    現在レコード = Me.CurrentRecord
    curTop = Me.CurrentSectionTop
    先頭レコード = (詳細高さ * 現在レコード - (curTop - ヘッダ高さ)) / 詳細高さ
    まるめ = Int(先頭レコード + 0.5)
    

    リンク先のコードよりもシンプルかつ分かりやすいコードになったと思います。
    こちらで問題ないでしょうか??