Microsoft Access 掲示板

6,733 件中 1 から 40 までを表示しています。
4
名前なし 2026/04/20 (月) 21:26:06 b6989@0e907

LEFT JOINは、結合の結果、NULLが生じるべくして使うものでしょう。

3
名前なし 2026/04/20 (月) 21:19:34 b6989@0e907

NULLがないなら、INNER JOINに変更しましょう。

2
naokei 2026/04/20 (月) 21:10:50 1e9b5@e5634

>> NULLを含めて並び替えする仕様になったから?
NULLはないのですが、もう一度kンが得てみます。
ありがとうございました。

1
名前なし 2026/04/16 (木) 21:22:43 6234c@0e907

このコードを追加したら、

 NULLを含めて並び替えする仕様になったから?

6
kameo 2026/03/18 (水) 14:51:24 9eaf4@2128d

hatena様ありがとうございました。変数のそんなルールがあったのですね。Setで問題なく出来ました。
sk様 情報不足ですみません。変数dtは実行ボタンのクリック時イベントで宣言してます。 Option Explicitは記述しています。エラーは実行時です。実行時エラー91 オブジェクト変数またはWITHブロック変数が設定されていない の内容でした。

5

Dim dt As Control で宣言

  • 変数 dt をどこで宣言しているのか。

dt=Me.日付テキストボックスとして

  • 上記のステートメントをフォームモジュールのどのイベントプロシージャで実行しているのか。

  • そのフォームモジュールのモジュールレベルには Option Explicit ステートメントが記述されていないのか。

Call AddDt(dt, 1) を実行するとエラー。変数使わなければエラーになりません

  • AddDt プロシージャをフォームモジュールのどのイベントプロシージャ内で呼び出しているのか。

  • 発生しているのは実行時エラーコンパイルエラーのどちらなのか。

  • そのエラーが発生した際にどのようなメッセージが表示されるのか。

以上の点について明記されることをお奨めします。

4

VBAの変数には値変数とオブジェクト変数があります。
前者は数値や文字列などの値を格納します。
後者はフォームやコントロールなどのオブジェクトを格納します。

オブジェクト変数に代入するときはSetステートメントが必要になります。

    Dim dt As Control
    Set dt = Me.日付テキストボックス
3
kameo 2026/03/18 (水) 12:48:55 9eaf4@2128d

sk様・hatena様 ありがとうございます。なるほどそういう事なのですね。
hatena様のコードで機能しました。それで教えて頂きたいのですが  Call AddDt(Me.日付テキストボックス, 1) のMe.***部を変数にするとエラーになるのは何故でしょうか? Dim dt As Control で宣言して dt=Me.日付テキストボックスとして Call AddDt(dt, 1) を実行するとエラー。変数使わなければエラーになりません、それが不思議で。(多分私がsk様の内容をなんとなくでしか理解してないと思いますが・・・)

2

エラーの原因はskさんからの指摘通りだと思います。


入力フォームに日付フィールドがありそれを+-ボタンで加算しています。複数のフォームを同様にしてますので、コードを共通化したいと思い下記のコードをモジュールに記述しました。

上記の要件の場合、私は下記のようなFunctionを標準モジュールにおいて利用してます。

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

+ボタンの「クリック時」プロパティに下記のように設定

=AddDt([日付テキストボックス], 1)

+ボタンの「クリック時」プロパティに下記のように設定

=AddDt([日付テキストボックス], -1)

これならフォームモジュールにコードを書く必要はないです。
もしフォームモジュールからCallしたいということなら

Private Sub DateAdd_Click()
    Call AddDt(Me.日付テキストボックス, 1)
End Sub
1
sk 2026/03/18 (水) 11:06:35 修正 97383@4e51d
Forms(foName).Controls(taDt)

上記のコードは、Controls オブジェクト/コレクションの既定のプロパティである Item の記述を省略したものです。
Item プロパティの引数 Index に渡すことが出来るのは、次のいずれかです。

  1. 参照したいコントロールの番号を示す整数

  2. 参照したいコントロールの名前を示す文字列

引数 Index に整数(番号)を渡す場合、その最小値は 0、最大値は Controls コレクションに含まれるコントロールの総数から 1 を減じた結果です。

Function AddDt(taDt As Variant,reqNum As Integer)

そして例示されたコードでは、Controls.Item プロパティの引数 Index に対して AddDt プロシージャの引数 taDt を渡しているわけですが、

If IsNull(taDt) Or IsDate(taDt) = False Then

もし Variant 型の引数 taDt に渡されたのが Date 型のデータである場合、Controls.Item プロパティの引数 Index にそれを渡した際、暗黙的に整数データに型変換され、上記 1 のケース(番号を渡す)として処理されます。

例えば、渡された Date 型の値が #2026/03/18# だった場合は 46099 という整数に置き換わります。

実行時エラー2458 コントロールの数よりも大きな番号になっている

この時、渡された整数が Index に渡すことのできる番号の上限(フォーム上に配置されている全てのコントロールの数から 1 を減じた結果)を超えていれば、実行時エラー 2458 (正しいメッセージは「コントロールの数よりも大きなコントロール番号が指定されています。」)が発生することになります。

つまり、コントロールを参照するための引数(番号または名前)に対して Date 型のデータを渡していることがまず誤りである、ということです。

入力フォームに日付フィールドがありそれを+-ボタンで加算しています。

複数のフォームを同様にしてますので、コードを共通化したい

「日付フィールド」が連結コントロールであるか否か、「+-ボタン」のコントロールの種類は何か、といった要件等によりますが、恐らく標準モジュールよりクラスモジュールを使用した方が良いケースではないかと思います。

3
かるみっくえーす 2026/03/10 (火) 13:05:28 a823b@9fb5a

hatenaさん
昨日行いましたが結果としてうまい事行きませんでした。
Select文をクエリとして保存し、更新クエリに変えてやってみましたが更新しようとするフラグ「Col6が重複しています」となり条件に沿ったフラグを変えることができませんでした。
おそらくですが副問い合わせである自身のテーブルとごっちゃになっているんだと思いますが、サブクエリの中のフラグの名前をAs Col6sなどとしてCol6、Col6sを共に変えたかったのですが今度は「Col6sが重複しています」となり変換ができませんでした。(名前変えているので唯一だと思ったのですが・・)Select文ではっきり出てるので確定できるかと思ったんですが何が悪かったのか分からずじまいです。
結局昨日はらちが明かずで以前のバックアップ状態に戻してエラーのあるプログラムを使わないようにする方法で暫定措置としました。私の実欲不足で本当に申し訳ないです。改めてありがとう御座いました。
もっとSQLを勉強しないといけないですね。。

7
tokinaito 2026/03/07 (土) 14:41:08 9e4e6@a5d99

hatena様ありがとうございました。
rs!依頼日 = 受付日(Date())それでチャレンジしてたんですけどうまくいかなくて
でもうまくいきましたありがとうございました。

2
かるみっくえーす 2026/03/07 (土) 12:53:13 a823b@9fb5a

hatenaさんありがとう御座います。
普段SQLServerやらOracleやらを使用していて、Accessはあまり触ったことがないのでフルSQLクエリで何とかしていまして、今回もクエリでどうにかできると思って様々な機能をあまり知らずに使っていませんでした。
クエリとして保存したらデザインビューで更新クエリに変換する機能があるのですね。そこで変換したら更新SQLクエリを自動で作ってくれて動作する感じでしょうか。
調べてやってみたいと思います。お手数おかけしました。

1
hatena 2026/03/07 (土) 12:06:18 修正

Select文としては文法の間違いはなく、これで8000くらいのデータを引っ張って来てくれますがUpdate文に入れ込むと上手く動いてくれません

Update文のwhere句にはSelect文ではなくwhere条件式をかくのだか?

とりあえず、いきなりUpdate文を書くのではなく更新対象を抽出するSelect文を作成してそれを開いてみて希望のデータが抽出されていることを確認する。
それをクエリとして保存して、そのクエリのデザインビューで更新クエリに変換すれば簡単だと思います。

6

やりたいことのフローやテーブル構成が不明なのでよくわかりませんが

rs!依頼日 に翌営業日を入力したいということなら

rs!依頼日 = 受付日(Date())

でいいのだが?

5
名前なし 2026/03/06 (金) 15:16:40 b6989@0e907

 過去の伝票を処理する場合、日付を適宜選択して転記するだけじゃないの?例えば、昨日の伝票を1000件登録する際には、日付(昨日)を1回選択しておくだけ。続けて、一昨日の伝票を登録する際には、日付を1回選択し直すだけ。

 伝票テーブル:{本部,日付},…
 伝票明細テーブル:{本部,日付,明細番号},…

4
tokinaito 2026/03/06 (金) 13:39:47 9e4e6@a5d99

ありがとうございます。後の方のコードを使わせていただきます。
ところであと一つお助けください。
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

3

DoCmd.OpenForm "FOSS入力", , , "依頼日 = #" & Me!任意日付 & 2 "#"
から2を消せばうまくいきました。

タイプミスでした。

OSの日付書式設定によってはうまく行かない場合があるので後の方のコードの方が安全です。

2
tokinaito 2026/03/05 (木) 14:46:06 c9b46@02e0f

DoCmd.OpenForm "FOSS入力", , , "依頼日 = #" & Me!任意日付 & 2 "#"
から2を消せばうまくいきました。
いつもいつもありがとうございます。

1

DoCmd.OpenForm "FOSS入力", , , 依頼日 = " & Me!任意日付"

DoCmd.OpenForm "FOSS入力", , , "依頼日 = #" & Me!任意日付 & 2 "#"

あるいは、下記でどうでしょう。

DoCmd.OpenForm "FOSS入力", , , "依頼日 = #" & Format(Me!任意日付,"yyyy/mm/dd") & "#"

OpenFormの第4引数は条件式を文字列として渡すように意識しましょう。

9
tokinaito 2026/03/03 (火) 12:35:41 c9b46@02e0f

hatena様たびたびありがとうございます。

8

コントロールソースでFornat関数で文字列に変換しているので書式設定は無視されます。
Fornat関数を重ねて書式変換してください。

=Format(Format([フィールド名],"0,000"),"@@@@@@@@@@")

6
tokinaito 2026/03/02 (月) 11:11:52 c9b46@02e0f

hatena様いつもお世話になります。じつはご教示いただいたもので間隔は調整できるのですが
書式を通貨に設定しても1000円単位のコンマが表示できません。以前は出来てたんですが
何か足りないんでしょうかご教示お願いします。

12
tokinaito 2026/03/01 (日) 11:34:33 9e4e6@a5d99

hatena様素晴らしいです。ありがとうございました。

11

そうですね、治すとボックスのデータとしては次のように作成しております。
SELECT [T販社本部].[本社ID], T販社本部.[本社名] FROM T販社本部 ORDER BY [本社ID];

最初の回答の追加クエリを実行する方法でも後の回答の方法でも可能だと思います。

追加先のテーブルの構成が不明なのでこれ以上の具体的な回答は無理ですので、
回答をヒントにできるところまでご自身で作成してみてください。

行き詰ったところでまた質問してください。

10
tokinaito 2026/02/26 (木) 16:03:44 9e4e6@a5d99

修正です 治すと=リストです。

9
tokinaito 2026/02/26 (木) 15:55:47 9e4e6@a5d99

そうですね、治すとボックスのデータとしては次のように作成しております。
SELECT [T販社本部].[本社ID], T販社本部.[本社名] FROM T販社本部 ORDER BY [本社ID];

8

やりたいのは新規入力です。いままでコンボボックスで1社づつ入力していたのを複数社を選択して一気に入力したいと思っています

リストボックスに会社のリストが表示されているということですよね。
これはどのように表示させていますか?
通常は会社マスタテーブルを値集合ソースにしますよね。
ならば、それが追加元テーブルになると思いますが?

7

参考コード例

    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
6

最初のコードでリストボックスで選択した値を取得している部分は下記のループですので

    With Me.listSupplier
        For Each varItm In .ItemsSelected
            stFilter = stFilter & "," & .ItemData(varItm)
        Next
    End With

このカンマ区切りで連結しているコードをレコード追加のコードに変更すればいいでしょう。

レコード追加はDAOかADOを使うのがいいでしょう。

ネット検索するかAIに質問すればサンプルコードが見つかると思いますのでそれを参考にコードを書いてみてください。

それでうまくいかないようならそのコードを提示して質問してください。

5
tokinaito 2026/02/25 (水) 08:02:56 9e4e6@a5d99

hatena様朝早くからありがとうございます。
やりたいのは新規入力です。いままでコンボボックスで1社づつ入力していたのを複数社を選択して一気に入力したいと思っています。

4

リストボックスで複数選択しそれをテーブルに格納したい

追加元テーブルはございません。よろしくお願いします。

複数選択したものをどのようにテーブルに格納しますか?

例えば、

  • カレントレコードの特定のフィールドににカンマ区切りで入力する
  • 新規レコードとして追加していく

というようにやりたいことを具体的かつ丁寧に説明してもらえませんか。

3
名前なし 2026/02/24 (火) 18:43:39 6234c@0e907

追加元テーブルはございません。よろしくお願いします。

 追加元テーブルがないなら全部やり直しましょう。正規化から始めないと砂上の楼閣です。

2
tokinaito 2026/02/24 (火) 18:19:02 9e4e6@a5d99

hatena様いつもありがとうございます。申し訳ございません。説明不足でした。リストボックスは非連結です。
追加元テーブルはございません。よろしくお願いします。

1

リストボックスで複数選択しそれをテーブルに格納したい

既存のテーブルに追加したいということなら印刷するコード部分(DoCmd.OpenReport)を追加クエリを実行するコードに書き換えればいいでしょう。

追加元と追加先のテーブルのフィールド構成が同じ場合のコード例

    CurrentDb.Execute "INSERT INTO 追加先テーブル" & _
        " SELECT * FROM 追加元テーブル Where " & stFilter, dbFailOnError
1

Print # ステートメントは、標準の挙動として出力する文字列の最後に改行コードを自動で付与しているようですね。
失礼いたしました。

11
kameo 2026/02/09 (月) 08:24:03 9eaf4@2128d

hatena様ありがとうございます。アドバイス頂いた方法で試し正常動作することが確認出来ました。この方法であれば売上毎に可変可能ですのでイレギュラーな事案にも対応出来ます。後は入力フォームの工夫だけです。助かりました。

hiroton様ありがとうございます。フォームを使っての処理がほとんどなのでレコードセットは色々試してみます。

事前に色々想定しているのですが、どうしても想定外の事案が発生しますのでその都度改訂が必用になります。その時のアプローチが重要ですね。大変勉強になりました。

10
hatena 2026/02/07 (土) 11:31:34 修正 >> 9

おっしゃる通り最初の設計は正規化としてはよろしくない部分はありますね。
下記の部分
E:変更前支払条件テーブルを作成

そこから指摘して説明すると長くなるので対処法の一例を回答しました。

この手法が正規化崩しといえるかどうかについては異論はあるかとは思います。

9
名前なし 2026/02/06 (金) 21:31:28 7f9f4@0e907

その支払条件が変更になる場合が発生しました…過去の売上分も改訂された締め日になってしまうので、

 正規化崩し云々以前に、正規化が杜撰だったと気づいてどうしよう?というだけでしょ。設計から全部やり直しましょう。

8
hiroton 2026/02/06 (金) 18:01:22 45420@f966d >> 5

レコードセットは、レコードの集合体です。レコードは管理されたデータのひと塊分です。レコードはイメージとしては「テーブルで表現したときの1行分のデータ」でも良いでしょう
主キーのないレコードセットもありますが、主キーがあればそれらは重複しないとか、必ず決められたフィールドを持つとか、フィールドに対してデータがあるとか、言葉にすれば当たり前のようなことですが、そういうルールで決められたデータのまとまりがレコードになります

レコードセットは「テーブルのようなもの」ととらえても問題ないですが、クエリをソースにして、複数のテーブルを繋げたり、必要なレコードだけ、必要なフィールドだけに絞り込んでデータをまとめて扱うことができます
また、フィールドによっては計算結果をソースとするものもあり、テーブルとして記録されないデータを持つ場合もあります

レコードソースのあるフォームであれば自動的にレコードセットが出来ているのでしょうか?

その通りです
レコードセットは必要なだけ作ることができるので、Aフォームを開けばAフォームのレコードセット、Bフォームを開けばBフォームのレコードセット、VBAで何か処理したいときにSet rs = CurrentDb.OpenRecordset("~")で読み込んだレコードセット「rs」のようにその時その時に応じて必要なだけ存在することになります

レコードセットはデータを直接操作できる仕組みなので、ACCESSがデータベースとして正しく動くための作法があります。VBAでレコードセットを扱うためには、その作法に従って間違いない記述が必要ですが、そういうところをできるだけ簡単にできるようにやってくれているのがACCESSのフォームという機能です


hatenaさん提案のように、もう少し全体像から改善を考える必要もあるのかなと思っています。質問の段階でだいぶ深いところからスタートしているのでその部分をさらに掘り込んで回答していますが、その内容が中途半端なのも別なアプローチの検討の余地があるだろうからです

データベース設計は正規化からスタートするわけですが、実務上は動くクエリのためにテーブル構造を変えるというのも避けられないことだと思っています(特に、ACCESSは貧弱なので)
VBAはデータベースの世界から見ればかなり特殊な対処法になるので、SQLでの対処も同時に考えて、必要ならテーブル構造の見直しから、なるべくメンテナンス性を犠牲にしたい手法を考えたいところです