Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
' As Integerは変数毎につける必要がある 省略するとVariant型になる
Dim p1 As Integer, p2 As Integer, p3 As Integer, p4 As Integer
Dim ht1 As Integer
p1 = Me.直線21.Left
p2 = Me.直線20.Left
p4 = Me.s_koment.Top
ht1 = Me.s_koment.Height
Me.Line (p1, p4 + ht1)-(p2, p4 + ht1)
End Sub
Private Sub fld1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then ' Enterキーが押された場合
On Error Resume Next ' エラー防止(最終レコード時など)
DoCmd.GoToRecord , , acNext ' 次のレコードに移動
KeyCode = 0 ' Enterキーの既定動作を無効化
End If
End Sub
Public Sub Sample()
Const ExcelFileName = "C:\test\Tbl1.xlsx"
DoCmd.TransferSpreadsheet acExport, 10, "Tbl1", ExcelFileName, True
Dim objExcel As Object, objWb As Object, objWs As Object
Set objExcel = CreateObject("Excel.Application")
Set objWb = objExcel.Workbooks.Open(ExcelFileName)
Set objWs = objWb.Worksheets(1)
objWs.cells.Font.Size = 10
objWb.Save
objWb.Close
objExcel.Quit
Set objExcel = Nothing
End Sub
hatenaさん ありがとうございます。
頂いたコードで上手く出来ました。確かにそうですね、サブクエリでしたらいいのですね。
Parentの事も初めて知りました。親フォーム参照時に便利ですね。毎回こういった事も大変勉強になります。
お世話になりました。
ご解答ありがとうございます。
ACCESSは聞ける人がいなく独学でやっているもので、まず私の拙い文章をくみ取っていただいたことが嬉しいです。
A,Bどちらの方法でもうまくいきました。ありがとうございます。
IIf関数を使用すればよかったのですね。クエリで違う関数でやってみたのですが、作業員すべてを表示したいのに対象の値しかでないので(←あたりまえですね)作業員すべて出すにはレポートで条件付き書式でしか不可能かと思いこんでいました。
おっしゃる通り一つのテキストボックスに3パターンを入れ込もうとしてました...
A,Bの提案のおかげで円滑にレポートが作成できました。ありがとうございます。
初めての質問で不安でしたがhiroton様の説明とても分かりやすく、本当に助かりました。
入社日と退職日は別列で表示してるので、ダブっていても問題はありません。ご配慮ありがとうございます。
お陰様でより良いレポートが完成しました。素晴らしい解答を本当にありがとうございます。
これがどこから出てきたのかわからないけど、年を年度に変えたい=月をずらしたいならDateAdd 関数を使うとよいでしょう
Year(DateAdd("m", -3, Date()))=Year(DateAdd("m", -3, [入社日]))
の比較を行えばいいですね「印刷したくない」のが目的であれば、そもそも印字データを出力しないようにするほうがわかりやすいと思います。上記条件を使って、
A.クエリでデータ表示用フィールドを作る
B.レポート上の非連結テキストボックスで計算する(非連結のテキストボックスを配置してコントロールソースに計算式を設定する)
※レポート上に「入社日」テキストボックスが必要(可視プロパティを「いいえ」にして非表示にする)
一つのテキストボックスで3パターンの表示を考えてるんでしょうか?1年以内に退職した場合(入社日と退職日が両方表示される場合)はどうするんでしょう?
「入社日を表示する/しない」であれば、上記のように計算式でデータの出力を制御すれば、条件付き書式を使わず表現できます
上記の仕様なら、下記のようなSQLでどうでしょうか。
hatenaさん ありがとうございます。
会社テーブルはT3:会社ID(数値型), 会社名(テキスト型)の構成です。
この作業用のフォームということでしょうか。つまり、T1、T2、それぞれのマスターテーブルのメンテナンス用ということでしょうか。
メインフォームに表示されている部材を持っている会社がサブフォームに表示されている。
この会社を削除したり追加したりする。
追加するときに、コンボボックスで選択するが、そのときに既に入力済みの会社はリストから除外する。
上記の仕様でいいですか。
だとすると、別に会社マスターテーブルが必要だと思いますが、そのテーブルの情報も提示してください。
hatenaさん ありがとうございます。
仕様としては部材毎にどの会社に預けているを設定しており、別の棚卸し入力フォームで部材選択を絞り込む時に便利なのです。同じ部材の対象がA社、B社等複数あったり、棚卸外の分は未設定もあります。
なので部材登録フォーム(T1が基)にサブフォーム(T2が基)を設定してます。部材が大量にあるので在庫対象会社に対して部材IDを設定する方が大変だと思い、そうしてます。必用によって部材の在庫を持っている会社を追加、あるいは削除する事はあります。
ちょっと仕様が不明瞭ですが、
メインフォームのレコードソースがT1(部材テーブル)
サブフォームのレコードソースがT2(在庫対象会社テーブル)
ということでしょうか。
このフォームの目的はなんでしょうか。
T2(在庫対象会社テーブル)のメンテナンス用で、
部材の在庫を持っている会社を追加、あるいは削除するということでしょうか。
hatenaさん
》フォーマット時では印刷時拡張したときの高さは取得できません。
よくわかりました。詳しくご教示いただきありがとうございました。
フォーマット時で印刷時拡張を考慮して位置やサイズを計算してレイアウトを決定します。
フォーマット時では印刷時拡張したときの高さは取得できません。
印刷時にフォーマット時で決定されたレイアウトで出力します。
この時点で印刷時拡張されたときの高さを取得できます。
印刷時では直線コントロールの位置やサイズは変更できないので、Lineメソッドで直線を描画します。
hatena さん
早速 ご回答ありがとうございました。成功しました。
》「印刷時」イベントに記述してますか。
私は、「フォーマット時」に上記 vbaを記載していました。
「印刷時」に記載すると、狙い通りの結果を得られました。
実は、フォーマット時 と 印刷時の違いを知らなかったのです。
》「立体表示」プロパティに「下線付き」
こんな設定があるのも知りませんでした。これを指定すると、VBAを記載するまでもなく、目的を達成できました。
ありがとうございました。
Office2010とはずいぶん古いバージョンですが間違いないですか。
それだけ古いと下記の回答では対応してないかもしれませんので、その場合はご容赦ください。
テキストボックスの「立体表示」プロパティに「下線付き」という設定があります。その設定にすればVBAを使うまでもなく下線が表示できますし、印刷時拡張しても追従します。
上記ではうまくできないという場合は、質問のコードでいいと思いますが、このコードはどこに記述してますか。
テキストボックスを配置しているセクションの「印刷時」イベントに記述してますか。
テキストボックスが詳細セクションにあるのなら、下記のようになるはずです。
返信ありがとうございます。
非表示のほうで組み込んだところ画面もすっきりして思い通りの動作になりました。
ありがとうございました。
ポップアップフォーム名を F_Popup とすれば下記のようなコードになります。
ただ、Microsoft365だと最小化したポップアップフォームをユーザーが操作するのが難しいので、非表示にするほうがいいと思います。非表示でもポップアップフォームの抽出条件などは取得できます。
ちなみに、最小化または非表示にしたフォームを元に戻すor再表示させるのは、下記でOKです。
>>VBAですることになりますが、イベントはKeyDownではなくKeyUpが適切です。
hatena様ありがとうございました
ちなみに、Enterキーを入力したときのみ次のレコードへ移動したいということなら、
VBAですることになりますが、イベントはKeyDownではなくKeyUpが適切です。
「仕入」以降のテキストボックス(売上、利益)の「タブストップ」プロパティを「いいえ」にすればどうですか。
ただし、売上、利益 へはキー操作では移動できなくなりますので、マウスクリックする必要があります。
フォームの形は、アップロードしたものです。
フォームの形は、アップロードしたものです。
hatena様
返信遅れて申し訳ありません。
仰る通り、下記のSQL文で解決しました。
回答ありがとうございました。
確認ですが、
複数フィールドに主キーを設定しているのですか。
オートナンバーは重複しないので意味がないのでは?
ID(オートナンバー型)を主キーにして、合成キーはインデックス(重複なし)を設定するのが通常の設計だと思います。
また、追加クエリーにはオートナンバー型フィールドは含めないようにすべきだと思います。
hatenaさん ありがとうございます(連絡遅くなり失礼しました)。
フォーム再作しても状況変わらずでしたので、リレーションを見直しました。メインテーブルの顧客IDに色々設定しているのが間違えてました。顧客テーブルにするのが正解でした。メインフォームの入力用コンボボックスに対してリレーションしてしまってました。リレーションとルックアップを同じ様に考えてました。
正しく設定すると普通にレコード削除できました。
お世話になりました。
sk様
図まで添付していただきありがとうございます。
テーブルに関しては、その通りです。
クエリで00-0000-00-202410な文字列をExcelでもACCESSでも作成しています。
返信遅くなりまして申し訳ありません
ご丁寧な対応ありがとうございました。
わたくしのスキルでは1行ずつ解析する必要がありますので、これから取り組んでみます。
下記のサンプルコードでうまくいくことを確認しました。
エクスポートしたブックを、VBAで開いてフォントを変更するしかないような気がします。
Accessからエクセルを開いて操作する方法は下記あたりを参考に。
【Access VBA】AccessからExcelを操作する方法 #ポートフォリオ - Qiita
つまり、
Access 側の[MT_検索テーブル]の各レコードの更新前の状態がこうであるのに対し、
Excel 側の[転送用シート](恐らく実際は別のワークシート)の状態がこうだとして、
そのブックのいずれかのワークシートの「任意の日付が入力されているセル」が
選択されている(アクティブセルになっている)状態でマクロを実行したら
Access 側の[MT_検索テーブル]の各レコードがこうなればよい、ということですか。
言われてみれば、exit sub(function)がなければ終了していないので、
下部のerrTrapの処理が行われてしまいますね。
変数を多用するケースではないので、
いちいちfunctionに飛ばすのも面倒だと思って飛ばさないようにしていたのですが、
途中で終了させるわけにはいかないので、
目障りではありますが、飛ばして処理する事に致します。
ありがとうございました。
そのフォームが破損しているのかもしれません。
一からメインフォームとサブフォームを作り直してみたらどうでなりますか。
hiroton様
貴重なご意見ありがとうございました。
>>問題解決のために何が必要か?複数のアプローチを検討・実施することが問題解決の近道になります
その通りだと思います。
今後に向けて精進します。
回答し辛い質問ですが・・・
プログラムは上から下に順番に実行されていきますので、
正常にレコードが更新されてからerrTrap:に飛んでいるのではなく、
更新後にerrTrap:移行の処理が順番に実行されています。
試してませんが、errTrap:の前でexit sub(function)で処理を抜けるようにすればいいはずです。
hirotonの回答は「実際に実行されたSQLを表示する」だけです
続く条件判定により「『更新されない』時だけSQLが表示される」ことを期待しています
結果を見てできることを質問者さんが考えてもいいですし、そのまま結果を提示してもらえれば問題解決に一歩近づくだろうという検証をするための情報を生み出すコードです
このコードの実行結果はいくつか想定されます。たとえば
Stop
行が実行され(処理が中断し)、SQLが表示された大きく分ければこの二つしかありませんが、SQLが表示されれば
のように、内容を深堀することもできます。当然、「SQLが表示されることなく処理が終了した」の結果ならその先の想定も無意味なものになるので、hirotonの最初のアプローチとしては「実際に実行されたSQLを確認してみては?」で止まっているわけです
回答で想定されているパターンを網羅するのは質問に対して不要な情報であふれることになりトピックの質が落ちますし、1つの正解以外は徒労というのもhirotonはやりたくありません
自己解決した内容をみるに、実行されるSQLは期待した文字列だったものと思われます。SQLが正しく実行されるかどうかのほうに問題があり、つまり、EXCELからの読み込み部分は問題ないのだと確認が取れるでしょう
ならば、EXCELのデータやその取り込み部分をいくら深堀したところで問題は解決しません
問題解決のために何が必要か?複数のアプローチを検討・実施することが問題解決の近道になります
クエリでは、更新できませんでしたが、テーブルに変更すると、更新ができました。
理由は不明です。
sk様 いつもありがとうございます。私の不手際で、気分を害されたら、お詫びします。
また、検証用のコードありがとうございました。
このようなコードで、検証できるように、精進します。
hiroton様
いつも回答ありがとうございます。
hiroton様の検証用のコードも理解できませんでしたので、理解できるように精進します。
お騒がせして申し訳ありません。
ありがとうございました。
hirotonさん
出来ました!
ありがとうございます、本当に助かりました!!
sk様返信ありがとうございます。
>>Access側のテーブル[MT_検索テーブル]のフィールド[直近3ヶ月]のデータ型は日付/時刻型なのでしょうか。
日付/時刻型です。
>>Excel 側のワークシート[転送用シート]において、K 列の各セルは J 列を含む他の列のセルを参照する数式セルなのでしょうか。
>>
また、[仕入コード]、[油種コード]および[単価_ランク_コード]に相当する列は、Excel 側のワークシート[転送用シート]に存在していないのでしょうか。
存在しています。
Cells(i, "A")⇒仕入コード
Cells(i, "E")⇒油種コード
Cells(i, "G")⇒単価ランクコード
Cells(i, "J")⇒日付コード
です
Access側のテーブル[MT_検索テーブル]のフィールド[直近3ヶ月]のデータ型は日付/時刻型なのでしょうか。
Excel 側のワークシート[転送用シート]において、K 列の各セルは J 列を含む他の列のセルを参照する数式セルなのでしょうか。
また、[仕入コード]、[油種コード]および[単価_ランク_コード]に相当する列は、Excel 側のワークシート[転送用シート]に存在していないのでしょうか。
ならば、そのように実行できるように手順を示すべきでしょう
自分の思うとおりに動いてくれなかったことの責任を相手に求めるのは良くないですよ
これは質問者であるとか回答者であるとかに関係することではありません
続く文に関しては特にhirotonが指摘している件とは無関係なのでノーコメントです
更新を実行したいクエリのSQL文は、下記の通りです。
仕入のフィールドの型は、
単精度浮動小数点型です。
昨日からのアドヴァイスをいただき、検証しました。
実際に利用している単価更新キーは
00-0000-00-202410
このような文字列です。
SQL文に記載のある
この値をつけると更新できませんが、この値をつけなければ更新できます。
00-0000-00 ⇒更新できます。
sk様のコードでも確認して、更新件数は合致します。
Excel上のマクロは下記の通りです。
疑問なのですが、
このコードを実行すると、202410になりますが、ExcelとACCESSでは、異なる値と判断されるのでしょうか?
単価転送
とは別のデバッグ用マクロとして示したものですので、そっくりそのままコピーして実行していただかないとむしろ困ります。少なくとも、実際に更新されたレコード件数が本当に 3 件であるならば、イミディエイトウィンドウにもそのように示されるはずであり、挙動としてあまりに不自然です。
もともと「
Sub 単価転送()
」とプロシージャを設定しているのにそっくりそのままコピーして実行したのではないからだというのはちょっと酷だと思いますよ