INSERT INTO T_送付 ( 送付用案件ID, 得意先ID, 月 )
SELECT DISTINCT T_案件.案件ID, T_案件.得意先ID, T_案件.月
FROM T_案件 LEFT JOIN T_送付 ON T_案件.案件ID = T_送付.送付用案件ID
WHERE (((T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) And T_送付.送付用案件ID Is Null;
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
Dim Left As Single
Dim Top As Single
Dim Width As Single
Dim Height As Single
Me.ScaleMode = 1
Left = -20
Top = Me.Height - 8
Width = Me.ScaleWidth + 20
Height = Top
Me.ForeColor = RGB(0, 0, 0)
Me.DrawWidth = 7
Me.Line (Left, Top)-(Width, Height)
End Sub
「F_注文」フォームはコードが記述してあるフォームとは別のフォームですか。
サブフォームではないですか。
別のフォームの場合、そのフォームは開いていますか。
提示のコードでは変数に値が代入されていないので、正常には動かないですよね。
実際にボタンのクリック時に記述している正常に動くコードを提示してもらえますか。
MsgBox bPath &"が見つかりません。"
↓
MsgBox bPath & aName &"が見つかりません。"
元々変数を使っていなかったところを、昨夜変数にしたのですが、部分的に変換間違いでおかしいところがあるようです…スミマセン。
AcDirは、下記サイトを採用させていただいております。
https://www.feedsoft.net/access/tips/tips47.html
ありがとうございます。
コードを記載します。
返り値が必要ならFunctionプロシージャ、返り値が必要なければSubプロシージャを使えばいいでしょう。
とくに返り値がなくても処理が成功したか、失敗したかを返すためにFunctionにすることはよくあります。
具体例があったほうが分かり安いと思いますので、現状の「ファイル1を保存する」のコードを提示してもらったら、それをもとにどのように汎用関数(プロシージャ)にするか説明できると思います。
本当にすみません。なぜか単票に切り替わっていました。帳票で表示されるようになりました!!!
また絞込み等で不明な点出て来たら質問させていただきます。
ありがとうございました!
メインフォームで表示件数を(Dlookup)表示させているのですが、件数はあっているようです。
実際は1件しか見えません・・??
ありがとうございます。サブフォームは必要ないとの理解で、
下記のコードにしてみたのですが、検索結果が帳票の1件だけとなります。
なぜでしょうか
'独立したポップアップフォームからメインフォームを参照する'
Forms!メインフォーム.form.filter = strFilter
サブフォームにする必要はなく、それぞれ独立したフォームとして作成します。検索フォームはフォームのプロパティでポップアップとして表示されるよう設定しておきます
メイン-サブの関係であれば
のように、メイン(Me)からサブフォームのフィルタープロパティにアクセスできますが、フォームが独立している場合はしっかりフォームを指定する必要があります
Me(自分自身)ではないので、きちんと名前を使って相手を特定するという部分に注意すれば問題なく作成できると思います
確かに「>」が抜けてました(うっかりミスです。)…ご指摘いただき助かりました。
その他の部分もあれこれやってもうまくいかず悶々としておりましたが、これでスッキリしました!
高度な技を教えていただきありがとうございます!!
大変勉強になりました。今後も使える技で、とても助かります。
>「トップフォーム」を閉じない(不要の場合は、閉じずに非表示にておく)
ここらへんの設計は後回しにしているので、いずれ質問させていただくかもしれません。。
あとは、VBAでグローバルな変数を用意するとかですかね
「案件フォーム」のレコードソースで「
ファイルパス: [TempVars]![FolderPath]&ファイル名
」なフィールドを用意しておけるとかなかなか良さげですねなるほど理解できました
ありがとうございます
セクションの高さの位置に描画すると、太い場合はセクションの範囲からはみ出るので、はみ出ないようにすこし上に移動させるという意味になると思います。
下記のようなイメージだと思ってます。
マクロの「一時変数」というのがあります。
"SetTempVar/一時変数の設定" マクロ アクション - Access
VBAからは、TempVars オブジェクト として参照できます。
TempVars オブジェクト (Access) | Microsoft Docs
下記のような感じで使えます。
TempVars!FolderPath
の部分はTempVars("FolderPath")
とすることもできます。TempVars(0) とインデックスで参照することなできます。データベースファイルを閉じるまでは、使用できます。
マクロで参照したり、フォーム、レポートのコントロールソースからも下記のような感じで参照できます。
=[TempVars]![FolderPath]
また、クエリからも [TempVars]![FolderPath] という式で参照できます。
なかなか便利な機能だとおもいます。
まとめると、
「トップフォーム」を閉じない(不要の場合は、閉じずに非表示にておく)なら、「トップフォーム」に表示のテキストボックスを配置してそこに格納しておく。
「トップフォーム」を閉じる場合があるなら、TempVars に格納しておく。
データベースファイルを閉じても、保存しておきたい。次に開いたとに前回のものを参照したいという場合は、テーブルに格納しておく。
というように使い分けるといいでしょう。
なるほど、よくわかりました。
トップに置きたいのですが、閉じる可能性があるので今回はやめておこうと思いますが、今後の参考になりました!
ありがとうございます!!
厳密な話をしだすとアレですが、一時的に使うだけなら
DLookupする代わりにフォルダパスを指定するダイアログをこのタイミングで呼び出す(VBAのみでフォルダパスを扱う)
案件フォームに非連結の「フォルダパス」テキストボックスを設置して、フォルダパス格納機能も案件フォームに設置する
フォルダパス取得を「トップフォーム」でやりたいのならフォルダパス取得部分は上記同様にトップフォームに作って、案件フォームからトップフォームを参照する
など、アクセスを終了したら保存しなくてもいいデータならテーブルにもつ必要はないですね
結合の設定が正しくできてないですね
結合プロパティで「'T_案件'の全レコードと'T_送付'の同じ結合フィールドのレコードだけを含める。」にチェックを入れましょう
INSERT INTO T_送付 ( 送付用案件ID, 得意先ID, 月 )
SELECT DISTINCT T_案件.案件ID, T_案件.得意先ID, T_案件.月
FROM T_案件 LEFT JOIN T_送付 ON T_案件.案件ID = T_送付.送付用案件ID
WHERE (((T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) And T_送付.送付用案件ID Is Null;
「月」フィールドについて
日付型にしたフィールドで「2020/09」のように「(年)月」だけを保存しようとすると、データとしてはその月の1日とした日付で保存されます(厳密に「月」だけを指定したデータとしては保存できません)
この仕様のもとデータ管理が完璧なら抽出条件は上に挙げたように
(T_案件.月)=DateSerial(Year(Date()),Month(Date()),1)
だけで満たせますが、「日付型」にしたフィールドで指定していない日付部分はどうなってるかわからない的な怖さがあるのでちゃんと範囲指定してあげたほうがいいと思います(T_案件.月)>=DateSerial(Year(Date()),Month(Date()),1) And (T_案件.処理月)<DateSerial(Year(Date()),Month(Date())+1,1))
ばっちりです!こういうときのためのDLookupなのですね…忘れないようにしなければ…
ところで、やはりフォルダパスはテーブルに格納する必要がありますよね。
このテーブルはこのフォルダパスのためにしか存在していないのですが、アクセスではテーブル以外にデータを入れる場所はありませんよね。
このファイルの移動はどのようにしてますか。
VBAなら、クエリで生成しなくても、VBAのコードで生成すればいいだけでは。
ごめんなさい。一部うつしまちがっていました。
こちらでお願いいたします。
INSERT INTO T_送付 ( 送付用案件ID, 得意先ID, 月 )
SELECT DISTINCT T_案件.案件ID, T_案件.得意先ID, T_案件.月
FROM T_案件 INNER JOIN T_送付 ON T_案件.案件ID = T_送付.送付用案件ID
WHERE (((T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) And (T_案件.月)<DateSerial(Year(Date()),Month(Date())+1,1));
スミマセン、うまくいかないのでコピペします。
INSERT INTO T_送付 ( 送付用案件ID, 得意先ID, 月 )
SELECT DISTINCT T_案件.案件ID, T_案件.得意先ID, T_案件.月
FROM T_案件 INNER JOIN T_送付 ON T_案件.案件NO = T_送付.送付用案件NO
WHERE (((T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) And (T_案件.処理月)<DateSerial(Year(Date()),Month(Date())+1,1));
実際のSQLから不要なところを抜いていますので、もしかするとおかしなことになっているかもしれません。気を付けたつもりなのですが、その際は申し訳ありません。
この先は実際のクエリを提示してもらわないと何ともですが、
「案件テーブルの案件ID」と「送付状テーブルの案件ID」を一対多で結合して、[送付状テーブル].[案件ID]フィールドの抽出条件を「
Is Null
」とすればいいのではないかと思いますクエリは[ホーム]タブの[表示]からSQLビューとデザインビューが切り替えられるので、SQLビューに切り替えて表示されるテキストをコピペすると話がスムーズに進みますよ
よく理解できました。ウッカリしておりました…ありがとうございます。
とりあえず
のほうへの回答ですが、
Date()
は今日の日付を表す日付型のデータですね。めんどくさい言い方をすると、1899/12/31を1として、今日まで1日ごとに1を加算した数値を返します。これを何らかの方法で日付として表示すると2020/09/01のように画面上では見えるわけですLeft()
は文字列に対して左からn文字を取り出す関数ですね。Date()
は文字列ではないので自動の型変換が起こります結果どうなるかというと、
Left(Date(),7)
はLeft("44075",7)
(Date()=2020/09/01の場合)として処理されます。クエリの結果が同じになるのはたまたまですが、「今月のデータを抽出したい」という要求を満たせないのは一目両全ですね日付型は人間にわかりやすい見た目をしていても内部では数値で扱われているということを覚えましょう
日付型のフィールドで具体的に「今月」で抽出するなら
と、期間指定で抽出する形になります
ありがとうございます。
基本的に毎回フォームを開く際に追加クエリが起動しているので
重複データがあってのメッセージなのですが、
やはり非表示にはしないほうがいいですよね…
メッセージを表示しないようにするは簡単ですが、
「追加クエリで全てのデータを追加できません」が発生する原因を特定して、それが発生しないようにすべきだと思いますがどうでしょうか。
原因がわかっていて、別に影響かないことを確認済みならいいですが。
対症療法て症状を見えないよう(メッセージ非表示)にして、気が付かないうちに病理が進行していてとんでもないことになっていないか不安です。
※補足
>2つのテーブル
案件テーブルと送付テーブルになります。
>外部の3パターン
結合の3パターンの間違いです。
早速のご回答ありがとうございます。
①>メッセージの内容が不安なら追加クエリできちんと追加できるデータだけに絞り込めばいいでしょう
おっしゃるとおりで、そうしたいと思っていたのですがうまくできずインデックスに頼った次第です。
追加クエリ「案件ID」フィールドの抽出行に「<>[T_送付]![送付用案件ID]」と入れたところパラメータの入力ボックスが表示されました。それ以外にも、クエリの上の画面に2つのテーブルを表示させ、外部の3パターンでつないでみたり色々試してみたのですが、望みの結果が得られませんでした…
どうすれば案件IDが重複しないように追加クエリを実行することができるのでしょうか。
②追加の質問ですみません。今月データを抽出する際、日付の入ったフィールドのクエリの抽出行に「Like Left(Date(),7) & "*"」と記載しても「Left(Date(),7)」と記載しても結果が同じで不思議に思っています・・なぜなのでしょうか。
メッセージの内容が不安なら追加クエリできちんと追加できるデータだけに絞り込めばいいでしょう
メッセージそのものを出したくないのならメッセージ表示の設定を切り替えればいいです
オブジェクトの削除とアクションクエリの確認メッセージを有効または無効にする
うまくいきました!初歩的なミスでスミマセン。ありがとうございました。
としてください。
フォーム名は実際のものにしてください。
確認しました
指示通りやったらきれいになりました
「代替の背景色」を「代替の行」などの兼ね合いで線が少し消えたりしていたのでしょうか?
後学のために教えていただきたいのですが
Left = -20
Width = Me.ScaleWidth + 20
はそれぞれ詳細から少しはみ出して線を書くためとわかりました
Top = Me.Height - 8
Height = Top
はなぜ高さから引くのですか?
足して高さより少し下からラインを引くのではないでしょうか?
上記記載内容で、Accessで使えるマクロを公開しているサイトを見つけ、解決いたしました。
すみません、ありがとうございました。
フォルダの存在確認
おかげさまで、フォルダのコピーはできるようになりました。
欲張って、該当のフォルダがあるかどうかをファンクション関数を使って確認したいと思い
上記のサイトのDir関数を参考に
標準モジュールにファンクション関数をはって、「Sub IsExistDirA利用例()」を
フォームのボタンクリックに入れてみましたが
「SubまたはFunction定義がされていません」とエラーが出ます。
AccessとExcelの違いがありますでしょうか…
欲張った質問で申し訳ありません。
ありがとうございます
明日コードをためさせていただきます
それにしてもなぜ太さがかわるんですかね
Me.DrawWidth = 1
だと太さは変わらないかもしれませんね
それも踏まえて明日試してみます
「代替の背景色」を「代替の行」にした場合、いろいろ調整して下記のようにすると、太さの差はほとんど目立たなくなりました。
線の両端は丸くなるのは、線の左端と右端を、詳細セクションからはみ出るように設定することで解決できるようです。
また、高さは線の太さよりすこし大きめの数値を引くとよさそうです。
「代替の背景色」を設定しているようですが、これを「色なし」に設定したらどうなりますか。
「代替の背景色」はたいてい「色なし」にしているのでそれで試していましたが、色を設定したら、太さが変わるという現象が発生しました。