Microsoft Access 掲示板

views
4 フォロー
5,901 件中 201 から 240 までを表示しています。
2
hatena 2024/03/16 (土) 00:40:28 修正

数字だけのフィールド、数字で始まるフィールド名以外にも、スペースを含むフィールド名、予約語のフィールド名、特殊記号を含むフィールド名などを使うとエラーになります。

Access データベースで特殊文字を使用したエラー - Microsoft 365 Apps | Microsoft Learn

そのような名前を使わないようにするのが原則ですが、どうしても使わなければならないときは、[ ]で囲むと使用できます。

SELECT [3] FROM おためし WHERE JAN = '1000000000023'
1
タークン 2024/03/15 (金) 19:47:29 7a0a1@2705a

質問したばかりで申し訳ないです。
全角数字は禁止と認識していましたが、数字だけ、もしくはフィールド名の先頭に数字を使ってもエラーになるみたいでした。
多少面倒ですが、先頭にアルファベット1文字加ええることで、回避できました。

5

txb_品名コード、txb_現在庫数ともに非連結のテキストボックスです。

ならば[F_在庫品作成依頼]が連結フォームである必要はないのではないでしょうか。

ごくありふれた操作なのですね。初めてだったので安心しました。

いわゆる CRUD 機能を Access の非連結フォームに実装する場合、
「新規レコードの追加」を行う手法については、大別して次の 3 種類の方法が挙げられます。

  1. 保存済みの追加クエリを実行するマクロまたはプロシージャを呼び出す。

  2. 任意の SQL 文(この場合は INSERT INTO ... ステートメント)を実行するマクロまたはプロシージャを呼び出す。

  3. DAO または ADO の Recordset オブジェクトによって任意のテーブルを参照し、AddNew メソッドを呼び出して新規レコードを作成し、そのレコードの各フィールドの値を編集し、Update メソッドを呼び出してそのレコードをテーブルに保存する――という一連の操作を実行するプロシージャを呼び出す。

挙げられた方法は上記 1 に該当します。

4
驚天動地!前任者失踪丸 2024/03/15 (金) 15:20:32 23e8e@44ebd >> 3

ごくありふれた操作なのですね。初めてだったので安心しました。

txb_品名コード、txb_現在庫数ともに非連結のテキストボックスです。

3
ssassakki 2024/03/15 (金) 14:31:33 27741@c61b7

フォームのレコードソースをクエリを元にしたテーブルにして、クエリのデータを追加して、フォームでのデータ編集後に
更新クエリで書き戻すのはいかがでしょうか?

直接編集はリスクが大きい気がします。

3

F_在庫品作成依頼というフォームを作りました。
レコードソースは00品番と00作成というテーブルを品番で繋げたものです。

txb_品名コードの更新後処理で、品名コードでフィルターし、その製品の詳細と作成依頼の履歴(サブフォームで、レコードソースはF_在庫品作成依頼と同一)を表示する

txb_現在庫数に、現在の在庫数を入力する

ここで問題となるのは、[txb_品名コード]と[txb_現在庫数]が
連結テキストボックスであるか、それとも非連結テキストボックスであるか、
ということです。

[txb_品名コード]のコントロールソースがテーブル[00作成]のフィールド[品番]、
[txb_現在庫数]のコントロールソースがテーブル[00作成]のフィールド[現在庫数]
であるならば、それらのテキストボックスに対して値を入力する操作は
そのままコントロールソースであるフィールドに対しての入力となります。

その際のフォームのカレントレコードが新規レコードなのであれば、
カレントレコードが保存された段階でそのレコードはテーブル[00作成]に
追加されます。
カレントレコードが既存のレコードなのであれば、参照中のレコードが
更新(上書き)されます。

btn_作成手配ボタンを押して、F_在庫品作成依頼のテキストボックスに
表示されている値・今日の日付を00作成という作成履歴を保存するレコードに追加する

「連結フォームのカレントレコードに対する入力操作」によって
テーブル[00作成]のレコードの追加/更新が成されているのであれば、
それとは別に(独自に)「追加クエリを用いたレコードの追加」という操作を
実行する必要はありません。

後者の操作を行う必要があるとすれば、それは[F_在庫品作成依頼]が
非連結フォーム(どのテーブルとも連結していない)である場合か、
「連結フォームのカレントレコードに対する入力操作」とは別に
何か特殊なレコードの追加処理を実行しなければならないような場合
ぐらいでしょう。

2

今までテーブルの表示のないクエリを作成した経験がないため、こういうのは一般的なのか

「各フィールドに出力する値(リテラルや式の結果)をリストで指定して
任意のテーブルに 1 件のレコードを追加する操作」という自体は、
データベースシステムにおいてごくありふれた操作です。

多くの場合は INSERT INTO ... VALUES ... ステートメントを使用します。

INSERT INTO [00作成] ([受注品], [手配日], [現在庫数], [品番])
VALUES (False, Date(), [Forms]![F_在庫品作成依頼]![txb_現在庫数], [Forms]![F_在庫品作成依頼]![txb_品名コード]);

Access の場合は SQL ビューでこのステートメントを用いた追加クエリを
作成することができますが、デザインビューに切り替えてクエリを上書き保存すると
INSERT INTO ... SELECT ... ステートメントに置き換わってしまいます。

1
りんご 2024/03/15 (金) 11:55:30 935bc@0e907

別スレを見ていて思ったのですが、テーブル構造(主キーなど)の提示、フォームのスクリーンショットの提示が必要ではないかしら?

8
驚天動地!前任者失踪丸 2024/03/15 (金) 11:44:28 23e8e@44ebd >> 7

フォーカスを移動させて値が保存されたらデータシートビューで値が表示される、という認識でしたので、移動させても値が表示されないのはおかしいなあと思って質問させて頂いた次第です。実行するとちゃんと在庫数に入力した数が追加されているので問題はないのですが。原因が気になったもので。。
とりあえず動いているのでよしとします、お手数をお掛け致しました。

7

フォーカスを移動させてからクエリーを開いても表示されませんか?

ちょっと原因は分からないのですが、実行したら値がきちんと入るのなら問題はないのでは?

6
驚天動地!前任者失踪丸 2024/03/15 (金) 08:55:35 23e8e@44ebd >> 5

デザインビューからデータシートビューを表示させる操作をしたということですか。
そのとき、式1: [Forms]![F_受注品作成依頼]![txb_現在庫数] と設定したフィールドに値が表示されていないということですか。

はい、デザインビューからデータシートビューに切り替えた際、値が表示されませんでした。

その時に、「F_受注品作成依頼」フォームは開いている状態ですか。
また、「txb_現在庫数」に入力したあと、Enterキー(Tabキー)を押下する、あるいは他のコントロールをクリックするなどして、フォーカス移動をしてますか。

はい、当該のフォームは開いた状態で、txb_現在庫数から他のボタンへフォーカスを移動させてみても、データシートビューに値が出ませんでした。

2
かーか 2024/03/13 (水) 19:00:52 d2d42@63c3a

早速のご回答、ありがとうございます。
ちょっとレコード数が多いのですが、まずは試しに設定してみます。
ありがとうございました。

5

このクエリが正しく作れているかの確認のため、クエリのデータシートビューを見たところ、フォーム上ではテキストボックスに値が正しく入っている(仮に「1000」と入力していたとします)が、データシートビューでは値が入っていませんでした。

デザインビューからデータシートビューを表示させる操作をしたということですか。
そのとき、式1: [Forms]![F_受注品作成依頼]![txb_現在庫数] と設定したフィールドに値が表示されていないということですが。

上記の認識で間違いないなら下記のことを確認してください。

その時に、「F_受注品作成依頼」フォームは開いている状態ですか。
また、「txb_現在庫数」に入力したあと、Enterキー(Tabキー)を押下する、あるいは他のコントロールをクリックするなどして、フォーカス移動をしてますか。

4
驚天動地!前任者失踪丸 2024/03/13 (水) 14:37:17 修正 23e8e@44ebd >> 3

「btn_作成手配」ボタンのクリック時で"Q_作成手配分追加"クエリを実行するようになっているということですか。

はい、ボタンを押すと、入力項目が不足していないか等のif文を通り、問題なければElseに分岐してDocmdでクエリが実行されます。

このクエリは"Q_作成手配分追加"のことですか。
このクエリをデザインビュー(あるいはSQLビュー)で開いてから、データシートビューで表示させるという操作をしているとうことですか。

クエリはQ_作成手配分追加のことです。
このクエリが正しく作れているかの確認のため、クエリのデータシートビューを見たところ、フォーム上ではテキストボックスに値が正しく入っている(仮に「1000」と入力していたとします)が、データシートビューでは値が入っていませんでした。その状態でクエリを実行すると、きちんとT_作成の現在庫数フィールドに値(1000)が入っています。

3

btn_作成手配で使用する"Q_作成手配分追加"という追加クエリで

「btn_作成手配」ボタンのクリック時で"Q_作成手配分追加"クエリを実行するようになっているということですか。

クエリをデータシートビューで見るとこれから追加する値が表示されると思うのですが、それの現在庫数フィールドの値が表示されない、ということです。

このクエリは"Q_作成手配分追加"のことですか。
このクエリをデザインビュー(あるいはSQLビュー)で開いてから、データシートビューで表示させるという操作をしているとうことですか。

2
驚天動地!前任者失踪丸 2024/03/13 (水) 12:54:10 23e8e@44ebd >> 1

クエリをデータシートビューで見るとこれから追加する値が表示されると思うのですが、それの現在庫数フィールドの値が表示されない、ということです。

1
すずやん 2024/03/13 (水) 10:36:56

「値がクエリに表示されない」というのが良く分かりません。
「txb_現在庫数"(非連結)」に反映されない、というのであれば分かるのですが。

もし上記が正の場合、画面をリフレッシュすればいいのではないでしょうか(違っていたらすみません)

1

部品の合計金額をDSum関数で取得すればいいでしょう。

クエリのフィールドに

部品合計金額: DSum("部品価格","部品テーブル","製品ID='" & [製品ID] & "'")

テーブル名、フィールド名は実際のものに変更してください。
また、リンクフィールド(製品ID)はテキスト型の場合です。

1
nanana 2024/03/12 (火) 17:35:39 e48ae@9a838

すみません自己解決してしまいました。
objExcel.workbooks.Openでアドインファイルを開いて、その後該当ファイルを開くとうまくいきました。
ありがとうございました。

14

ちなみに、自分がするなら、

テキストボックスの定型入力プロパティに
000000;;_
と設定しておいて下記のコードにします。

Private Sub btn_検索_Click()
    Dim StartDueDate As String
    Dim EndDueDate As String
    StartDueDate = Trim(Nz(Me.txb_納期検索1.Value, ""))
    EndDueDate = Trim(Nz(Me.txb_納期検索2.Value, ""))
    
    If StartDueDate & EndDueDate = "" Then
        MsgBox "納期期限の開始日または終了日を入力してください。"
        Me.txb_納期検索1.SetFocus
        Exit Sub
    End If
    
    If Not IsDate(Format("20" & StartDueDate, "0000/00/00")) Then
        MsgBox "日付としてありえない値です。yymmddの書式で日付を入力してください。"
        Me.txb_納期検索1.SetFocus
        Exit Sub
    End If
    If Not IsDate(Format("20" & EndDueDate, "0000/00/00")) Then
        MsgBox "日付としてありえない値です。yymmddの書式で日付を入力してください。"
        Me.txb_納期検索1.SetFocus
        Exit Sub
    End If
    
    Me.Refresh
    
    Dim strFilter As String
    If StartDueDate <> "" Then
        strFilter = " And [納期] >='" & StartDueDate & "'"
    End If
    
    If EndDueDate <> "" Then
        strFilter = strFilter & " And [納期] <='" & EndDueDate & "'"
    End If
            
    Me.Filter = Mid(strFilter, 6)
    Me.FilterOn = (strFilter <> "")
    
    Me.btn_解除.SetFocus
End Sub
13
驚天動地!前任者失踪丸 2024/03/12 (火) 08:33:07 23e8e@44ebd >> 12

回答ありがとうございます!
意図しない入力を防ぐ仕組みも必要ということですね。

12

客先から受け取るCSVデータをインポートすると短いテキスト型になっており、値も"240311”の6桁です。

ということなら、下記のような感じで入力チェックするといいかと思います。
そうしないと、正しくない値が入力されたときに、抽出結果も正しいものになりません。

    StartDueDate = Trim(Nz([txb_納期検索1], ""))
    If StartDueDate Like "######" Then
        If Not IsDate(Format("20" & StartDueDate, "0000/00/00")) Then
            MsgBox "日付としてありえない値です。yymmddの書式で日付を入力してください。"
            txb_納期検索1.SetFocus
            Exit Sub
        End If
    Else
        MsgBox "数字6桁で入力してください。"
        txb_納期検索1.SetFocus
        Exit Sub
    End If

   'EndDueDate も同様にチェック

あるいは、テキストボックスの定型入力プロパティに
000000;;_
と設定しておくと数字6桁の入力が強制されますので、日付チェックのみで済みます。

    StartDueDate = Trim(Nz([txb_納期検索1], ""))
    If Not IsDate(Format("20" & StartDueDate, "0000/00/00")) Then
        MsgBox "日付としてありえない値です。yymmddの書式で日付を入力してください。"
        txb_納期検索1.SetFocus
        Exit Sub
    End If
11
驚天動地!前任者失踪丸 2024/03/11 (月) 15:44:15 23e8e@44ebd >> 3

なるほど、想定していない(この場合だと6桁以外の数字)入力内容だった場合にエラーを回避するための処理ということですね。勉強になります。

10
驚天動地!前任者失踪丸 2024/03/11 (月) 15:42:53 23e8e@44ebd >> 2

Hatenaさん、お手数をおかけしてしまい申し訳ありません。
ありがとうございます。

9

反応がないようなので、管理者権限で削除しておきました。

8

それぞれの非連結テキストボックスの値の中に含まれている
シングルクォーテーション( ' )を Replace 関数によって
'' に置換し、更に囲み記号としての ' で囲って 1 つの
文字列リテラルとして解釈されるようにしています。

前述の例ではフィルター条件式における文字列リテラルの囲み記号として
シングルクォーテーションを用いていますが、その場合において
「文字列としてのシングルクォーテーション」を文字列リテラルに含めるには
'' のように 2 つ続けて記述しなければなりません。

Dim strFilter As String

strFilter = "[テキスト型のフィールド名] = 'I''m your father.'"

Me.Filter = strFilter
Me.FilterOn = True

それぞれの非連結テキストボックスにシングルクォーテーションを含む文字列が
入力された場合、上記のようにエスケープ処理をしておかないと
「文字列としての ' 」ではなく「文字列リテラルの囲み記号の ' 」として
解釈されてしまい、構文エラーが発生する可能性が高くなります。

7
驚天動地!前任者失踪丸 2024/03/11 (月) 11:21:41 23e8e@44ebd >> 3

skさん、回答ありがとうございます。
思う通りに動作するようになりました。

StartDueDate = Replace(StartDueDate, "'", "''", 1, -1, vbBinaryCompare)
EndDueDate = Replace(EndDueDate, "'", "''", 1, -1, vbBinaryCompare)

これはどのような操作なのでしょうか?

6
驚天動地!前任者失踪丸 2024/03/11 (月) 11:18:33 23e8e@44ebd >> 2

リアクションでは何を伝えたいのか分かりませんので文章にしていただきますようよろしくお願い致します。

5
驚天動地!前任者失踪丸 2024/03/11 (月) 11:04:42 23e8e@44ebd >> 2

客先から受け取るCSVデータをインポートすると短いテキスト型になっており、値も"240311”の6桁です。

3

では、とりあえず以下のように修正してみて下さい。

Private Sub btn_検索_Click()

    Dim StartDueDate As String
    Dim EndDueDate As String

    StartDueDate = Trim(Nz([txb_納期検索1], ""))
    StartDueDate = Replace(StartDueDate, "'", "''", 1, -1, vbBinaryCompare)
    
    EndDueDate = Trim(Nz([txb_納期検索2], ""))
    EndDueDate = Replace(EndDueDate, "'", "''", 1, -1, vbBinaryCompare)

    Me.Refresh

    If StartDueDate <> "" And EndDueDate <> "" Then
        Me.Filter = "([納期] between '" & StartDueDate & "' and '" & EndDueDate & "')"
    ElseIf StartDueDate <> "" And EndDueDate = "" Then
        Me.Filter = "([納期] >= '" & StartDueDate & "')"
        
    ElseIf StartDueDate = "" And EndDueDate <> "" Then
        Me.Filter = "([納期] <= '" & EndDueDate & "')"
    Else
        Exit Sub
    End If
        
    Me.FilterOn = True
    btn_解除.SetFocus
        
End Sub
2
驚天動地!前任者失踪丸 2024/03/11 (月) 10:47:01 23e8e@44ebd >> 1

納期のデータ型は短いテキスト型です。

1

まずフィールド[納期]のデータ型を明記されることをお奨めします。

7
ちばまもる 2024/03/08 (金) 21:39:56 0bf9d@6f372

明日勉強して頑張ってみようと思ってましたが、回答していただけてました! ありがとうございます。
これ絶対ADOを使う案件だと思ってました。

いつものことながら、ありがとうございます。

14
XS 2024/03/08 (金) 12:24:36 ddfe5@52efc

hirotonさん・hatenaさん ありがとうございました。納得しました。参照渡しでしておいたら同じ名前でも違う名前でも共有できるのですね。スコープとは関係のない事でしたね。
こつこつ勉強していきます。

13
hiroton 2024/03/08 (金) 12:06:20 f7b56@f966d

質問内容の経緯から、適切な宣言と、それに従った運用が必要であると示すためです

以下、要点を挙げてみると
(参照渡しの)引数によって、スコープを跨いで同じデータを扱うこと。
プロシージャを作ると、新たなスコープが作られること。
異なるスコープでは、そのスコープで使える名前を正しく把握する必要があること。

proKey1で名前だけ同じKeyCodeを記述しても、それはコンボ_KeyDownKeyCodeではないということですね。(そうなるよう記述しなければ)


スコープ(範囲)対策でKeyCodeという変数を使わない様にする

proKey1はスコープが異なるのでKeyCodeという「名前」はproKey1の中で自由に(新たに)使えます。解説目的(質問への回答目的ではない)でcと表記していますが、普通に組んだらPrivate Sub proKey1(KeyCode As Integer)とする(そうなるよう記述する)と思います

6

フォームが連結フォームなら、この方法でいいですね。

ADDやらDAO、SQLを使う必要はまたっくないです。

フォームを開いたときに、テーブルもレコードセットとして開かれているので。

12

hirotonさんのproKey1の引数CとしてKeyCodeと共有させているのはスコープ(範囲)対策でKeyCodeという変数を使わない様にするためでしょうか?(この解釈も間違いならすみません)

プロシージャ内で宣言された変数(引数も含む)は、そのプロシージャ内でのみ有効、つまり他からは参照できないです。
スコープは Sub から End Sub までの範囲です。
つまり、コンボ_KeyDown内で宣言された変数(引数も含む)と、proKey1内で宣言された変数(引数も含む)ではスコープが異なるので、同じ変数名でも問題ないです。もちろん違っても問題ないです。

同じ名前を使うか、異なる名前にするかは、プログラマーの好みだと思います。
私は、参照渡しの場合は、同じものを共有することになるので、同じ名前にしておくことが多いです。

11
XS 2024/03/08 (金) 10:27:43 ddfe5@52efc

hirotonさん・hatenaさん 丁寧な解説ありがとうございます。大変参考になります。まだまださわりしか理解してませんが自分なりにイメージしました。今回の流れはおおざっぱには下記でしょうか?(間違いならすみません)
1:コンボキーダウン時に(プロシージャ)proKey1を呼び出し押されたキー内容を(変数)KeyCodeに入れてproKey1に引数として渡す
2:proKey1はKeyCodeを受取りそれは共有できている引数Cとして条件分岐をする
3:2の結果をコンボキーダウン時に返す。

hirotonさんのproKey1の引数CとしてKeyCodeと共有させているのはスコープ(範囲)対策でKeyCodeという変数を使わない様にするためでしょうか?(この解釈も間違いならすみません)

ACCESSの便利さが好きで自分で色々制御できるといいなと思い勉強中です。少しづつの理解しか出来ませんが頂いた回答はネットや本には載ってないような達人の生の意見は本当に貴重に思ってます。

10
hiroton 2024/03/08 (金) 09:25:49 f7b56@f966d >> 9

アレです。正直何も分からないままやってしまってもいいんじゃないかなって内容なんですよね。デフォルトがByRefだからとかそういうのも
VBAの使い始めなんかそのくらい適当でいいと思っているので

エラーが出ないのが不思議だと何回か指摘していますが、「なんでもかんでもOn Error~していてうまくいっていないのにどこが原因か分からない」と同じ匂いを感じるんですよね。普通にやっていればそもそも動かないってこけているはずなので


hiroton自身も特別なとは言っていますが、イベントプロシージャの引数は別に他のプロシージャと比較して特別なモノでもないんじゃないですかね。それこそ「記述を省略した参照渡し」なので

大元の参照元(コントロールのイベント実行)から呼び出されるにあたって、「参照渡し」で引数を定義しているので、このプロシージャ内で操作した結果は元になるイベントの情報をそのまま書き換えている。と、それだけかと
大元の参照元が隠されているというだけで、プロシージャとしての動きは特別なモノでもないと思います

5
hiroton 2024/03/08 (金) 09:00:40 f7b56@f966d

もうちょっと具体的に説明できたほうがいいと思いますが

Private Sub コンボボックス_AfterUpdate()
    Me!別の列 = Me!コンボボックス
End Sub

ってことですかね