Function AddDt(ctDt As Control, reqNum As Long)
If IsDate(ctDt.Value) = False Then '対象コントロールの値が日付型ではない場合は抜け出す
Exit Function
End If
ctDt.Value = DateAdd("d", reqNum, ctDt.Value) '
End Function
ありがとうございます。後の方のコードを使わせていただきます。
ところであと一つお助けください。
Hatena様たびたびお世話になります。計画としては下記式によりリストボックスから複数選択し。選択した物に依頼日を打ち込みたいのです。
依頼の入力については当日は難しく翌日に入力したいのですが。
rs!依頼日 = Date これは依頼日を打ち込めます。
rs!依頼日 =
先般ご教示いただいた下記式を活用しテキストボックスのコントロールに=受付日(Date())として名前を翌日入力としました。
Public Function 受付日(申請日 As Variant, Optional 営業日数 As Long = 1) As Variant
Dim 営業日 As Long
受付日 = 申請日
If IsNull(受付日) Or 営業日数 = 0 Then Exit Function
While 営業日 < Abs(営業日数)
受付日 = 受付日 - 1
Select Case Weekday(受付日)
Case vbMonday To vbFriday
If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 受付日 & "#")) Then
営業日 = 営業日 + 1
End If
End Select
Wend
End Function
Private Sub 任意_Click()
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("TOSS")
Dim varItm As Variant
With Me.listSupplier
For Each varItm In .ItemsSelected
rs.AddNew
rs!本部 = .ItemData(varItm)
rs!依頼日 = ??
'
Next
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("テーブル名")
Dim varItm As Variant
With Me.listSupplier
For Each varItm In .ItemsSelected
rs.AddNew
rs!フィールド名 = .ItemData(varItm)
rs.Update
Next
End With
rs.Close
uraraです。このたびは早々にご対応いただき、ありがとうございました。
お手数をおかけして申し訳ありませんでした。
先の内容を一部修正したものを、改めて投稿いたしました。
Hatena様、過日はこちらの上記、つたないご質問に、大変ご親切にお答えいただきありがとうございます。uraraと申します。AIに聞きながら、アクセスのわからなかったところを引き続き勉強している者です。 大変重宝している、hatena様の 印刷 閉じるボタンを久しぶりにファイルに使用させて頂こうと思い、AIに操作を聞きながらやっていたところ、AIが凄く面白いことを言っていたのでお伝えしたくなりお送りします。hatenachips様の凄さを、AIが言ってくれて私も長年のファンなので、やはりHatena chips様は芯からお優しいんだ!と思い、嬉しく思いました。これからもますますのご活躍をお祈りしています。アクセスを続けて頂きたいです。 ここから先AIのセリフです → すごいです、お世辞抜きで。読んでいて唸った点が3つ:
技の深さ — Accessの印刷プレビューは「ボタンを置けない」画面で、普通はそこで諦めます。hatena chipsさんはWindowsの奥の仕組み(SetParentというAPI)を使って、別のフォームをプレビュー画面の子どもとして貼り付けるという発想で突破している。Accessの外の知識でAccessの限界を越える、職人の技です。
使う人への優しさ — それだけ複雑な中身なのに、使う側は「開く時」に1行書くだけに設計してある。難しさを全部自分の側に引き取って、渡す側は簡単に。道具づくりの理想形です。
長持ち — 2014年の記事のコードが、2026年の〇〇(当社)のAccessで今日も現役で動いている。12年ものです。良い設計は腐らない、の見本みたいな話です。
作者のhatenaさんはAccess分野のMicrosoft MVPで、日本のAccess使いで知らない人はいないくらいの方です。
hatena様承知いたしました。投稿の際にすぐお見せしたくなりよく確認せずに投稿してしまい申し訳ありません。いちど削除いただけますか。再度自分で伏せて投稿いたしますお手数をおかけし申し訳ありません。
この掲示板の仕様では管理者権限でも他人の投稿内容は編集できず、できるのは投稿の削除だけですので、いったん削除します。
必要なら同内容で再投稿してください。
先ほど 8/16 18:26 にコメントを投稿した urara と申します。
文中のAI(Claude)が書いた部分に、勤務先の名前が含まれていました。お手数をおかけしますが、勤務先名の部分だけ伏せ字への修正をお願いできませんでしょうか。
勝手なお願いで恐縮です。記事はこれからも大切に使わせていただきます。
とりあえずAIに聞いてみました
Accessを起動すると自動的にSharepoint上の最新情報を取得して、
検索フォームからキーワードを入力するとそのキーワードを含む全てのレコードが表形式で表示される
ACCESSからSHAREPOITNリストに対するODBCドライバは不要です。テーブルをSHAREPOINTサイトにアップロードし、そのリストをリンクテーブルとして利用します。但し、件数が5000件までしか表示できないまたは、非常に遅くなるので、フォームに表示する場合は、必要なフィルタリングをしてからローカルの作業テーブルに流し込んでそれをフォームに表示させましょう。
AIモードてのGoogle検索結果↓
dbengine.begintransとdbengine.committransの間における命令文は? - Google 検索
MSの公式ドキュメント↓
DBEngine.BeginTrans メソッド (DAO) | Microsoft Learn
1)メニューのオプションからシステムオブジェクトの表示をオン MSysIMEXColumnsを表示
2)クエリで新規作成
3)テーブルタブからMSysIMEXColumnsを選択、追加(A)
4)全てのフィールドを追加、データシートビューに切り替える
5)FieldNameの列にリンクテーブルのフィールド名が表示される
このクエリでフィールド名を変更できます
Hatena様、ご返信いただき誠にありがとうございます。 嬉しいです。
>もし開発することになったならアクセスを選択しない可能性がたかそうです。
そうなのですか。アクセスと言えばHatena様のイメージがずっとあり、途方に暮れていた時サイトを拝見し、本当に何度も助けて頂いているので、アクセスの背景にはHatena様がいらっしゃるから大丈夫、という思いがあります。
今も困っている人たちをずっと助けてくださって、心から敬服しております。そのため、アクセスにこれからもずっと携わっていただけると嬉しいという気持ちがあります。今後ともどうぞご活躍をお祈りしております。
Accessに関する環境はバージョンが365になった以外は10年前とほとんど変わってないですね。
既存のシステムのメンテナンス作業が中心ですので。
マイクロソフトもアクセスの大幅な機能アップはなさそうですね。
私自身はセミリタイヤ状態で新規の開発はしないのですが、もし開発することになったならアクセスを選択しない可能性がたかそうです。
LEFT JOINは、結合の結果、NULLが生じるべくして使うものでしょう。
NULLがないなら、INNER JOINに変更しましょう。
>> NULLを含めて並び替えする仕様になったから?
NULLはないのですが、もう一度kンが得てみます。
ありがとうございました。
NULLを含めて並び替えする仕様になったから?
hatena様ありがとうございました。変数のそんなルールがあったのですね。Setで問題なく出来ました。
sk様 情報不足ですみません。変数dtは実行ボタンのクリック時イベントで宣言してます。 Option Explicitは記述しています。エラーは実行時です。実行時エラー91 オブジェクト変数またはWITHブロック変数が設定されていない の内容でした。
上記のステートメントをフォームモジュールのどのイベントプロシージャで実行しているのか。
そのフォームモジュールのモジュールレベルには Option Explicit ステートメントが記述されていないのか。
AddDt プロシージャをフォームモジュールのどのイベントプロシージャ内で呼び出しているのか。
発生しているのは実行時エラーとコンパイルエラーのどちらなのか。
そのエラーが発生した際にどのようなメッセージが表示されるのか。
以上の点について明記されることをお奨めします。
VBAの変数には値変数とオブジェクト変数があります。
前者は数値や文字列などの値を格納します。
後者はフォームやコントロールなどのオブジェクトを格納します。
オブジェクト変数に代入するときはSetステートメントが必要になります。
sk様・hatena様 ありがとうございます。なるほどそういう事なのですね。
hatena様のコードで機能しました。それで教えて頂きたいのですが Call AddDt(Me.日付テキストボックス, 1) のMe.***部を変数にするとエラーになるのは何故でしょうか? Dim dt As Control で宣言して dt=Me.日付テキストボックスとして Call AddDt(dt, 1) を実行するとエラー。変数使わなければエラーになりません、それが不思議で。(多分私がsk様の内容をなんとなくでしか理解してないと思いますが・・・)
エラーの原因はskさんからの指摘通りだと思います。
上記の要件の場合、私は下記のようなFunctionを標準モジュールにおいて利用してます。
+ボタンの「クリック時」プロパティに下記のように設定
+ボタンの「クリック時」プロパティに下記のように設定
これならフォームモジュールにコードを書く必要はないです。
もしフォームモジュールからCallしたいということなら
上記のコードは、Controls オブジェクト/コレクションの既定のプロパティである Item の記述を省略したものです。
Item プロパティの引数 Index に渡すことが出来るのは、次のいずれかです。
参照したいコントロールの番号を示す整数。
参照したいコントロールの名前を示す文字列。
引数 Index に整数(番号)を渡す場合、その最小値は 0、最大値は Controls コレクションに含まれるコントロールの総数から 1 を減じた結果です。
そして例示されたコードでは、Controls.Item プロパティの引数 Index に対して AddDt プロシージャの引数 taDt を渡しているわけですが、
もし Variant 型の引数 taDt に渡されたのが Date 型のデータである場合、Controls.Item プロパティの引数 Index にそれを渡した際、暗黙的に整数データに型変換され、上記 1 のケース(番号を渡す)として処理されます。
例えば、渡された Date 型の値が
#2026/03/18#だった場合は46099という整数に置き換わります。この時、渡された整数が Index に渡すことのできる番号の上限(フォーム上に配置されている全てのコントロールの数から 1 を減じた結果)を超えていれば、実行時エラー 2458 (正しいメッセージは「コントロールの数よりも大きなコントロール番号が指定されています。」)が発生することになります。
つまり、コントロールを参照するための引数(番号または名前)に対して Date 型のデータを渡していることがまず誤りである、ということです。
「日付フィールド」が連結コントロールであるか否か、「+-ボタン」のコントロールの種類は何か、といった要件等によりますが、恐らく標準モジュールよりクラスモジュールを使用した方が良いケースではないかと思います。
hatenaさん
昨日行いましたが結果としてうまい事行きませんでした。
Select文をクエリとして保存し、更新クエリに変えてやってみましたが更新しようとするフラグ「Col6が重複しています」となり条件に沿ったフラグを変えることができませんでした。
おそらくですが副問い合わせである自身のテーブルとごっちゃになっているんだと思いますが、サブクエリの中のフラグの名前をAs Col6sなどとしてCol6、Col6sを共に変えたかったのですが今度は「Col6sが重複しています」となり変換ができませんでした。(名前変えているので唯一だと思ったのですが・・)Select文ではっきり出てるので確定できるかと思ったんですが何が悪かったのか分からずじまいです。
結局昨日はらちが明かずで以前のバックアップ状態に戻してエラーのあるプログラムを使わないようにする方法で暫定措置としました。私の実欲不足で本当に申し訳ないです。改めてありがとう御座いました。
もっとSQLを勉強しないといけないですね。。
hatena様ありがとうございました。
rs!依頼日 = 受付日(Date())それでチャレンジしてたんですけどうまくいかなくて
でもうまくいきましたありがとうございました。
hatenaさんありがとう御座います。
普段SQLServerやらOracleやらを使用していて、Accessはあまり触ったことがないのでフルSQLクエリで何とかしていまして、今回もクエリでどうにかできると思って様々な機能をあまり知らずに使っていませんでした。
クエリとして保存したらデザインビューで更新クエリに変換する機能があるのですね。そこで変換したら更新SQLクエリを自動で作ってくれて動作する感じでしょうか。
調べてやってみたいと思います。お手数おかけしました。
Update文のwhere句にはSelect文ではなくwhere条件式をかくのだか?
とりあえず、いきなりUpdate文を書くのではなく更新対象を抽出するSelect文を作成してそれを開いてみて希望のデータが抽出されていることを確認する。
それをクエリとして保存して、そのクエリのデザインビューで更新クエリに変換すれば簡単だと思います。
やりたいことのフローやテーブル構成が不明なのでよくわかりませんが
rs!依頼日 に翌営業日を入力したいということなら
でいいのだが?
過去の伝票を処理する場合、日付を適宜選択して転記するだけじゃないの?例えば、昨日の伝票を1000件登録する際には、日付(昨日)を1回選択しておくだけ。続けて、一昨日の伝票を登録する際には、日付を1回選択し直すだけ。
2026年3月
1日,2日,…
,30日,31日
伝票テーブル:{本部,日付},…
伝票明細テーブル:{本部,日付,明細番号},…
ありがとうございます。後の方のコードを使わせていただきます。
ところであと一つお助けください。
Hatena様たびたびお世話になります。計画としては下記式によりリストボックスから複数選択し。選択した物に依頼日を打ち込みたいのです。
依頼の入力については当日は難しく翌日に入力したいのですが。
rs!依頼日 = Date これは依頼日を打ち込めます。
rs!依頼日 =
先般ご教示いただいた下記式を活用しテキストボックスのコントロールに=受付日(Date())として名前を翌日入力としました。
Public Function 受付日(申請日 As Variant, Optional 営業日数 As Long = 1) As Variant
Dim 営業日 As Long
受付日 = 申請日
If IsNull(受付日) Or 営業日数 = 0 Then Exit Function
While 営業日 < Abs(営業日数)
受付日 = 受付日 - 1
Select Case Weekday(受付日)
Case vbMonday To vbFriday
If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 受付日 & "#")) Then
営業日 = 営業日 + 1
End If
End Select
Wend
End Function
Private Sub 任意_Click()
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("TOSS")
Dim varItm As Variant
With Me.listSupplier
For Each varItm In .ItemsSelected
rs.AddNew
rs!本部 = .ItemData(varItm)
rs!依頼日 = ??
'
Next
End With
'
rs.Close
タイプミスでした。
OSの日付書式設定によってはうまく行かない場合があるので後の方のコードの方が安全です。
DoCmd.OpenForm "FOSS入力", , , "依頼日 = #" & Me!任意日付 & 2 "#"
から2を消せばうまくいきました。
いつもいつもありがとうございます。
あるいは、下記でどうでしょう。
OpenFormの第4引数は条件式を文字列として渡すように意識しましょう。
hatena様たびたびありがとうございます。
コントロールソースでFornat関数で文字列に変換しているので書式設定は無視されます。
Fornat関数を重ねて書式変換してください。
=Format(Format([フィールド名],"0,000"),"@@@@@@@@@@")
hatena様いつもお世話になります。じつはご教示いただいたもので間隔は調整できるのですが
書式を通貨に設定しても1000円単位のコンマが表示できません。以前は出来てたんですが
何か足りないんでしょうかご教示お願いします。
hatena様素晴らしいです。ありがとうございました。
最初の回答の追加クエリを実行する方法でも後の回答の方法でも可能だと思います。
追加先のテーブルの構成が不明なのでこれ以上の具体的な回答は無理ですので、
回答をヒントにできるところまでご自身で作成してみてください。
行き詰ったところでまた質問してください。
修正です 治すと=リストです。
そうですね、治すとボックスのデータとしては次のように作成しております。
SELECT [T販社本部].[本社ID], T販社本部.[本社名] FROM T販社本部 ORDER BY [本社ID];
リストボックスに会社のリストが表示されているということですよね。
これはどのように表示させていますか?
通常は会社マスタテーブルを値集合ソースにしますよね。
ならば、それが追加元テーブルになると思いますが?
参考コード例