Microsoft Access 掲示板

views
4 フォロー
6,283 件中 3,921 から 3,960 までを表示しています。
6

今、リフレッシュを実行しました。
すると、5、6個のフォームで
「レコードがありません」や「検索キーが・・・」
などのエラーメッセージがでて取り込めませんでした。
これらは、使用していないフォームです。

そのエラーがでるフォームを使用していないなら、インポート対象から外して(チェックを外す)インポートしたらどうでしょうか。

5
hhmmj553 2021/03/17 (水) 04:06:37 19f3a@6b5ef

やはり、勝手に再起動が起きます。
参照設定でまったく使用していない
Microsoft Excel 16.0 Object Library
をはずしてみます。

4
hhmmj553 2021/03/17 (水) 02:20:21 19f3a@6b5ef

今、リフレッシュを実行しました。
すると、5、6個のフォームで
「レコードがありません」や「検索キーが・・・」
などのエラーメッセージがでて取り込めませんでした。
これらは、使用していないフォームです。
たぶん、これが原因だったのではないかと思います。
このまま使用して、意味不明の症状がでるようなら再度質問します。

3
hhmmj553 2021/03/16 (火) 19:40:18 19f3a@6b5ef

返信ありがとうございます。
今、データ型の集計をすべて排除して、作業していたのですが、
中断中に変数の値を確認するためにマウスポイントを合わせている
最中に突然で再起動が起こりました。

チェック作業する前に必ず、上書保存をするようにしていますので
実害はありませんが、いったいどうなっているのか分かりません。

私には、大量のデータを扱っている以外に、思い当たる原因がありません。
何かアドバイスをお願いしたいです。

今作業中なので、後で、以前教えて頂いたリフレッシュをやってみようと思います。

8
もんぞう 2021/03/16 (火) 19:10:27 62ea7@f778d

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で印刷されなければいいのですが。
あとはマクロで処理しようと考えてます。
空白ページが印刷される場合は失敗です。
説明不足だと思いますがこれでできたらいいのですが。

おそらくこの辺の処理をお二人のやり方でやれば早いのでしょうが文章を読んだ限りかなり難しそうな印象です。
時間はかかると思いますが調べながらお二人のやり方も試してみようとは思ってます。

2

データ型の集計は比較的最近追加されたものなので、安定しないのかもしれませんね。

同様のことはクエリの演算フィールドで可能ですので、私は使ったことがありません。
Access独自の機能なので、外のデータベースに移管するときの障害にもなりますので。

1
hhmmj553 2021/03/16 (火) 16:15:19 19f3a@6b5ef

今、気が付いたのですが
当初のデータベースが破損しています。というエラーメッセージは
データ型の集計を排除したら起きなくなりました。

それで、これを使用すると不安定になるんだなと考え使用しないようにしていましたが
今見ると、簡単な引き算の集計がまだ残っていました。

これを排除して使用してみようと思います。

7

私がやるなら、VBAでクロス集計クエリの列名を固定したSQL(店名11列)をVBAで生成して、レポートのレコードソースにして出力を、店名を変更して繰り返すという方法を使います。
列名が変わるので、下記の方法を使用します。(レポートでも同じ方法が使えます。)
列名が変化するクロス集計クエリと連結するフォーム - hatena chips
それなりに難易度が高いのでエクセルへ出力する方法を提案しました。

hirotonさんのワークテーブルを使う方法も、VBAでレコードセットを操作する方法になれていないと難易度は高いです。

エクセルの方法は現状のクロス集計クエリをCopyFromRecordsetでエクセルに出力できたら、あとはエクセルの印刷設定だけなので比較的簡単かなと思い、提案しました。
手順としては、下記になります。

  • 事前にExcelで見出しを固定して全ページに印刷!印刷タイトルの方法で見出しを固定したワークブックを作成しておく。標題などが必用であればそれも入力しておく。

  • VBAで上記のワークテーブルを開いて CopyFromRecordsetでクロス集計クエリのデータを指定位置に出力する。

  • シートを印刷する。

以上です。

エクセルで加工して印刷も試したのですが思い通りにはいってなかったので助かります。

どの辺で躓いていますか。

6
もんぞう 2021/03/15 (月) 15:57:57 62ea7@f778d

1ページずつ印刷の発想はなかったのでまったく考えてませんでした。
初心者には難易度が高そうな気がしますが少しずつ調べながら試してみます。
通常実際に印刷する枚数は多くても30ページぐらいですので処理のほうは問題ないと思います。
エクセルで加工して印刷も試したのですが思い通りにはいってなかったので助かります。
また何かありましたら質問させていただきます。
ありがとうございます。

5
hiroton 2021/03/15 (月) 10:09:41 2b1b2@f966d

書式は固定、各ページ11店舗でいいのなら、1グループ目はA店~K店、2グループ目はL店~V店・・・と11店舗ずつn回印刷処理をすればいいので出力する店舗リストをクエリで作ってVBAでレコードセット取得してループ処理すればできるんじゃないかな?

具体的には出力処理用の1列(店舗名)11行(列数分)のワークテーブルをつくってクロス集計するときに一対多で結合させれば最大11店舗分のデータになります。ループ処理でワークテーブルを1行目から書き換えていって11行目まで書き換えたら印刷実行、ワークテーブルのレコードは先頭にもどし、店舗リストは続けて最後までを繰り返せばうまくいくような気がします(最後のグループだけワークテーブルの直前の出力のゴミ処理も必要です)

現実的に500ページもの印刷に耐えられるかというと何とも言えないのとn回の処理に分けた方法なので、1つのレポートで表示させたいとかなると別な方法が必要ですが

3

Accessのテーブルです。
下記のようなテーブルを作成しておきます。

従業員りんごみかんなし
aaa
bbb
ccc

入力用に使うテーブルで、入力後、本テーブルに転記した後は、入力データは削除して空欄にしておきます。

2
やま 2021/03/14 (日) 17:56:06 58219@b4dbf

別案についてですが、ワークテーブルとは作業するシートということで、EXCELで入力して
ACCESSにインポートするということですか?

1

サブフォームコントロールを複数配置してレイアウトを工夫するという方法があります。
下記にサンプルがあるので参考にしてください。

連結入力フォームのレイアウトを自由に設計したい - hatena chips


別案

最初の画像のような形のワークテーブルを作成しておいて、入力フォームはこのテーブルをレコードソースとして作成。
入力後、VBAで本来のテーブルの形に変換して出力する。

4
もんぞう 2021/03/14 (日) 06:12:31 62ea7@f778d

Accessだけでは難しそうですね。
教えていただいたサイトを参考にエクセルも使いながら作ってみます。
また分からないことがあれば質問させていただきます。
ありがとうございました。

3

画像では、1ページ当たり、店舗数11、行数17,ですので、
横に19ページ分(200/11)、縦に30ページ分(500/17)必要ということになります。
19×30で570ページ分、これはちょっと現実的ではないかなと、特に横に19ページ分というのは難しそうです。
レポートの最大幅は55.87cmですので。空白ページの処理も面倒そう。

エクセルを利用するのも可なら、エクセルに出力する方法の方が簡単かも知れません。

CopyFromRecordsetメソッドを使えばクエリデータをエクセルのシートの指定箇所に一気に出力できます。

■T'sWare Access Tips #686 ~レコードセットの内容をそのままExcelのシートに出力する方法~

タイトル行、タイトル列の各ページ固定出力は下記を参考に。

Excelで見出しを固定して全ページに印刷!印刷タイトル

2
もんぞう 2021/03/13 (土) 18:19:02 62ea7@f778d

店舗数は最大で200、行数は最大で500ほどあれば十分です。
実際は1店舗1行だけのときもあります。

列を動的に作ろうと試したのは下記のサイトを参考にしました。
http://www.ruriplus.com/msaccess/tch/tch_007.html
空白ページを印刷しないVBAを調べたのですが分かりませんでした。

1
hatena 2021/03/13 (土) 18:00:37 修正

実際に出力する店舗数はどのぐらいになりますか。(10000すべて印刷する訳ではないですよね。)
また行数もどのくらいになりますか。

列を動的に作ろうとしましたが空白ページが印刷されます。

これは具体的にどのようにしましたか。

5
hatena 2021/03/12 (金) 09:10:25 修正

hirotonさん、情報ありがとうございます。

データベース的な保存でもいいけど、発行したものは「修正できない」か「修正した記録がすべて残る」システム

勉強になりました。
Accessの場合、作りこめばできないこともないですが、かなりの工数が必要ですね。
また、ファイル破損の可能性もつきまといます。定期的なバックアップをとっていても、直近のバックアップ以降に発行した請求データは復元できません。

その辺を考慮すると印刷(送付用)とPDF出力(控え)を同時にするという運用がいいのかなと思っています。手軽な割に有用性が高いと思います。自分の作成したシステムはそのようにしています。

4
hiroton 2021/03/12 (金) 08:46:17 2052b@f966d

懇意の会計士さんとしっかり相談されるのが一番でしょう

とはいえせっかくなので適当にWeb検索してみました

インボイス制度に関するQ&A目次一覧(国税庁)

問51~に電子データに関する内容がありますね(更新で変わってるかもしれません)

決定的なこととして「所轄税務署長の承認」を受けること
ざっくりとしたことで「わかりやすいマニュアルがあること」
ずばり記述されてるシステム要件であれば

取引年月日、その他の日付を検索条件として設定できること
日付に係る記録項目は、その範囲を指定して条件を設定することができること

等記述がありますね。続くQAにもシステムの要件に関わりそうな記述があります。データの保存部分で言うとデータベース的な保存でもいいけど、発行したものは「修正できない」か「修正した記録がすべて残る」システムである必要があるようです

3
557188 2021/03/12 (金) 03:25:24 576bb@b4dbf

できることなら両方でやって損はないということですね

少しACCESSからはずれてしまいますが、今からシステムをつくるにあたり、対応していたほうがよいと思うので質問させてください
インボイス制度が開始されると請求書を発行した側にも保存義務があるそうです
ご指摘の通りデータベースの利点として再発行が容易、というのはありますが
そのような運用ですと、請求書を保存していることにはならなくなり、義務違反となってしまうのでしょうか?
何を持って請求書の控えとするか、という問題になりそうですが、データベースから持ってきてレポートを作成して同じものを出力できても
データベースから作成したものは控えではない、とかいわれそうな気もします

2
hatena 2021/03/11 (木) 18:08:20 修正

業務の要件次第かと。

請求書だと、客先に送るものと、手元に控え(コピー)を保存しておく必要がある場合は、2枚印刷するのは用紙の無駄なので、
印刷するときに、プリンター出力とPDF出力を同時にすることがあります。

出力先は、下記のリンク先の方法で変更できます。

■T'sWare Access Tips #287 ~特定のプリンタでレポートを印刷する~

レポート用にプリンターを選択するプロセスを自動化する | Microsoft Docs

データベースにデータがあるので再発行は簡単にできますが、
トラブルがあったときにデータベースのデータだと簡単に編集ができるので、
控えとして有効性が低いです。

5
hiroton 2021/03/11 (木) 14:58:53 26d02@f966d

ファイル自体が悪さをしているというのはあまり経験がありません。コード自体は単純な処理なので、パス、ファイル名の作り方や単純なタイプミスをまず疑ってしまいます

コピー処理の前後を次のようにするとどうなりますか?

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
2
nokonoko 2021/03/11 (木) 13:31:25 653a6@54883

ありがとうございました。

通貨型の使い方を理解していなかったです。

4
bunta 2021/03/11 (木) 11:22:29 3e392@fa49d

回答ありがとうございます。
ファイルの件提示してい頂いた内容をもとに考えてみたいと思います。
ありがとうございました。

エラーの件ですが、

.Workbooks.Open "C:\テスト\受注伝票テンプレート.xlsx"

こちらに書き換えたところエラーが移り変わりました。

 'ワークシートをコピー
    .Workbooks(cstrTemplateBook).Worksheets("sheet1").Copy

次はこれにエラーが出て、実行時エラー9「インデックスが有効範囲にありません」と出ます、、
やはりファイルが悪さしてるのでしょうか?
ちなみにシート名も間違いがないようコピーして貼り付けています、、

3
hiroton 2021/03/11 (木) 11:04:12 26d02@f966d >> 2

こちらですが、特別会員、通常会員、ビジターの3つのクエリを作成するということでしょうか?

考え方として、3つファイルを出力したいのなら3回出力処理をすればいいですよ。という内容ですね(質問がざっくりだったので)

「種別」が決め打ちできる程度なら決め打ちで作成してもいいですし、出力内容を自動認識させたいならそれはそれでやり方もあります。参考コードだけでやり取りするのは齟齬の元なのでまずは1ファイルでもいいので出力できるコードができてからですね


エラーが出ている部分は特別な処理をしていないよくあるEXCELファイルを開くだけなので原因はよくわかりません

.Workbooks.Open "C:\テスト\受注伝票テンプレート.xlsx"

のように直接記述すると動作しますか?

Debug.Print cstrTemplateDir & cstrTemplateBook
.Workbooks.Open cstrTemplateDir & cstrTemplateBook

として、エラーが出る直前でcstrTemplateDir & cstrTemplateBookの内容を確認すると実際に存在するファイルパスになっていますか?

2
bunta 2021/03/11 (木) 10:21:16 3e392@fa49d

回答いただきありがとうございます。

Sub test()
  ExcelTemplateSample "qsel特別会員", "特別会員"
  ExcelTemplateSample "qsel通常会員", "通常会員"
  ExcelTemplateSample "qselビジター", "ビジター"
End Sub

こちらですが、特別会員、通常会員、ビジターの3つのクエリを作成するということでしょうか?

また、質問で提示したURL先のコードですが実行するとエラーが出てしまいました。

'テンプレートの保存先フォルダ
  Const cstrTemplateDir As String = "C:\テスト\"
  'テンプレートのファイル名
  Const cstrTemplateBook As String = "受注伝票テンプレート.xlsx"
  'データが代入されたファイルの保存先フォルダ
  Const cstrSaveBookDir As String = "C:\テスト\"

ここで指定したファイルパスが間違っていると出ます。
実行時エラーは1004です。
しかし、確かにここに格納されていますし、Shift+右クリックでパスのコピーをしてそのまま貼り付けています。
そしてデバッグを押すと、

'テンプレートファイルを開く
    .Workbooks.Open cstrTemplateDir & cstrTemplateBook

ここが黄色くなります。

原因が分からず困っています・・・
もしこの原因がわかるようでしたら教えて頂けるとありがたいです。

重ねての質問になり申し訳ありません。

元の質問にも追記しました。

1
hiroton 2021/03/11 (木) 10:11:20 26d02@f966d

「pdfで保存する」とは、印刷物をスキャナか何かで再データ化するという意味ですか?
印刷後に何か手を加えて、それの重要度が高いのであればそうする必要があるかもしれませんが「システム」から全く同じものが発行できるのであれば必要になったときにそれをPDFで出力すればいいと思いますよ

それともレコードに請求書idを付与しておき、請求書一覧を表示できるようにして
再発行や確認(再表示)のたびにデータベースを照合して作成しなおすものですか?

これができるのがデータベースのメリットであり、そうやって管理をしよう効率化しようというのが「データベース化」です。

データベースの条件ではないですがやらない理由はないデータベース化の本質だと思いますよ

1
hiroton 2021/03/11 (木) 09:16:28 26d02@f966d

質問がざっくりなので回答もざっくりになりますが

「共通部分はひとまとめに、処理を変えたいところは変数にしてプログラム内で任意に変更できるように」します

リンク先のコードを参考にするなら

  'データ元のクエリを開く
  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

と、出力処理を3回実行してやればファイルを3つ作ることができます

1

「浮動小数点数 誤差」でWEB検索してみてください。正確な計算をおこないたいときは、使えないものだと分かるでしょう。

また、変数はきちんと型を指定して宣言しましょう。型宣言無しに小数を代入すると浮動小数点数になります。

小数点4桁までなら、通貨型を使うと誤差のない計算ができます。

Dim SumFM As Currency
Dim ctl As TextBox
Dim i As Long
For i = 1 to 25
    set ctl = me.Controls("txt0" & Format (i,00))
    SumFM = SumFM + Nz(ctl ,0)
next i
2
みこ 2021/03/06 (土) 15:32:28

hatena様
ご回答有難うございます。
データを確認した所、ご指摘の通りで
売上実績データにはユニークデータしか存在しませんでしたが、
他資料1.2には重複データがあり、
クエリで吐き出された2行の重複データも存在しました。

売上実績データがベース資料なので、これだけユニークになっていれば問題ないものだと思っていましたが、
他資料1.2もユニークデータしないと正しく表示されないということですね!
全てのデータがユニークでないといけないのですかね。
根本的に考え方が間違っていたようです、、有難うございます。

1

クエリで結合して件数が増える場合は、たいてい、一対多の関係になっていないのが原因ですね。多対多の関係になっているということです。

結合するフィールドの片方は、主キーか重複のないインデックスが設定されていますか。この辺のテーブル設計をきちんとしないとデータベースとしては使えないデータになってしまいます。

4

Requeryは全レコードの再読み込みですので、先頭に戻ります。

帳票フォームのカレントレコードを詳細フォームで更新したのなら、カレントレコードの更新のみ反映させればいいので、その場合は、Refresh を使うといいでしょう。これなら、先頭に戻ることはないです。

Requeryは複数レコードを更新してそれを一気に反映させたい場合に使えばいいでしょう。

3
hiroton 2021/03/05 (金) 15:08:37 bfb00@d3250 >> 1

メイン-サブ形式で単純にやるなら、親フォームの枠いっぱいにサブフォームを置いてしまうのが楽だと思います。親フォームはただの外枠扱いですね

帳票1案件毎に左に詳細フォームに飛ぶボタン

案件毎ということはボタンがたくさん並んでいると思います。これをメインとサブに分けて同期してスクロールさせるのは現実的ではありません。上記方法のように親フォームを外枠扱いとするか、「詳細ボタン」はメインに一つにして、選択中の案件が分かりやすいようにサブフォームは選択中の行の背景色を変えるような仕組みにするかですかね

2
セロハン 2021/03/05 (金) 13:19:27 0029a@1c915 >> 1

ご回答ありがとうございます。
そんな方法があるんですね。
今、帳票1案件毎に左に詳細フォームに飛ぶボタンがあるのですが、ここはメインに残しておいて、その他の部分をサブにして埋め込むイメージでしょうか・・?
(イメージがわいておらずスミマセン)

1
hiroton 2021/03/05 (金) 13:01:42 bfb00@d3250

フォームに対してrequeryした場合にリストが再読み込みされて先頭に戻ってしまうのは仕様ですね

requery前にスクロール状態を保存して再度スクロール位置を調整する(面倒)か、メイン-サブフォーム形式にしてサブフォームコントロールをrequeryするのがセオリーでしょうか

Me!サブフォーム.Requery '=>スクロール位置は変わらない
Me!サブフォーム.Form.Requery '=>先頭に移動する
3

MS明朝とMSゴシックが多いでしょうね。
最近のWindowsだと游ゴシックと游明朝が標準になってますね。
他にもいろいろ最初から入ってますので、その中からいいのをさがせばいいでしょう。

私は印刷物にそこまで拘りがないので、MS明朝とMSゴシックを使ってます。

2
ねむ 2021/03/04 (木) 18:39:26 58219@894df

普通はMSゴシックを使うものですか?
なんだか印刷しても汚い気がするんですよね

1

OSにインストールするしかないと思います。

2

回答ありがとうございます。
今手元にファイルがないため確認出来ないのですが、御指摘の手順も実行してみようと思います。

1

そのような経験はないですね。
もう一度、新規に①のクエリを作成、「B」を削除、「実行」としてみても同じ現象が再現しますか。