りんご様のお察しの通り、SQLを上書きするコードを組み込んでおりました。
これは別箇所で条件を書き加えたいケースに対応するために入れたものでした。
以下クラスのファンクション抜粋(変数宣言略)
====================
【1】
Public Sub SetQuery(ByVal strQue As String)
Set qf = CurrentDb.QueryDefs(strQue)
' クエリSQL取得(元)
baseSQL = qf.sql
End Sub
【2】
Public Sub Execute()
' クエリ実行
qf.Execute
' SQL文を元に戻す
If Not 別モジュール.IsNullOrEmpty(baseSQL) Then
qf.sql = baseSQL
End If
I have an issue with my VBA code. I tried to use Where condition in a OpenReport to filter in my table all my mice alives.
The code I used:
DoCmd.OpenReport "E_G_Mouse", acViewReport,, [...
Dim curHeight As Long
Dim curTop As Long
Dim oldHeight As Long
Dim oldCurTop As Long
curHeight = IIf(Me.Section(acHeader).Visible, Me.Section(acHeader).Height, 0)
curTop = 0
oldHeight = curHeight
oldCurTop = 0
Debug.Print curTop; curHeight
Me.AllowAdditions = True
DoCmd.GoToRecord , , acFirst
Do Until Me.NewRecord
curHeight = Me.Section(acDetail).Height
curTop = Me.CurrentSectionTop
Debug.Print curTop; curHeight; curTop - oldCurTop; curTop - oldCurTop - oldHeight
oldHeight = curHeight
oldCurTop = curTop
If Me.NewRecord Then Exit Do
DoCmd.GoToRecord , , acNext
Loop
hirotonさんが言われるように、ページフッタで代用するということになりますね。
何を表示させたいのか不明ですが、
例えば、グループ集計を表示させたいなら、
グルーブヘッダー(またはグループフッタ)に下記のテキストボックスを配置しておきます。
コントロールソース =Sum([数量])
名前 数量計
ページフッターにテキストボックスを配置してコントロールソースで集計テキストボックスを参照します。
コントロールソース =[数量計]
数量は実際のフィールド名にしてください。
基本的には無理です。ページフッターを使ってそれっぽくするのが限界でしょう
レポート出力の仕組みにあるのは、「印刷領域が無くなったら次のページに移る」です
新しいページに移ったときは印刷領域が十分にあるのでヘッダーの『セクション繰り返し』は常に問題なく実行できますが、「印刷領域が無くなったら次のページに移る」のタイミングではグループフッターを配置するスペースはすでにありません
なので、グループフッターに『セクション繰り返し』はありません
取り敢えず、qf.sqlやbaseSQLやその他SQLの中身が期待通りになっているか、要所要所で再度チェックしておくのはどうでしょう。例えば。
hirotonさん
コメントありがとうございます。恐れ入ります。
運用について、
<エラー発現状況>の2にある社内共有フォルダが
開発者ではアクセス権がない部署内フォルダのため、
試用期間の今は開発者から確認者1へメール送付したACCESSを
確認者1と確認者2が確認してくださっている状況なのですが、
本動作不具合解消後の本運用移行はその社内共有フォルダに
アクセスできる確認者1と確認者2が共有使用する形となります。
現在同ACCESSの別作業のため単一ACCESSで色々しておりますが、
ACCESSを共有する以上壊れる可能性が高いため、
最終的には分割化してバッチでフロントをコピー・起動したものを
各ユーザーに操作してもらう形を視野に入れております。
謎の現象が謎のままなのは歯がゆいですが
そもそもメールでACCESSファイルを盥回しにする?という運用は改善できないんでしょうか?(あまりいい運用方法とは思えません)
りんご様
コメントありがとうございます…!
りんご様のお察しの通り、SQLを上書きするコードを組み込んでおりました。
これは別箇所で条件を書き加えたいケースに対応するために入れたものでした。
以下クラスのファンクション抜粋(変数宣言略)
====================
【1】
Public Sub SetQuery(ByVal strQue As String)
Set qf = CurrentDb.QueryDefs(strQue)
' クエリSQL取得(元)
baseSQL = qf.sql
End Sub
【2】
Public Sub Execute()
' クエリ実行
qf.Execute
' SQL文を元に戻す
If Not 別モジュール.IsNullOrEmpty(baseSQL) Then
qf.sql = baseSQL
End If
End Sub
【3】
Public Sub ObjClose()
Set qf = Nothing: Close
baseSQL = ""
End Sub
====================
baseSQLはString型で、元のSQL文は3652文字です。
開発者→確認者1→確認者1(続けてもう一度)と
開発者→確認者2→確認者2(続けてもう一度)のケースは
上手くいくとの報告でした。
両確認者の方が丁度予定が多忙となっており、
昨日から同環境での検証が進んでおらず非常に歯がゆいです。
検証のアドバイスを頂いている中、恐縮です。
ここの法則性がいまいち分かりません。
例えば上記のような区分テーブルを見て識別しているのでしょうか?
テーブルをまとめないの?
hiroton様
とんでもございません。
コメント・ご指摘いただけるだけでも非常にありがたく思います。
コメントくださりありがとうございます。
ACCESS終了時はプロセスの終了を確認してもらっています。
EXCEL出力機能を使わないでファイルを回した場合については、
先日一度、手順4の後、確認者2が別機能を使用時
同様の現象が起こったことがありました。
(1)両確認者とも別機能使用した場合についてと、
(2)新規にACCESSファイルを作成し、オブジェクトをすべてインポートした場合
については、未検証のため両確認者の都合がつき次第検証したい所存です。
当質問お目通し下さりありがとうございます。
りんご様
至らぬ質問にお言葉下さり、ありがとうございます。
自動最適化設定について、OFF/ONどちらも試してみたのですが、
同様の現象となってしまいます。
また、ACCESSは現状、単一ファイルで使用しております。
ご助言いただいたとおり、追加情報についても追記2で記載したいと思います。
お目通しくださりありがとうございます。
現象を知っているわけではありません。
「完全終了」はタスクマネージャーにプロセスが残っていないのも確認していますか?
新規にACCESSファイルを作成し、オブジェクトをすべてインポートしてみるとどうですか?
EXCEL出力機能を使わないでファイルを回した場合は正常に動作していますか?
仕事で困ってます。
よろしくお願いします
当て推量ですが、自動最適化をOFFにするとどうなりますか?
追加情報があると、回答がつき易いかもしれません。フロントエンドとバックエンドに分割していますか?
先ほど、お教えいただいた、
サンプルシステムを再度いじっていて
Opt月のありかが分かりました。
ちょっと前に進めそうな気がしました。
ありがとうございます。
返事が遅れてすみません。
Accsessをいじれない曜日があるので。
サンプルが素晴らしかったので、
本当に搭載したいです。
>> 30
業者に依頼したり、カレンダーアプリを探したりするほうが、幸せになれると思いますよ?
時刻9:00
案件1
担当者A
時刻17:00
案件2
担当者A
例えば、2分割、オブジェクトを2つ作成。
時刻9:00
案件1
担当者A
時刻17:00
案件2
担当者A
例えば、6分割、オブジェクトを6つ作成。
たぶん、こんな感じではないかと思います。
(日付別)予定番号と案件の条件をテーブルに作成。
※オブジェクトの数を超えて表示出来ないので、1日に何件までと上限を設ける事になりそう。
今回の件は課員からの要望が多いので形にさせてください。よろしくお願いいたします。
Hatena様
色々調べているのですが、分割が解らす困っています。
ラベルを改行前に細工をする感じになりますか?
もう少しヒントいただけたら幸いです。
ありがとうございます。
レポートの幅には制限かあります。(最大約55cm)
レポートの自動生成だと表形式(フィールドが横並び)なので、横に配置できるコントロール数には当然制限があります。
レポートウィザードで表形式以外で作成するか、それが希望のレイアウトでなければ、ウィザードは使わずにデザインビューで自分でレイアウトしてください。
ありがとうございます!できました!感謝です!
提示のテーブル名を「T_売上」と仮定して回答します。
下記のテーブルを作成してください。
テーブル名「T_連番」
フィールド 連番 数値型
下記のように連番を入力します。
SQLビューに下記のSQLを記述します。
上記のクエリの出力結果
解決ですね、おめでとう。
別の質問を立てたらどうでしょう。具体的なエラーメッセージを添えて。
お世話になっております。
サンプルを解凍した時は、
きっちり動いています。
搭載しようとすると
エラーに。うまく応用できないみたいです。
サンプルファイルを解凍して、そのまま実行した場合もエラーになりますか。
お返事が遅くなってすみません。
サンプルのデーターを
自分のシステムに置き換えているという感じです。
できました!
三日三晩悩んでいました。やっと安らかに眠れます。
本当にどうもありがとうございました!
ありがとうございます!参考にさせていただきます。
ちゃんと読んでませんが
となるならパラメータ要求されて当然です
仕入先コードが文字列なら
"[仕入先コード]=" & rs!仕入先コード
↓
"[仕入先コード]='" & rs!仕入先コード & "'"
とする必要があります
手入力でうまくいく場合のWHERE句を確認してみてください
ググっただけですが、参考になれば幸いです。
hiroton 様
非常に細かくCurrentSectionTopの仕組みまで分析していただきありがとうございます。
15単位で四捨五入され、解像度の話まで発展するとは想像すらしませんでした‥
正確なdpiの取得をしないと成り立たない繊細な動作をしたいわけではなく、
また CurrentSectionTop を取得する際は必ずカレントレコードが表示エリア内に存在している作りにはなっているので
15単位で補正するやり方でいきたいと思います。
(単純にwindows apiを使った手法が一番とは思いますが…)
accessは奥が深いですね。まだまだ勉強不足を痛感させられます。
hatena様 hiroton様 この度はご教授いただきありがとうございました。大変助かりました。
助かりました。大変ありがとうございました。
この方法の問題点
dpiによって結果が変わる
ほぼ決め打ちでも問題ないところですが、正確を期すならdpiの取得が必要です。そこまでするとACCESSの埒外になってしまいます・・・
または、実際にレコードを移動させてCurrentSectionTopを取得し、差を吸収するような仕組み(表示上の詳細セクションの高さを求める仕組み)が必要でしょう
>> 15の回避策は大雑把ながら見どころの有る方法だと思います
96dpi(1Pixel=15Twip)の場合のずれは±7で20レコードあれば最大140Twipずれる可能性があるということになります。このとき、詳細セクションの高さが300Twip程度あれば140Twipずれても四捨五入で欲しいレコードの位置を求めることができます
Macのdpiは72だそうです(古い情報ですが)。この場合同様に考えるとずれは最大±10で20レコードだと200Twipずれる可能性があり、高さが300Twipの場合、高さの半分以上の誤差がでるので四捨五入すると1レコード以上の差になってしまいます。しかしながら、この計算でも14レコードまでであれば正確なレコード数になります
限定された範囲では確からしいことが保証できるので
のような感じで対応してしまうのも無くはないかなと思います
カレントレコードが変わる
コード以前の問題ですが、CurrentSectionTopの仕様としてカレントレコードが表示エリア内に存在しないとちゃんとした数値が得られません。カレントレコードを変えたくない場合(編集中の場合・レコード移動時イベントを不用意に発生させたくない場合)や、またはカレントレコードを元に戻す手間などが問題になるかもしれません
windows apiを使った手法はこの問題に悩むことがないのもいいですね
どうやら
CurrentSectionTop
はセクションの高さに応じて補正が入るようです。今回得られた補正量は高さに応じてこれは、一見ばらばらのようですが「15」単位で四捨五入されています
ACCESSは各セクションの高さをTwipで保持していますが、画面の表示はPixel単位でなければなりません。windowsの標準dpiは96なので、Pixel単位(
1Pixel=15Twip
)で四捨五入されているわけですね>> 9のずれるパターンもこの計算を当てはめれば
正しく結果が得られます
以上のことから
のように、正しく補正を入れれば間違いのない答えが得られます
下記コードにて検証してみました
ヘッダー無し、詳細高さ1.575cmの場合
ヘッダー高さ0.975cm、詳細高さ1.575cmの場合
ヘッダー高さ0.6cm、詳細高さ1.575cmの場合
ヘッダー高さ0.801cm、詳細高さ1.575cmの場合
ヘッダー高さ0.6cm、詳細高さ2cmの場合
ヘッダー高さ0.801cm、詳細高さ2cmの場合
ヘッダー高さ0.801cm、詳細高さ0.801cmの場合
うーん、これは予想しない(困った)結果に・・・
Opt年 opt月 はオプショングループの名前です。
現状はどの状態でしょうか。
サンプルファイルのフォームを内容を確認している状況でしょうか。
サンプルファイルで実行するとエラーになるということですか。
左上の[ファイル]から →[オプション]→[文書校正]→[オートコレクトのオプション]→「2文字目を小文字にする」のチェックを外せば大文字のままになると思います。
お世話になっております。
ただいま設置中だったんですが、
Me.Opt年.Value = Year(Date)
Me.opt月.Value = Month(Date)
のあたりでエラーが出ます。
Opt年がサブフォームの名前までは
分かったんですが、
opt月はどこにあるのか?とか。
.Valueはなぜ、エラーになるのか?
とか、分からないことだらけです。
お手数かとは存じますが、
御指南宜しくお願い致します。