Option Compare Database
Option Explicit
Private Ruikei As Long
Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
Ruikei = 0
End Sub
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If FormatCount = 1 Then Ruikei = Ruikei + Me!積載
Me!累計 = Ruikei
If Ruikei > 400000000 Then
Me!改ページ.Visible = True
Else
Me!改ページ.Visible = False
End If
MsgBox "Finish"
End Sub
Option Compare Database
Option Explicit
Private Ruikei As Long
Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
Ruikei = 0
End Sub
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If FormatCount = 1 Then Ruikei = Ruikei + %%{fg:red}Me!積載%%
Me!累計 = Ruikei
If Ruikei > 400000000 Then
Me!改ページ.Visible = True
Else
Me!改ページ.Visible = False
End If
End Sub
Option Compare Database
Option Explicit
Private Ruikei As Long
Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
Ruikei = 0
End Sub
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If FormatCount = 1 Then Ruikei = Ruikei + Me!積載
Me!累計 = Ruikei
If Ruikei > 400000000 Then
Me!改ページ.Visible = True
Else
Me!改ページ.Visible = False
End If
End Sub
■DoCmdエクスポートのコードです~シート3のみが保存されてシート1・2は消えてしまいました。
Function エクセルへエクスポート()
Dim strSaveBookPath As String
Dim xls As Object
'テンプレートの保存先フォルダ
Const cstrTemplateDir As String = "\SV30**\metal2*課\HDD\リフォーム見積りDB\見積書\"
'テンプレートのファイル名
Const cstrTemplateBook As String = "RF見積書.xlsx"
'データが代入されたファイルの保存先フォルダ
Const cstrSaveBookDir As String = "\SV30\metal*2****課\HDD\リフォーム見積りDB\見積書\"
On Error GoTo エクセルへエクスポート_Err
'Excelオブジェクトを生成
Set xls = CreateObject("Excel.Application")
With xls
'画面の再描画を抑止
.ScreenUpdating = False
'テンプレートファイルを開く
.Workbooks.Open cstrTemplateDir & cstrTemplateBook
レポートを修正したら実行ができました!
しかし、オーバーフローしましたと最後にエラーが表示されます。
下記の行でエラーになっているようです。
If FormatCount = 1 Then Ruikei = Ruikei + Me!積載
エラーメッセージと、どの行でエラーになっているか教えてください。
迅速なご回答ありがとうございます。
試みてみましたが、依然としてエラーが表示されました。
何度もご対応いただき申し訳ございません。
Me!積載
でエラーになるということですね。レポート上にテキストボックスを配置してコントロールソースを「積載」、可視を「いいえ」に設定してください。
レポートでVBAからフィールドを参照する場合、レポート上にそのフィールドを参照するコントロールが必要という仕様があります。
上記で正しく表示されなかったため、訂正します。
コチラでエラーが表示されます。
「Meキーワードの使用方法が不正です」
レポートで累計値を表示して、累計値が400000000を超えたら、改ページして、かつ、累計値をリセットして(0にして)、再度累計していく。2023/05/23 (火) 20:59:21 の回答に例示したサンプルのようにしたい。ということで間違いないですか。
➡間違いございません。ご確認ありがとうございます。
2023/05/24のコードで実行したところ、下記の赤文字の部分で
「Meキーワードの使用方法が不正です」といったエラーが表示されました。
どうすれば解消できますでしょうか。
もう、一度確認しますが、やりたいことは、
レポートで累計値を表示して、累計値が400000000を超えたら、改ページして、かつ、累計値をリセットして(0にして)、再度累計していく。
2023/05/23 (火) 20:59:21 の回答に例示したサンプルのようにしたい。
ということで間違いないですか。
だとしたら、
https://hatenachips.blog.fc2.com/blog-entry-443.html
で紹介した方法はテーブルのフィールドに累計値を出力する方法ですので、今回のご希望とは合致しないと思います。
2023/05/24 (水) 10:01:52 で紹介した方法でできるはずですので、確認してください。
ただし、グループ毎の累計ということは考慮してなかったのでグループヘッダーのフォーマット時で累計値の変数(Ruikei)をリセットするコードを追加してください。
ご回答いただき、誠にありがとうございます。
大変申し訳ありません。私の理解不足でvbaによる累計算出ができませんでした。
以下のURLを参考に作成しましたが、うまくいきませんでした。
https://hatenachips.blog.fc2.com/blog-entry-443.html
https://okwave.jp/qa/q9018234.html
Q. グループ化させず累計を算出する場合、下記の〇△◇には何を入れるべきでしょうか。
If SetCumulativeTotal("数値","累計表示フィールド名","テーブル名","〇◎","△▽,◇◆") Then
MsgBox "完了"
End If
3番目の画像の黄色反転しているコードのところで、1番目、2番目のエラーがでるということでしょうか。
「M_店舗」というテーブルはローカルテーブルでしょうか。
どちらにしても、まずは「データベースの分割」を実行することをお勧めします。
リンクテーブルマネージャーは空欄で何も表示されてません。
そのMDBにはリンクテーブルが含まれますか。
また、リンクテーブルのMDBも同じNASに存在しますか。
だとしたら、リンクテーブルのリンク先も NASのネットワークパスに変更してください。
ただし、運用法としてはこのような運用は推奨されません。
データベースファイルの破損の確率が高くなります。
データベースをフロントエンドとバックエンドに分割して運用する方法をお勧めします。詳細は下記のリンク先を参照ください。
Access データベースを分割する - Microsoft サポート
ACCESS データベースを分割して複数人で共有する方法 - たすけてACCESS
改ページするタイミング(400000000を超えた時点)で累計をリセットするということですね。
「集計実行」の設定では、そのようなことは不可能ですので、累計はVBAで加算していって表示させるという方法にする必要があります。
VBAで累計値を表示させる場合は、レポートのイベントの発生メカニズムを理解していないと、想定通りにならない場合がありますので注意が必要です。
説明すると長くなるので、下記のリンク先を参照して理解するようにしてください。
レポートのイベントの発生メカニズムの研究 - hatena chips
レポートのイベントの発生メカニズムの研究 その2 - hatena chips
ありがとうございます。ご推察の通りです。
私の方でもネットで調べて作成してみますが、
こういったやり方があるなどございましたら、
ご教示いただけますと幸いです。よろしくお願いいたします。
累計が 400000000 を超えた時点で、リセット(0に戻す)して、加算していくという意味でしょうか。
例えば、すべてのレコードが100000000として、
100000000
200000000
300000000
400000000
(改ページ)
100000000
200000000
300000000
400000000
というようなイメージですか。
もし、違うなら、上記のように具体例を出して説明してもらえますか。
ありがとうございます!!できました。
大変助かりました!!
False ではなく True でした。失礼。
テキストボックス内のテキストがダブルクリックされた際の挙動として、
ダブルクリックされた位置にある単語が自動的に範囲選択されます。
それが DblClick イベントの後に実行されるため。
DblClick イベントの引数 Cancel に False を渡せばよいでしょう。
の部分は転記ミスしてました。
「累計」テキストボックスのコントロールソース・集計実行設定は以下となっています。
コントロールソース:クエリに記載されている「積載」データ
集計実行設定:「グループ全体」
累計値はレポートビューで確認できていますので、問題ないと思われます。
だとしたら、そのコードでは、累計が400000000を超えた時点で毎レコード改行されることになりますが、それは想定通りですか。
⇒可能であれば改ページした際に再度累計を実行したいと考えております。
400000000を越えた時点で改ページを繰り返していくイメージが理想です。
の部分は転記ミスですか。
また、
「累計」テキストボックスのコントロールソース、集計実行の設定はどうなってますか。
累計値が表示されるような設定になっているのですか。
だとしたら、そのコードでは、累計が400000000を超えた時点で毎レコード改行されることになりますが、それは想定通りですか。
たいてい .Value は既定のプロパティなので省略できるはずです。
ただし、.Value がないコントロールなどは当然エラーになりますが。
お世話様です。ご教示を有難うございました。
VBAで多少不詳の所が有りますが、トライしてみます。
種々、大変に有難うございました。
お二方ともありがとうございます。さすがです。
早速やってみたいと思います!
すみません、色々試してみるとエラーの再現がなくなりました。きっと別な間違いだったと思います。
因みにこの.Valueは省略しても通常エラーがでることはないでしょうか?
うまくいかないとは、具体的にどのようにうまくいかないのでしょうか。
エラーが出るということなら、そのエラーメッセージを提示してください。
最初の質問とは異なる現象ですね。当方で実験した限りでは、すでに同名シートがある場合は上書きされました。
どちらにしても、DoCmd.TransferSpreadsheetを使うなら、設計としては下記のようになるかと思います。
テンプレートには、Sheet1、Sheet2、Sheet3 は持たせない。
テンプレートを複製して、そのファイルにクエリをエクスポートする。
テンプレートファイル側で、エクスポートされたシートからテンプレートシートにデータを転記する(Access VBAでエクセルファイルを操作する方法でもOK)。
エクスポートするクエリはパラメータークエリにして、パラメータはフォームのテキストボックスを参照するようにして、テキストボックスに条件値を入力してから、DoCmd.TransferSpreadsheetを実行すれば、条件値で絞り込まれたデータがエクスポートされます。
お世話様です。お手数を掛けます。
ご教示を有難うございます。
上記のテストコードで動かすと、エクセルに元々あるシート1~3には書き込みがされず、同じブック内に新たにシート11/21/31と言うシートを作って、その3つのシートに3つのクエリのデータが一つづつ書込まれます。
これは既にテストをしておりましたが、見積りが多くなって毎回すべてのデータが書込まれると大変なため、このコードに指定した見積りNOのデータのみをエクスポートするコードが無いか調べましたが、ヒントとなるコードでエクスポートするとシート3のみだけ指定見積りNOのデータがエクスポートされましたが、シート1と2は残りませんでした。これ以外は見つからないためにDAOでエクスポートする方策を検討していました。
もし、テストコードに指定する見積りNOのデータのみエクスポートするコードが有ればご教示ください。
様々にお世話になりますが、よろしくお願いします。
hiroton様
返信が遅れて申し訳ありません。
ご丁寧にありがとうございました。
このように想定通りに動作しない場合、原因を探るには、なるべく単純化したコードで一つずつ、動作を確認していき、とこで異常が発生するかを特定するというようなデバッグ作業をするようにします。
その場合、エラートラップのコードはコメントアウトしておきます。そうしないと、エラーが出てもどこででているか特定できないので。
とりあえず下記のコードを実行して、見積書.xlsxファイルを開いて、Sheet1, Sheet2, Sheet3 にそれぞれのクエリのデータが出力されているか、確認してください。
ご回答ありがとうございます。
小数点の方は出来ました。 計算式の方もやってみます。
お世話様です。書き込みを有難うございます。
転記したときの誤りの様で、実際のファイルパスは全て同じです。
よろしくお願いします。
質問が混在してますが、とりあえず、最初の質問の
についてのみ。
該当するコードは下記の部分だと思いますが、
エクスボート先のファイルパスがそれぞれ異なりますが、これは、コードを転記したときに転記ミスですか。
実際のパス名は3つとも同じになってますか。
「書式」プロパティで設定すればいいのでは。
あるいは、「小数点以下表示桁数」プロパティ。
これでわからなければ、もう少し状況を説明してください。
テーブルのフィールドのデータ型、書式、などの設定
どこにどのように表示したときにそうなるのか。
できます。
できないなら、どこでどのような計算式を設定して、それをどこで使うのか、説明してください。
hirotonさん 丁寧な回答ありがとうございました。
大変参考になりました。奥が深いものですね。
Form.Load イベント (Access)
hirotonさん ありがとうございました。
その設定をするとフォームのプロパティシートにはID=***は残ったままですが動作は正常となりました。
因みにですがフォーム開く時、読み込み時のタイミングには大きな違いがあるものでしょうか?(初歩的な事ですみません)
読み込み時にフィルターを適用プロパティをいいえにして保存します
私も、hirotonさんの回答と同様のVBSファイルで起動用ファイルを作成するという方法を利用してます。
ちょっと古い記事ですが、下記でコードを紹介してますのでご参考に。
Accessのバージョンによっては手直しが必要かもしれませんが。
複数ユーザーで共有している場合のフロントエンドファイルのバージョンアップ - hatena chips
【追記】
DoCmd.Trnasferは見積りNOでフィルターが掛けられず、全てのデータが出てくるので、これにフィルターが掛けられればこちらのほうが簡単です。
よろしくお願いします。
バージョン管理をします
メインのファイルはバージョンごとにファイル名を変えます。単純なのは「〇〇システム_20230517.ACCDE」等後ろに日付をつける程度でいいでしょう
バージョン管理テーブルを作成します
メインのファイルを更新するごとにそのファイル名を記録していきます
起動用ファイルを作成します
バージョン管理テーブルから最新の情報を取得してそのファイルを開きます
(メインのファイルでもバージョン管理テーブルを参照するようにすれば、使用中のシステムが最新かどうかを知ることができるでしょう)
起動用ファイルはメインのファイルを実行するだけで、画面を表示する必要はないのでVBSファイルで作ってしまうなんてのもありだと思います
■DoCmdエクスポートのコードです~シート3のみが保存されてシート1・2は消えてしまいました。
Function エクセルへエクスポート()
Dim strSaveBookPath As String
Dim xls As Object
'テンプレートの保存先フォルダ
Const cstrTemplateDir As String = "\SV30**\metal2*課\HDD\リフォーム見積りDB\見積書\"
'テンプレートのファイル名
Const cstrTemplateBook As String = "RF見積書.xlsx"
'データが代入されたファイルの保存先フォルダ
Const cstrSaveBookDir As String = "\SV30\metal*2****課\HDD\リフォーム見積りDB\見積書\"
On Error GoTo エクセルへエクスポート_Err
'Excelオブジェクトを生成
Set xls = CreateObject("Excel.Application")
With xls
'画面の再描画を抑止
.ScreenUpdating = False
'テンプレートファイルを開く
.Workbooks.Open cstrTemplateDir & cstrTemplateBook
On Error GoTo エクセルへエクスポート_Err
DoCmd.TransferSpreadsheet acExport, 10, "Q_見積明細1_P", "\SV30**\metal2*課\HDD\リフォーム見積りDB\見積書.xlsx", True, "Sheet1"
DoCmd.TransferSpreadsheet acExport, 10, "Q_明細2_R", "\SV30\metal*2*課\HDD\リフォーム見積りDB\見積書.xlsx", True, "Sheet2"
DoCmd.TransferSpreadsheet acExport, 10, "Q_明細3_R", "\SV30\metal*2****課\HDD\リフォーム見積りDB\見積書.xlsx", True, "Sheet3"
'保存するファイル名のフルパスを組み立て
.strSaveBookPath = cstrSaveBookDir & "見積書_" & Format$(Forms!F_見積!物件名) & ".xlsx"
'同名ファイルを強制削除
On Error Resume Next
Kill strSaveBookPath
On Error GoTo 0
'画面の再描画を元に戻す
.ScreenUpdating = True
'データを代入したブックを保存
.ActiveWorkbook.SaveAs strSaveBookPath
MsgBox "データを保存しました"
'Excelを終了
.Quit
End With
Set xls = Nothing
エクセルへエクスポート_Exit:
Exit Function
エクセルへエクスポート_Err:
MsgBox Error$
Resume エクセルへエクスポート_Exit
End Function