If Dir(cstrTemplateDir & cstrTemplateBook) = "" Then
MsgBox cstrTemplateDir & cstrTemplateBook & "は存在しません"
End If
Dim xlBook As Object
'ワークシートをコピー
Set xlBook = .Workbooks(cstrTemplateBook)
xlBook.Worksheets("sheet1").Copy
Set xlBook = Nothing
'データ元のクエリを開く
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("qsel受注伝票")
'保存するファイル名のフルパスを組み立て
strSaveBookPath = cstrSaveBookDir & "受注伝票_" & Format$(lngOrderID, "00000") & ".xlsx"
この部分が変数にする(固定では困る)部分ですかね
例えば
Public Sub ExcelTemplateSample(queryName As String, fileName As String)
'データ元のクエリを開く
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(queryName)
'保存するファイル名のフルパスを組み立て
strSaveBookPath = cstrSaveBookDir & fileName & ".xlsx"
のように変更して
Sub test()
ExcelTemplateSample "qsel特別会員", "特別会員"
ExcelTemplateSample "qsel通常会員", "通常会員"
ExcelTemplateSample "qselビジター", "ビジター"
End Sub
そのエラーがでるフォームを使用していないなら、インポート対象から外して(チェックを外す)インポートしたらどうでしょうか。
やはり、勝手に再起動が起きます。
参照設定でまったく使用していない
Microsoft Excel 16.0 Object Library
をはずしてみます。
今、リフレッシュを実行しました。
すると、5、6個のフォームで
「レコードがありません」や「検索キーが・・・」
などのエラーメッセージがでて取り込めませんでした。
これらは、使用していないフォームです。
たぶん、これが原因だったのではないかと思います。
このまま使用して、意味不明の症状がでるようなら再度質問します。
返信ありがとうございます。
今、データ型の集計をすべて排除して、作業していたのですが、
中断中に変数の値を確認するためにマウスポイントを合わせている
最中に突然で再起動が起こりました。
チェック作業する前に必ず、上書保存をするようにしていますので
実害はありませんが、いったいどうなっているのか分かりません。
私には、大量のデータを扱っている以外に、思い当たる原因がありません。
何かアドバイスをお願いしたいです。
今作業中なので、後で、以前教えて頂いたリフレッシュをやってみようと思います。
https://hatenachips.blog.fc2.com/blog-entry-117.html
このページの記事以前見たことがありました。
レポートには使えないと思ってましたが使えるのですね。
新しいアドバイスありがとうございます。
エクセルでの印刷の件です。
せっかくアドバイス頂き誠に申し訳ないのですが、行のフィールドが実はまだあります。
棚番号・商品名だけの情報しかあげてませんでしたが、他に商品CD・JANCD・容量・入数などがあります。
これらの情報をエクセルで作ろうとすると行が横長になってしまい列がほとんど入りません。
エクセルでもできるのかも知れませんが現状まったくわからない状況でした。
アクセスなら自在に編集できるので問題ないのですが。
必要ないと思い情報を省略してました、すいませんでした。
お二人のアドバイスは正直難易度が高いです。
ただアイデアとしてはなんとなく分かるような気がします。
現状ですが、1~11・12~22・23~33・・・の店舗名のクエリをそれぞれ作ってクロス集計しようと思ってます。
レポートは以前試した下記のページのやり方でやってみようと思ってます。
http://www.ruriplus.com/msaccess/tch/tch_007.html
印刷して空白ページを印刷しないVBAで印刷されなければいいのですが。
あとはマクロで処理しようと考えてます。
空白ページが印刷される場合は失敗です。
説明不足だと思いますがこれでできたらいいのですが。
おそらくこの辺の処理をお二人のやり方でやれば早いのでしょうが文章を読んだ限りかなり難しそうな印象です。
時間はかかると思いますが調べながらお二人のやり方も試してみようとは思ってます。
データ型の集計は比較的最近追加されたものなので、安定しないのかもしれませんね。
同様のことはクエリの演算フィールドで可能ですので、私は使ったことがありません。
Access独自の機能なので、外のデータベースに移管するときの障害にもなりますので。
今、気が付いたのですが
当初のデータベースが破損しています。というエラーメッセージは
データ型の集計を排除したら起きなくなりました。
それで、これを使用すると不安定になるんだなと考え使用しないようにしていましたが
今見ると、簡単な引き算の集計がまだ残っていました。
これを排除して使用してみようと思います。
私がやるなら、VBAでクロス集計クエリの列名を固定したSQL(店名11列)をVBAで生成して、レポートのレコードソースにして出力を、店名を変更して繰り返すという方法を使います。
列名が変わるので、下記の方法を使用します。(レポートでも同じ方法が使えます。)
列名が変化するクロス集計クエリと連結するフォーム - hatena chips
それなりに難易度が高いのでエクセルへ出力する方法を提案しました。
hirotonさんのワークテーブルを使う方法も、VBAでレコードセットを操作する方法になれていないと難易度は高いです。
エクセルの方法は現状のクロス集計クエリをCopyFromRecordsetでエクセルに出力できたら、あとはエクセルの印刷設定だけなので比較的簡単かなと思い、提案しました。
手順としては、下記になります。
事前にExcelで見出しを固定して全ページに印刷!印刷タイトルの方法で見出しを固定したワークブックを作成しておく。標題などが必用であればそれも入力しておく。
VBAで上記のワークテーブルを開いて CopyFromRecordsetでクロス集計クエリのデータを指定位置に出力する。
シートを印刷する。
以上です。
どの辺で躓いていますか。
1ページずつ印刷の発想はなかったのでまったく考えてませんでした。
初心者には難易度が高そうな気がしますが少しずつ調べながら試してみます。
通常実際に印刷する枚数は多くても30ページぐらいですので処理のほうは問題ないと思います。
エクセルで加工して印刷も試したのですが思い通りにはいってなかったので助かります。
また何かありましたら質問させていただきます。
ありがとうございます。
書式は固定、各ページ11店舗でいいのなら、1グループ目はA店~K店、2グループ目はL店~V店・・・と11店舗ずつn回印刷処理をすればいいので出力する店舗リストをクエリで作ってVBAでレコードセット取得してループ処理すればできるんじゃないかな?
具体的には出力処理用の1列(店舗名)11行(列数分)のワークテーブルをつくってクロス集計するときに一対多で結合させれば最大11店舗分のデータになります。ループ処理でワークテーブルを1行目から書き換えていって11行目まで書き換えたら印刷実行、ワークテーブルのレコードは先頭にもどし、店舗リストは続けて最後までを繰り返せばうまくいくような気がします(最後のグループだけワークテーブルの直前の出力のゴミ処理も必要です)
現実的に500ページもの印刷に耐えられるかというと何とも言えないのとn回の処理に分けた方法なので、1つのレポートで表示させたいとかなると別な方法が必要ですが
Accessのテーブルです。
下記のようなテーブルを作成しておきます。
入力用に使うテーブルで、入力後、本テーブルに転記した後は、入力データは削除して空欄にしておきます。
別案についてですが、ワークテーブルとは作業するシートということで、EXCELで入力して
ACCESSにインポートするということですか?
サブフォームコントロールを複数配置してレイアウトを工夫するという方法があります。
下記にサンプルがあるので参考にしてください。
連結入力フォームのレイアウトを自由に設計したい - hatena chips
別案
最初の画像のような形のワークテーブルを作成しておいて、入力フォームはこのテーブルをレコードソースとして作成。
入力後、VBAで本来のテーブルの形に変換して出力する。
Accessだけでは難しそうですね。
教えていただいたサイトを参考にエクセルも使いながら作ってみます。
また分からないことがあれば質問させていただきます。
ありがとうございました。
画像では、1ページ当たり、店舗数11、行数17,ですので、
横に19ページ分(200/11)、縦に30ページ分(500/17)必要ということになります。
19×30で570ページ分、これはちょっと現実的ではないかなと、特に横に19ページ分というのは難しそうです。
レポートの最大幅は55.87cmですので。空白ページの処理も面倒そう。
エクセルを利用するのも可なら、エクセルに出力する方法の方が簡単かも知れません。
CopyFromRecordsetメソッドを使えばクエリデータをエクセルのシートの指定箇所に一気に出力できます。
■T'sWare Access Tips #686 ~レコードセットの内容をそのままExcelのシートに出力する方法~
タイトル行、タイトル列の各ページ固定出力は下記を参考に。
Excelで見出しを固定して全ページに印刷!印刷タイトル
店舗数は最大で200、行数は最大で500ほどあれば十分です。
実際は1店舗1行だけのときもあります。
列を動的に作ろうと試したのは下記のサイトを参考にしました。
http://www.ruriplus.com/msaccess/tch/tch_007.html
空白ページを印刷しないVBAを調べたのですが分かりませんでした。
実際に出力する店舗数はどのぐらいになりますか。(10000すべて印刷する訳ではないですよね。)
また行数もどのくらいになりますか。
これは具体的にどのようにしましたか。
hirotonさん、情報ありがとうございます。
勉強になりました。
Accessの場合、作りこめばできないこともないですが、かなりの工数が必要ですね。
また、ファイル破損の可能性もつきまといます。定期的なバックアップをとっていても、直近のバックアップ以降に発行した請求データは復元できません。
その辺を考慮すると印刷(送付用)とPDF出力(控え)を同時にするという運用がいいのかなと思っています。手軽な割に有用性が高いと思います。自分の作成したシステムはそのようにしています。
懇意の会計士さんとしっかり相談されるのが一番でしょう
とはいえせっかくなので適当にWeb検索してみました
インボイス制度に関するQ&A目次一覧(国税庁)
問51~に電子データに関する内容がありますね(更新で変わってるかもしれません)
決定的なこととして「所轄税務署長の承認」を受けること
ざっくりとしたことで「わかりやすいマニュアルがあること」
ずばり記述されてるシステム要件であれば
等記述がありますね。続くQAにもシステムの要件に関わりそうな記述があります。データの保存部分で言うとデータベース的な保存でもいいけど、発行したものは「修正できない」か「修正した記録がすべて残る」システムである必要があるようです
できることなら両方でやって損はないということですね
少しACCESSからはずれてしまいますが、今からシステムをつくるにあたり、対応していたほうがよいと思うので質問させてください
インボイス制度が開始されると請求書を発行した側にも保存義務があるそうです
ご指摘の通りデータベースの利点として再発行が容易、というのはありますが
そのような運用ですと、請求書を保存していることにはならなくなり、義務違反となってしまうのでしょうか?
何を持って請求書の控えとするか、という問題になりそうですが、データベースから持ってきてレポートを作成して同じものを出力できても
データベースから作成したものは控えではない、とかいわれそうな気もします
業務の要件次第かと。
請求書だと、客先に送るものと、手元に控え(コピー)を保存しておく必要がある場合は、2枚印刷するのは用紙の無駄なので、
印刷するときに、プリンター出力とPDF出力を同時にすることがあります。
出力先は、下記のリンク先の方法で変更できます。
■T'sWare Access Tips #287 ~特定のプリンタでレポートを印刷する~
レポート用にプリンターを選択するプロセスを自動化する | Microsoft Docs
データベースにデータがあるので再発行は簡単にできますが、
トラブルがあったときにデータベースのデータだと簡単に編集ができるので、
控えとして有効性が低いです。
ファイル自体が悪さをしているというのはあまり経験がありません。コード自体は単純な処理なので、パス、ファイル名の作り方や単純なタイプミスをまず疑ってしまいます
コピー処理の前後を次のようにするとどうなりますか?
ありがとうございました。
通貨型の使い方を理解していなかったです。
回答ありがとうございます。
ファイルの件提示してい頂いた内容をもとに考えてみたいと思います。
ありがとうございました。
エラーの件ですが、
こちらに書き換えたところエラーが移り変わりました。
次はこれにエラーが出て、実行時エラー9「インデックスが有効範囲にありません」と出ます、、
やはりファイルが悪さしてるのでしょうか?
ちなみにシート名も間違いがないようコピーして貼り付けています、、
考え方として、3つファイルを出力したいのなら3回出力処理をすればいいですよ。という内容ですね(質問がざっくりだったので)
「種別」が決め打ちできる程度なら決め打ちで作成してもいいですし、出力内容を自動認識させたいならそれはそれでやり方もあります。参考コードだけでやり取りするのは齟齬の元なのでまずは1ファイルでもいいので出力できるコードができてからですね
エラーが出ている部分は特別な処理をしていないよくあるEXCELファイルを開くだけなので原因はよくわかりません
のように直接記述すると動作しますか?
として、エラーが出る直前で
cstrTemplateDir & cstrTemplateBook
の内容を確認すると実際に存在するファイルパスになっていますか?回答いただきありがとうございます。
こちらですが、特別会員、通常会員、ビジターの3つのクエリを作成するということでしょうか?
また、質問で提示したURL先のコードですが実行するとエラーが出てしまいました。
ここで指定したファイルパスが間違っていると出ます。
実行時エラーは1004です。
しかし、確かにここに格納されていますし、Shift+右クリックでパスのコピーをしてそのまま貼り付けています。
そしてデバッグを押すと、
ここが黄色くなります。
原因が分からず困っています・・・
もしこの原因がわかるようでしたら教えて頂けるとありがたいです。
重ねての質問になり申し訳ありません。
元の質問にも追記しました。
「pdfで保存する」とは、印刷物をスキャナか何かで再データ化するという意味ですか?
印刷後に何か手を加えて、それの重要度が高いのであればそうする必要があるかもしれませんが「システム」から全く同じものが発行できるのであれば必要になったときにそれをPDFで出力すればいいと思いますよ
これができるのがデータベースのメリットであり、そうやって管理をしよう効率化しようというのが「データベース化」です。
データベースの条件ではないですがやらない理由はないデータベース化の本質だと思いますよ
質問がざっくりなので回答もざっくりになりますが
「共通部分はひとまとめに、処理を変えたいところは変数にしてプログラム内で任意に変更できるように」します
リンク先のコードを参考にするなら
この部分が変数にする(固定では困る)部分ですかね
例えば
のように変更して
と、出力処理を3回実行してやればファイルを3つ作ることができます
「浮動小数点数 誤差」でWEB検索してみてください。正確な計算をおこないたいときは、使えないものだと分かるでしょう。
また、変数はきちんと型を指定して宣言しましょう。型宣言無しに小数を代入すると浮動小数点数になります。
小数点4桁までなら、通貨型を使うと誤差のない計算ができます。
hatena様
ご回答有難うございます。
データを確認した所、ご指摘の通りで
売上実績データにはユニークデータしか存在しませんでしたが、
他資料1.2には重複データがあり、
クエリで吐き出された2行の重複データも存在しました。
売上実績データがベース資料なので、これだけユニークになっていれば問題ないものだと思っていましたが、
他資料1.2もユニークデータしないと正しく表示されないということですね!
全てのデータがユニークでないといけないのですかね。
根本的に考え方が間違っていたようです、、有難うございます。
クエリで結合して件数が増える場合は、たいてい、一対多の関係になっていないのが原因ですね。多対多の関係になっているということです。
結合するフィールドの片方は、主キーか重複のないインデックスが設定されていますか。この辺のテーブル設計をきちんとしないとデータベースとしては使えないデータになってしまいます。
Requeryは全レコードの再読み込みですので、先頭に戻ります。
帳票フォームのカレントレコードを詳細フォームで更新したのなら、カレントレコードの更新のみ反映させればいいので、その場合は、Refresh を使うといいでしょう。これなら、先頭に戻ることはないです。
Requeryは複数レコードを更新してそれを一気に反映させたい場合に使えばいいでしょう。
メイン-サブ形式で単純にやるなら、親フォームの枠いっぱいにサブフォームを置いてしまうのが楽だと思います。親フォームはただの外枠扱いですね
案件毎ということはボタンがたくさん並んでいると思います。これをメインとサブに分けて同期してスクロールさせるのは現実的ではありません。上記方法のように親フォームを外枠扱いとするか、「詳細ボタン」はメインに一つにして、選択中の案件が分かりやすいようにサブフォームは選択中の行の背景色を変えるような仕組みにするかですかね
ご回答ありがとうございます。
そんな方法があるんですね。
今、帳票1案件毎に左に詳細フォームに飛ぶボタンがあるのですが、ここはメインに残しておいて、その他の部分をサブにして埋め込むイメージでしょうか・・?
(イメージがわいておらずスミマセン)
フォームに対してrequeryした場合にリストが再読み込みされて先頭に戻ってしまうのは仕様ですね
requery前にスクロール状態を保存して再度スクロール位置を調整する(面倒)か、メイン-サブフォーム形式にしてサブフォームコントロールをrequeryするのがセオリーでしょうか
MS明朝とMSゴシックが多いでしょうね。
最近のWindowsだと游ゴシックと游明朝が標準になってますね。
他にもいろいろ最初から入ってますので、その中からいいのをさがせばいいでしょう。
私は印刷物にそこまで拘りがないので、MS明朝とMSゴシックを使ってます。
普通はMSゴシックを使うものですか?
なんだか印刷しても汚い気がするんですよね
OSにインストールするしかないと思います。
回答ありがとうございます。
今手元にファイルがないため確認出来ないのですが、御指摘の手順も実行してみようと思います。
そのような経験はないですね。
もう一度、新規に①のクエリを作成、「B」を削除、「実行」としてみても同じ現象が再現しますか。