Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
Me!ページ数表示.Visible = True
End Sub
Private Sub レポートフッター_Format(Cancel As Integer, FormatCount As Integer)
If FormatCount = 1 Then Me!ページ数表示.Visible = False
(後略)
現地情報は詳細にはわかりません。(外国です)
ただし、"(フルパス)is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides."というエラーなので、本当に迷子なんだと思います。
Microsoft Access で Access データベースを手動で分割する方法
上記記事を参考に、適当なAccessファイルを用意して、バックエンドデータベース「データベース1」、フロントエンドデータベース「データベース2」に分割しました。続けて、もう1つ余分にバックエンドデータベース「データベース3」を用意し、切り替える事ができるか試してみました。(場所は、デスクトップ。パスワードは、設定なし。)
Private Sub コマンド0_Click()
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Set dbs = CurrentDb
For Each tdf In dbs.TableDefs
If tdf.Connect <> “” Then
tdf.Connect = “MS Access; PWD=; DATABASE=C:¥Users¥…¥Desktop¥データベース3.accdb”
tdf.RefreshLink
End if
Next tdf
dbs.Close
Set dbs = Nothing
ありがとうございます。
情報が不足しており申し訳ありません。
D1~ 日付に見立てたフィールドで~31まで用意し、別のフィールドで月、年を用意をしています。
ユーザとしては 入力フォームで
製品ごとに ある年月の 1日~31日 フィールドへ入力する形にしています。
入力したデータは 別のテーブルで日付に変換して 日付順に所要展開できるように考えています。
クロス集計クエリを逆にしている形です。
ご指摘があったように A,Bが同じ部品であることをバージョン情報として持たせるようにしたいと思います。
やはり、クエリでの計算は難しく
バージョン管理品 の場合は 変更順に Aが0となった場合は、Bから引くといった
VBAでの処理が必要と理解しました。
私の場合はこの方法でうまくいってます。
コンボボックスの「フォーカス取得時」のイベントプロシージャを提示してください。
※
コードはマークダウンのコードブロックにいれてください。
マークダウンの使い方の詳細は下記を参照ください。
Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa
変更したところ、最初はリストが変更されましたが、
テキストボックスAの書き込みを消去して改めてコンボボックスを更新しようとしたところ、
イベントは起きましたが、リストの更新はできませんでした。
(一度コンボボックスのリストを表示させると、リストが更新されなくなった)
絞り込みは
Like "" & [Forms]![フォーム1]![テキストボックスA] & ""
としているだけです。
テーブル設計がまずいですね。
画像「計画のテーブル」のD1,D2,D3~というフィールドは日付をあらわしているのですよね。このような日々追加されているようなデータをフィールドにしてはいけません。データベース設計のセオリーから外れます。
「日付」というフィールドに日付を追加してく形にすべきです。
AとBは同じ部品でバージョン違いであるという情報をテーブルに持たせる必要があります。
情報が不足しているで全体像が分かりませんが、とりあえず、下記のような感じのテーブル設計になると思います。
製品マスター
※製品CD
製品名
部品マスター
※部品CD
部品名
部品バージョンマスター
※部品CD
※バージョンCD
バージョン名
製品構成マスター
※製品CD
※部品CD
必要数
生産計画
※日付
※製品CD
生産数
部品在庫履歴
※日付
※部品CD
※部品バージョン
使用数
在庫数
部品在庫履歴 をクエリだけで計算するのは難しいので、
VBAでDAOを使ってレコードセットとして開いて、
レコード移動しながら累計値を入力していくことになると思います。
今のコードも突っ込みどころはいろいろあるんですが、いったん完成ということにしてしまいますか。ダメな場合があるということだけは覚えておいてください。
元々見栄え自体はあまり気にしなくてもいい方法のようですから。見栄えを気にするならhatenaさん指摘のように、索引専用のレポートを作ることも検討してみましょう
ちなみに「薬品名(文字数は制限なし)」とすると発生する問題があります。どんな問題が出るのか確かめて、どうしたいか考えてみてください
ページフッターのページ数表示ですよね?索引のページ(レポートフッター)だったら非表示にすればいいと思ったんですが意外とめんどうでした
※ページ数表示は実際のコントロール名に合わせてください
起動時実行マクロ(AutoExecマクロ)でリボン非表示のVBAを実行してもいいでしょう。
標準モジュールに下記のプロシージャを作成します。
マクロを新規作成する。
リボンの「すべてのアクションを表示」を選択。
「新しいアクションの追加」で「プロシージャの実行」を選択。
「プロシージャ名」に「HideRibbon()」と設定。
マクロを保存する。名前は「AutoExec」とする。
トップページフォームの
DoCmd.ShowToolbar "Ribbon", acToolbarNo
は削除しておく。以上です。
hiroton さん、確認しましたが、やはり索引に印字されているページが本文のページと一致していました。完璧です。
『用法・容量がすごく長くてその薬品一つだけで1ページを超えるようなデータ』はない為、ダメな例を勉強してみます。
グループヘッダーのセクション繰り返しの設定 → 画像を添付しました。
索引の印刷プレビュー画面も添付しました。3段組、30行、文字数も制限しいている為、見栄えがよくありません。現在の薬品集が薬品名(文字数は制限なし)・・・ページ数となっている為、そのようにしてみようと思っています。自分で変えてみようと思いますが、無理だったらまた質問をさせて頂きます。
索引にページ数が入るのは仕方がないことですか?
条件を付けている通りで特別なデータ(用法・容量がすごく長くてその薬品一つだけで1ページを超えるようなデータ)があるとうまくページを取得できません
そんなデータあるわけない!なら多分うまくページが取れてると思います。適当に用法・容量が1ページを超えるようなデータを作って試してみてください。ダメな例がわかると思います
「データ」は今は良くても、今後、誰がどのように登録するかわからないなので
という方針を示しています。今後についても「そんなデータあるわけない!」なら今のコードで完成でもいいかなぁとは思います
追加の対策を考える場合、ちょっとテストしていたらグループヘッダーのセクション繰り返しの設定で動作を変えないといけないようでした。このプロパティの設定も教えてください。
私はこちらのサイトのmindwoodさんのやりかたを採用しております。
https://qiita.com/mindwood/items/062cde46b848d0c9e96a
「コンテンツの有効化」をクリックしてもらうために の欄です。
hiroton さん、索引に印字されているページが本文のページと一致しているかもです。ページに跨ぎになっている薬剤を全て確認し、また報告をさせて頂きます。
例えば、最初の行2020,AAA,10000を選ぶと、集計前のクエリが絞り込まれて、2020,AAAのレコード一覧が表示されるという方針はいかがでしょうか?
この方針でやってみるならば、スレを閉じて、集計前のクエリを絞り込むフォーム作りから始めましょう。
•詳細セクションの同一ページ印刷プロパティは「はい/いいえ」どちらですか?→ はい
•詳細セクションに印刷時拡張の設定はありますか? → はい
となっています。
基本的には取引先ごとの年間集計が必要になると思うので、前もってクエリを作成しておき
年間集計ボタンを押すとそれを表示させるのがよさそうですね
集計なので基本的に編集することもなさそうですし
集計なので個々のレコードが表示されないと思うのですが、なぜその集計金額になったのかを確認するために、
年数 取引先 金額
2020 AAA 10000 詳細
2020 BBB 20000 詳細
2021 AAA 2000 詳細
と集計を出したときに、各集計の横に詳細ボタンを配置して押すと
フォームを開いて、集計元のレコード一覧を表示させることなどはできますか?
リストを変更するという目的にはつかえませんね。hirotonさんも回答している通り、リストから値を選択したときに発生しますので。
コンボボックスのイベントなら、「フォーカス取得時」のイベントがいいでしょう。
テキストボックスAの更新後処理でもいいですが、例えば、レコード移動してテキストボックスの値が変わった場合には対応できません。
うーん、me.コンボボックスB.requeryでどうですか?
コンボボックスの場合、リストから値を選ぶためのクリックをしたときに発生するようです。(値がないとクリックしてもイベントは発生しません)
ありがとうございました。その方法がよさそうです。
ところで、コンボボックスのクリックイベントは、使えないイベントなのでしょうか?
テキストボックスAの更新後処理に再クエリを設定すると良いかもしれません。
今後継続して使用していく目的としてはとても便利で、思っていた以上のレポートです。
現にhirotonの回答は次々と問題が出てきて穴だらけですし
→ 私が条件を全て表示していなかったからです。感謝しかないです。
ご回答ありがとうございました。
アクセス以上にネットワーク関連の知識が足りず、事業所に迷惑をかけている状態なのですが、アクセス側はどうしようもないようですね。
ありがとうございました。
エラーが出なくなったようなので続きですが、
今後の方針について
単独で1ページを超えるような出力に対応する
データに依存する仕組みじゃ使いにくいですね。対策します
同一ページ印刷プロパティ「いいえ」に対応する
一応、対策案はあります。今の想定ではそれなりにコードが複雑になるので同一ページ印刷が「はい」なら対策コードは入れなくていいかなと思っています
詳細セクションの印刷時拡張の設定
今回の手法(『目次(索引)ページを自動作成』)では
詳細_format
からページ数を取得するのことがかなり難しいことがわかりました。で、本当に今更な確認ですが、詳細セクションで印刷時拡張の設定が無ければ出力ページ数自体が元データから作れるのでは?と、ふと思ってしまいました。(謎の先入観で印刷時拡張「はい」があるものと思っていたようです)今の手法も形になりそうなのでhirotonが別手法を挙げることはないですが、一応ここで確認事項としてあげておきます
実践あるのみですね。目的を立てて「できた!」までこぎつけてほんのちょっとレベルアップしたかもって思う感じです。
読み物としていろいろ見ておくと「自分のやろうとしてることくらいすでに誰かやっているんじゃないか?」とか「これめんどくさいな。もっと簡単な方法があるんじゃないか?」とかそういう考え方はできるようになるかもしれませんが、これが実力が付いたと言えるかというと微妙なところです。現にhirotonの回答は次々と問題が出てきて穴だらけですし
限定条件はあるもののその条件下なら今の回答でうまくいくと思っているんですが、うまくいかない部分があるということですか?それともこの条件だと目的のレポートにならないということですか?
hirotonさん、有難うございます。上記の様に設定したところ、漢字、カナ、数字の区別なく五十音順に並び替えることが出来ました。ただ、ページ跨ぎになっている薬剤のページはやはりずれていますが、私としては大満足です。大変な知識不足でお手数をお掛けして申し訳ありませんでした。こういったコードを沢山見ることが向上に繋がるでしょうか?
お世話になっております。やろうとしていることがAccess向きではないかもしれませんが・・。すみません。
添付画像(簡素化)のような テーブル構成・ 実施しようとしていることになります。
参考URLをご教示いただき助かりました。時間を見つけて確認したいと思います。
なるほど、そういう方法もありますね。ありがとうございます。検討してみます。
エラー情報を翻訳すると
ということなので、パスが間違っているか、共有フォルダーの権限の問題で接続できてないか、、、が原因なんでしょう。
Accessの問題ではなさそうです。
Oh…, 本格的に迷子なんですね。
Aceessの問題なのか、リンクステーションの問題なのか、私には力及ばずでした。
とりあえずAccessのVBAなら、検索すればFileSystemObjectを使用したサンプルコードがいろいろ見つかりますが、たいてい今でも動作すると思います。
例えば、下記とか。
Excel VBA を学ぶなら moug モーグ | 即効テクニック | データベース自動バックアップ関数 (FSO)
Accessのバックアップを取る - オフィスタナベ
現状のテーブル構成はどうなってますか。
各テーブルのテーブル名、フィールド名、主キー設定を提示してください。
ご回答、およびご検証いただきありがとうございました。コードの内容はおいおい勉強します。
はい。データの分割で、一つのファイルからバックエンドを分割をしたもので、データ(複数テーブル)が一つのバックエンドファイルにすべて入っています。
> 伝言ゲームの罠に嵌まっていませんか?みんなで使っているうちに、あるテーブルのデータがおかしくなって、別のエラーが発生している話だったりしませんか?
現地情報は詳細にはわかりません。(外国です)
ただし、"(フルパス)is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides."というエラーなので、本当に迷子なんだと思います。
要件次第でしょう。ACCESSだけで実現しようとすると、ACCESSはバックアップ用のアプリケーションではないので、どのような動作をすればいいのかをすべて自分で考えて組み立てる必要があります
バックアップを目的としたアプリケーションを別途用意するのではダメなんでしょうか?
レポート上にテキストボックスを配置し、名前を「薬品名のフリガナ」、コントロールソースも「薬品名のフリガナ」とします。
印刷するデータではないので可視プロパティは「いいえ」にします。
五十音で並び替えたいということなので五十音のデータが必要です。薬品名から自動で五十音を作るのは現実的ではないので並び替え用に五十音のデータを用意します。>> 10の画像から使えそうなフィールド「薬品名のフリガナ」を用いていますが、見る限り五十音だけでないようなので必要であれば専用のフィールドを追加で用意してください
印刷しないデータなのでレコードセットから直接取れればいいんですが、レポートだとレコードセットを直接参照することができないのでレポート上にデータを読み込んであげる必要があります。そのため、テキストボックスを配置しコントロールを参照します
コントロールの名前プロパティとコントロールソースプロパティ(フィールド名)が同じ場合は意識する必要はないですが、別々にしている場合は注意してください
確認ですが、バックエンドにAccessファイルが3つ置いてあって、あるテーブルはデータベース1から、あるテーブルはデータベース2から、という状況では無いですよね?
上記コードを試して、再リンクで解決できるのかなぁと思いました。
時々、バックエンドが迷子になるという事でしたが、伝言ゲームの罠に嵌まっていませんか?みんなで使っているうちに、あるテーブルのデータがおかしくなって、別のエラーが発生している話だったりしませんか?
Microsoft Access で Access データベースを手動で分割する方法
上記記事を参考に、適当なAccessファイルを用意して、バックエンドデータベース「データベース1」、フロントエンドデータベース「データベース2」に分割しました。続けて、もう1つ余分にバックエンドデータベース「データベース3」を用意し、切り替える事ができるか試してみました。(場所は、デスクトップ。パスワードは、設定なし。)
このFor〜Nextでデータベース1とデータベース3の切り替えはできました。
最後のコードは、データベースを閉じてメモリを解放すると、なっているようです。
先週金曜日から何とかご指摘を克服しようと努力はしましたが、今の知識では難しくお知恵を頂こうと思っていました。
13の完コピに、1のSub ArrayListSort以下を合体させたところ”薬品名のフリガナフィールドが見つかりません”とのメッセージに変わりました(前進ですか?)。レポートに「薬品名のフリガナ」がないのは気になっていたのですが、この点は如何でしょうか?
Sub ArrayListSort(ary As Variant)
Dim aryList As Object
Dim s
'// .NET FrameworkのArrayListクラスを利用する
Set aryList = CreateObject("System.Collections.ArrayList")
For Each s In ary
Call aryList.Add(s)
Next
Call aryList.Sort
ary = aryList.ToArray
End Sub
適材適所で選択できるようになるといいでしょう。
フォームやレポートでグループ単位の集計を表示する場合は、複数の集計が必要になるのでDSumは重くなるので避けた方かいいでしょうか。
ただし、フォームでデータ編集もしたいときだと、集計クエリだと更新できないので、DSumで集計を表示する場合もあります。
フォームやレポート上にあるデータの全体の合計を1つのみ表示する場合はテキストボックスのコントロールソースにDSum関数を使って表示させてもいいでしょうか。
りんごさんへ
計算式の持ち時間が問題になりそうです。
出荷数の部分の式でIIfを使う発想はなかったので参考になります。
時間の計算の参考になりそうなサイトまで紹介していただきありがとうございます。
いろいろとありがとうございました。
引き続きアドバイス出来る方お願いします。
一か月ぐらいは定期的に覗きに来たいと思います。
詳しい解説ありがとうございます
やはりDsumを使わなくてすむなら使わないほうがいいんですね。マスタとかレコードが少ないテーブルで
なんらかの集計をするときにパッと使える関数といった使い方のほうがいいのかもしれませんね
テーブル→クエリ→フォーム→レポート
といった処理にする場合、
テーブルのレコードに対する集計条件(年度や取引先、商品などをテキストボックスに入力して指定する)を都度変えるのなら
テーブル→フォーム→クエリ→フォーム→レポート
ということになりますか?