Private Sub Report_Open(Cancel AsInteger)
Dim db As DAO.Database
Dim qd As DAO.QueryDef
Dim cnt AsInteger
Dim fld As DAO.Field
Dim rs As DAO.Recordset
Set db = CurrentDb()Set qd = db.QueryDefs(Me.RecordSource)
qd.Parameters(“[Forms]![フォームの名前]![絞り込みの名前]”)=[Forms]![フォームの名前]![絞り込みの名前]Set rs = qd.OpenRecordset
For cnt =2To rs.Fields.Count -1Set fld = rs.Fields(cnt)
Me("Label"& cnt).Caption = fld.Name
Me("Field"& cnt).ControlSource = fld.Name
Me("Total"& cnt).ControlSource ="=Sum(["& fld.Name &"])"NextEnd Sub
下記を追加。フォームの名前と絞り込みの名前は適宜変更して下さい。
Dim rs As DAO.Recordset
qd.Parameters(“[Forms]![フォームの名前]![絞り込みの名前]”)=[Forms]![フォームの名前]![絞り込みの名前]
Set rs = qd.OpenRecordset
下記を変更。
For cnt = 2 To rs.Fields.Count - 1
Set fld = rs.Fields(cnt)
メインレポートSQL
TRANSFORM … SELECT … FROM …
GROUP BY T_レジメン名.[レジメンコード], Tレジメンリスト2.番号, T_Rpリスト.Rp名
ORDER BY T_レジメン名.[レジメンコード], Tレジメンリスト2.番号, Format([投与day],"@@")
PIVOT Format([投与day],"@@"
SQLです。
TRANSFORM Sum(Tレジメンリスト2.投与量) AS 投与量の合計
SELECT T_レジメン名.[レジメンコード], T_Rpリスト.Rp名
FROM (T_Rpリスト INNER JOIN Tレジメンリスト2 ON T_Rpリスト.Rpコード = Tレジメンリスト2.Rpコード) INNER JOIN T_レジメン名 ON Tレジメンリスト2.[レジメンコード] = T_レジメン名.[レジメンコード]
WHERE (((T_レジメン名.[レジメンコード])=11031))
GROUP BY T_レジメン名.[レジメンコード], Tレジメンリスト2.番号, T_Rpリスト.Rp名
ORDER BY T_レジメン名.[レジメンコード], Tレジメンリスト2.番号
PIVOT Format([投与day],"@@");
素人考えです。過度な期待はしないで下さい。
元請の名前,
受注した仕事,
受注日,金額,グループの名前,…
グループの名前,…
グループの名前,
下請の名前,発注日,金額,…
元請と仕事と受注日のテーブル:
グループのテーブル:
グループと下請のテーブル:
etc:…
もしくは
元請けAからの複数の仕事を一つにまとめて金額を設定し複数の仕事をつくり、それを複数の下請けにだす、といった具合です
めちゃくちゃ複合的にまざったりはしません
出来る方法があり、支障がないなら、それでいいんじゃないかと思います。
ググッてみましたら、こんな情報もありました。
横持ちデータを縦持ちデータに変換する - もう一度学ぶMS-Access
仕事を組み合わせ、金額を決めて下請けに出すという事でしょうか?それとも、こんな場合もあり得ますか?仕事Aと仕事Bがある。仕事Aのその1、仕事Aのその2、仕事Bのその1、仕事Bのその2、仕事Bのその3と分ける。仕事Aその1と仕事Bその1を下請会社あああ、仕事Aその2と仕事Bその2を下請会社いいい、仕事Bその3を下請会社ううう。
なるほど。双方に必要なフィールドを作っておいて、使わない部分は空欄にしとけばいいと思ってましたがそういうものでもないのですね
視認性や管理の問題でわけたほうがいいということでしょうか?
フィールドをが多いとごちゃごちゃしますしね
「仕事のもととなる元請け」この情報は「下請けデータ」には必要ですが、「元請けから受注した売上」には不要な(存在しない)情報ですよね?
データ構造の異なるデータは一つのテーブルにまとめるべきではありません。つまり別々のテーブルにしましょう
わざわざテーブルを作成する必要はないですね
ユニオン クエリを使って複数のクエリを 1 つの結果に結合する
または、くだもののマスタテーブルがあるならDcount関数を使って、それを合計してもいいでしょう
ありがとうございます!
解決しました!本当にありがとうございました!
取り敢えず、下記に変更すると何か変わりますか?
"[補足説明] = '" & Me.txt補足説明.Value & "' " &
りんご様
できました!!!!
本当に本当にありがとうございます!!
レコードソースのクエリwhere条件とパラメーターは設定したままで、教えていただいたコードを修正したところできました。
本当に本当にありがとうございました!
何度もすみません。試してみてください。
下記を追加。フォームの名前と絞り込みの名前は適宜変更して下さい。
Dim rs As DAO.Recordset
qd.Parameters(“[Forms]![フォームの名前]![絞り込みの名前]”)=[Forms]![フォームの名前]![絞り込みの名前]
Set rs = qd.OpenRecordset
下記を変更。
For cnt = 2 To rs.Fields.Count - 1
Set fld = rs.Fields(cnt)
りんご様
ありがとうございます。
Debug.Print Me.レジメン
で確認したところ、レジメンコードが表示されています。また、レポートをデザインビューにし、レコードソースのデータシートビューでもきちんと表示されています。
また、Tレジメンリスト2.番号を削除してもダメでした。
2のカルセドについても数値が入っているのを確認しています。レジメンコードを指定しないで、すべてのレポートを表示さると表示されるので。。
おっしゃる通り、
クロス集計の前に仕組みを入れないと無理だと思います。
だと思うのですが、どういう順番でデータを読み込んでレコードが作成されているのかですかね。
もし、サブフォームのテキストボックスにセットフォーカスする場合、注意点があるようです。グクってみるといいかも。
そうでない場合、VBAコードを提示すると、回答がつきやすくなるかも。
ありがとうございます。
早速やってみましたが、エラーになりました。フォーカスを移動させることができません。と出ます。
その他のテキストボックスにセットフォーカスするとエラーになりませんでしたので、フォーカスできないことが原因なのでしょうか?
となるとなぜフォーカスできないのか?となるんですが、その理由がわかりません…
なにかヒントあればお願いいたします。
正直よくわかりません。テキストボックスにセットフォーカスすると、代入値が見えるのであれば、代入するコードの前に、セットフォーカスするコードを入れてみたら?フォームAにセットフォーカスしてからテキストボックスにセットフォーカスする感じ。
>> 17
クロス集計の前に仕組みを入れないと無理だと思います。where条件パラメータの問題解決に戻りましょう。"レジメンコード=" & Me.レジメンを削除するのを忘れずに。
>> 16
[Forms]![F_レジメンワークシート]![レジメン]の参照値が直接コードと違う値になっていませんか?意図せずにという事もあります。念の為、もう1度確認してみて下さい。例えば、コマンドボタンを作って、メッセージボックスやデバッグプリントで[Forms]![F_レジメンワークシート]![レジメン]の中身を見てみると何かわかるかもしれません。パラメータ参照値が駄目なら直接コードも駄目になるはず。
>> 5
データがどのように登録されているかわからないので、何とも言えませんが、Tレジメンリスト2.番号を削除してみるのも。クロス集計に必要不可欠、これがないと投与dayがおかしくなるという事であれば無理ですが。
その他に、番号その1のカルセドと番号その2のカルセドがある場合、片方の投与dayと投与量が未入力になっていないか見直してみるのも。
試行錯誤の結果が期待通りか否かは、クロス集計クエリを直接開いたり、選択クエリに戻して確認すると良いと思います。
>> 3
水道光熱費並びに家賃を支払月毎や使用月毎に分類し、売上と対比する、という事に意味があるのかよくわかりませんが、頑張って下さい。
慣れないうちは、名称そのものに主キーを設定し敢えてIDを使わない、とした方が分かり易いと思います。
ありがとうございます。今まではエクセルで支払い月ごとに作っていたものが、今後は経理上は支払い月ごと、営業管理として該当月(使用月)ごとに分類する必要が出てきたため、Accessを…と思いました。
時々過去に作ったものを加工したりする程度で、一から作る方法がわからなかったのですが、とりあえず入力用のテーブルと、ルックアップでリストから選択できるフォームを作り、入力していく事が出来ました。
(そのデータをどのように活用していくかはゆっくり勉強しながら進めていきます。)
データを入れるテーブルをシンプルにしなければ、と考えて混乱していました。
どうもありがとうございました。
りんご様
11で作成したフォームのトグルに以下を設定
DoCmd.OpenReport "R_レジメンワークシート", acViewPreview, , "レジメンコード=" & Me.レジメン
これでひとまず表示させることができました。
レコードソースのクエリwhere条件とパラメータは削除してます。
あとは、添付画像の場合4以降を表示させないようにできれば。。
このときのDebug.Print fld.Nameの結果は
1
2
3
4
5
・・・とすべての数値が出ていました。
りんご様
ありがとうございます。
上段のDebug.Print Me.RecordSource と Debug.Print qd.Nameではレコードソースとなったクエリが表示されましたが。
下段のDebug.Print fld.Nameではなにも表示されませんでした。
レコードソースのクエリwhere条件で直接コードを入れた結果は
1
2
3
や
1
8
15
といった希望の数値が出ました。
基本的にこの回答の通りでいいと思いますが、
ここは、インポートでなくリンクでいいかと思います。
そうすればテーブルは不要ですし、インポート前にテーブルからデータ削除とかの操作も不要になります。
>> 1
売上なのか、受注したのか、出荷したのか?伝票テーブルに締め日と請求日を持たせるべきか?という点が気になります。
セオリーはわかりませんが、こんな感じで出来るのかもしれません。
伝票ID,日付,取引先,締め日,請求日
詳細ID,伝票ID,商品ID,個数
取り敢えず、同じ構造のテーブルを用意して振り分けずにそのままインポート
テーブル1: 日付,取引先,商品ID,個数,締め日,請求日
テーブル1の選択クエリを作る。伝票テーブルに関係するフィールドを選ぶ。
クエリ1:日付,取引先,締め日,請求日
集計ボタンを押してグループ化したら、追加ボタンを押して追加クエリに変更し、実行ボタンを押して伝票テーブルに追加。
伝票テーブル:
クエリ2を作る。テーブルの追加ボタンを押して伝票テーブルとテーブル1を表示。共通するフィールドを結合。詳細テーブルに関係するフィールドを選ぶ。
クエリ2:伝票ID,商品ID,個数
追加ボタンを押して追加クエリに変更し、実行ボタンを押して詳細テーブルに追加。
詳細テーブル:
EXCELでの運用の問題点はリスト化されていますか?
ACCESS(データベース化)で問題点が解決される見込みは立っていますか?
数年後、そのままACCESSを使っていける環境(特に人員の入れ替え・教育など)ですか?
という段階であればACCESSに移行してもメリットを感じないと思います(データベース化自体にはメリットはあります)
簡単なのは「
ID
も名称
も登録する」です入力フォームではコンボボックスで、登録(連結列)を
ID
にして表示は名称
にします。さらに、コンボボックスの更新後処理イベントで名称
を登録するようにしますりんご様
今までご回答ありがとうございました。
とりあえず、本質問は終了させていただきます。
ちょっとよくわからないです。念の為、Debug.Printの結果をイミディエイトウィンドウで確認してみるとか。
ご返答が遅くなりまして、失礼いたしました。
ご回答いただいた内容を基に対処を行おうと、本日ファイルを開いたところ、
今まで発生したエラーが(何もしていないのに)発生しなくなりました。
私の端末以外からも同様でした。
よって、何らかの365関連のトラブルにかかっていたのかもしれません。
そのような、状況ではありますが、いただいたコードを試しましたので
ご確認願います。
>下記コードを追加すると、どんなメッセージが出ますか?
1
False
False
です。
>F27 台帳を開いた直後や何か操作した直後に、コマンドボタンを押すと、どんなメッセージが出ますか?
どのような作業をした場合も、同様の結果でした。
素人考えです。過度な期待はしないで下さい。
請求日,
支払先,支払期日,支払日,支払方法,支払金額,…
エリア,
支店名,
使用年月,
支払先,
種別,
開始日,金額,請求日…
支払一覧:
使用一覧:
etc:…
etc:…
…
結論、業者に依頼しましょう。
Accessを使えばデータベースになるわけではありません。データベースは、複合主キーと参照整合性だと思います。兎にも角にも、関数従属性だけ考えましょう。
データベース目的ならば、Excelでも出来る事があるはずです。
兎にも角にも、関数従属性を考える癖が必要です。生活のいろんな場面で考えてみましょう。
昔、Accessの使い方やVBAやSQLやER図や正規化三原則などをデータベースの勉強と思っていました。が、ぶっちゃけ、データベースのスキルは伸びません。データベースの勉強と思って勉強すればするほど、関数従属性だけ考える邪魔をするようになり大変苦労します。
りんご様
レコードソースで直接コードを指定すると最終列が表示されない件は治りました!ありがとうございます!!
For cnt = 2 To qd.Fields.Count - 1 ←これでした
まずは一歩進みました!
リンゴ様
返信ありがとうございます。
試しましたが、変化なしです。
ヘージヘッダー、ページフッターにコントロールソースをコードにしたテキストボックスを作成すると選択したコードが表示されていることから、レポートのレコードソースのwhere条件読み込む前にReport_Openのコードが実施されているとかあるのでしょうかね??でもそうするとRp名(この場合カルセド)が表示されてるのと矛盾するか。。
For cnt = 2 To qd.Fields.Count - 1
DoCmd.OpenReport "R_レジメンワークシート", acViewReport
うまくいくかわからないけれど、とりあえず、どうでしょう。
下記コードを追加すると、どんなメッセージが出ますか?
F27 台帳にコマンドボタンを追加、クリック時イベントで同様のメッセージを確認出来るように準備。
F27 台帳を開いた直後や何か操作した直後に、コマンドボタンを押すと、どんなメッセージが出ますか?
りんご様
ありがとうございます。
いくつか試したところ、複数列あるコードで表示してみたところ、最終列が表示されていないことがわかりました。昨日の[8]が表示されないのも、これが最終列なためと思われます。
一番最初に質問させていただいたところに記載したURLを参考に以下記載しています。というか、まるまるコピーです。
りんご様の方法で行けそうな気もしますが、どのような記載をすればよいかお分かりでしたらご教授願います。
Private Sub Report_Open(Cancel As Integer)
Dim db As DAO.Database
Dim qd As DAO.QueryDef
Dim cnt As Integer
Dim fld As DAO.Field
Set db = CurrentDb()
Set qd = db.QueryDefs(Me.RecordSource)
For cnt = 2 To qd.Fields.Count - 2
Set fld = qd.Fields(cnt)
Me("Label" & cnt).Caption = fld.Name
Me("Field" & cnt).ControlSource = fld.Name
Me("Total" & cnt).ControlSource = "=Sum([" & fld.Name & "])"
Next
End Sub
また、今後のこと考え、別途フォームにてコードを指定し、そこからレポートを表示する方法で検討してみました。
コードを指定し、トグルのイベントに以下記載しました。
DoCmd.OpenReport "R_レジメンワークシート", acViewPreview
レポートは指定したものが表示されたのですが、すべてのコードで列がすべて表示されなくなってしまいました。
access難しい。。
重ね重ね申し訳ございません。


よろしくお願いします。
りんご様 ご回答ありがとうございます。
フォームはテーブルを使っています。
だけのものです。
テーブルT1自体に、問題点は見当たりませんでした。
F27フォームは、F28というサブフォームを持っています。
F28を削除したところ、F27を閉じるときのエラーは一切発生しませんでした。
F28を単体で開いた場合、F28を閉じるときのエラーは一切発生しませんでした。
ちょっと訂正
「
」T2
はT01部品マスタ
の代わりとして使える「この部分の
T01部品マスタ
を参照するときはT2
を使う」「あだ名」と言ってしまうと、
T01部品マスタ
もT2
も同じモノを指すことになります(両方使えそう)が、エイリアスを指定した場合T01部品マスタ
は使えなくなり、代わりにT2
だけが使えるようになります単独でダメなら、いっぺんに全件更新せずに何件ずつかにわけるとか、不要なデータを分離するとか、そもそも更新でやりたい事が適切か第三者にアドバイスを求めるとか、素人考えですが。
こういうイメージで合ってますか?
念の為、レポートの非連結テキストボックスに諸々を設定するコードを確認して頂けますか。For…Nextで、初期値から繰り返し回数まで、となっていると思いますが、この繰り返し回数がもう1回増えるように書き換えると、どうでなりますか?
りんご様
なんどもありがとうございます。
レポートのレコードソースのクエリにて抽出しました。データシートビューでは添付画像のように[8]が表示されています。他のコードを入力してもデータシートビューではすべて表示されるが、レポートになると一部表示されていないようです。これは別に問題ありそうですね。。
SQLです。
TRANSFORM Sum(Tレジメンリスト2.投与量) AS 投与量の合計
SELECT T_レジメン名.[レジメンコード], T_Rpリスト.Rp名
FROM (T_Rpリスト INNER JOIN Tレジメンリスト2 ON T_Rpリスト.Rpコード = Tレジメンリスト2.Rpコード) INNER JOIN T_レジメン名 ON Tレジメンリスト2.[レジメンコード] = T_レジメン名.[レジメンコード]
WHERE (((T_レジメン名.[レジメンコード])=11031))
GROUP BY T_レジメン名.[レジメンコード], Tレジメンリスト2.番号, T_Rpリスト.Rp名
ORDER BY T_レジメン名.[レジメンコード], Tレジメンリスト2.番号
PIVOT Format([投与day],"@@");
フィルターで抽出したという事かな。レポート機能にあまり詳しくないのであれですが、メインレポートSQLにWHERE句を追加する方向でチャレンジするとどうなりますか?
WHERE T_レジメン名.レジメンコード=11031