Microsoft Access 掲示板

views
4 フォロー
6,283 件中 2,401 から 2,440 までを表示しています。
1

最初のクエリをレコードソースとするレポートを作成して、グループ化/集計 の機能でグループフッターを表示させて、そこに集計テキストボックスを配置すれば簡単に実現できますが、それではだめですか。

Accessのレポートでグループごとに金額の合計を印刷する方法 | できるネット

クエリで実現するとなると2つのクエリをユニオンクエリで一つにまとめることになります。その場合は下記が参考になるでしょう。

クエリで小計行、合計行を表示する - hatena chips

また、このクエリの中で電気・ガス・水道の合計を出すことは可能でしょうか?

レポートなら、下記のようなテキストボックスを配置すればいいでしょう。

コントロールソース =[電気]+[ガス]+[水道料金]

クエリなら、下記のような演算フィールドを作成すればいいでしょう。

水道光熱費: [電気]+[ガス]+[水道料金]

7

この方法だと1クリックにつき1レコードですが、
もし、複数のレコードを選択して、まとめて印刷したいというときは、hirotonさんが提案されたテーブルに「Yes/No型」フィールドを追加する方法を使うといいでしょう。

フォームの方にも「Yes/No型」フィールドを追加するとチェックボックスになりますので、印刷したいレコードにチェックをいれて、1クリックでまとめて印刷することも可能です。

その場合は、埋め込みマクロのWhere条件式の欄に下記の式を設定しておきます。

[印刷する]=True
6
hatena 2022/06/24 (金) 16:24:06 修正

それでは、続きです。

まず、テーブルの主キーフィールド名を、「顧客ID」と仮定します。
フォーム名は、「F_封筒印刷」と仮定します。

フォームをデザインビューで開いて、「封筒プレビュー」コマンドボタンを選択して、プロパティシートで[イベント]タブの[クリック時]に[埋め込みマクロ]となっていると思いますので、その右端のビルドボタン(...)をクリックします。
マクロ画面が開きますので、
「レポートを開く」を選択して、Where条件式の欄に下記の式を入力します。

[顧客ID]=Forms!F_封筒印刷![顧客ID] 

画像1

マクロ画面を閉ます。

これで完成です。
フォームを開いて、印刷したいレコードを選択してコマンドボタンをクリックすると、そのレコードがプレビューされます。

5
マイマイ 2022/06/24 (金) 11:27:13

hatena 様

お世話になります。
お教えいただいた作業までは上手く順調に進みました。
その後をお教えください。よろしくお願いいたします。

4
hiroton 2022/06/23 (木) 11:29:02 8c478@f966d

作成したテーブルの名前(テーブル名)とレポートの名前(レポート名)はそれぞれなんですか?
回答者と齟齬が起きないように必要な情報として記載するようにしてください


テーブルに「印刷する」フィールドを「Yes/No型」で作成します
画像1
レポートをデザインビューで開き、プロパティシートのデータタブで

フィルター印刷する=True
読み込み時にフィルターを適用はい

と変更します
画像2

テーブルで「印刷する」フィールドにチェックを入れてからレポートを開けば、チェックを入れたレコードのみが印刷できるようになります(特殊な状況による例外あり)


提示した方法は、ACCESSの基本機能すら使いこなす前の、原理や理論に近い部分の手法です。実際の運用にあたっては、オリジナルのユーザーインターフェースが必要になることでしょう。たとえばhatenaさん提示のような方法で、フォームの作成をしていくことになります

3

では、テーブルを選択しておいて、[作成]→[フォームウィザード]をクリックします。
表示したいフィールドを選択して[次へ] [表形式]を選択して[次へ]
フォーム名をお好みで設定して、[完了]
以上で帳票フォームが作成できます。これを開くとテーブルのデータが表形式で表示できます。

このフォームをデザインビューにして、フォームヘッダーにコマンドボタンを配置します。
ウィザードが開くので、そこで[レポートの操作]→[レポートのプレビュー]を選択して[次へ]
レポートを選択して[次へ]
文字列を選択して、「封筒プレビュー」と入力して[次へ]
名前を「封筒プレビュー」とてし[完了]

これでフォームを開いて、「封筒プレビュー」をクリックするとレポートがプレビューされるのを確認してください。
このままでは、全レコードが出力されますので、選択していくレコードのみにする必要がありますが、
とりあえりず、ここまで作業してみてください。
うまくいったら、次の作業を回答します。

2
マイマイ 2022/06/22 (水) 15:49:25

hatena 様

ありがとうごいます。
  現状の雛型では、テーブルの全レコードが出力される状態でしょうか。
   ⇒そのようになります
 「任意のレコードを選んで」は、どのようなユーザーインターフェイスで選ぶ予定でしょうか。
 帳票フォームで選択しているレコードを印刷するとか、リストボックスに表示させてそれで選択するとか、
 いろいろ考えられますが。
   ⇒複数の選択肢があることすらわかりませんでした。一番簡単な方法でお願いします。
 VBAを使うことは可能ですか。
   ⇒不可能です。まだまだそこまで追いついていません。
よろしくお願いいたします。

20
りんご 2022/06/21 (火) 18:00:53 c564b@0e907 >> 19

今回は仕事の都合、時間もないので

 最低限の保証を確認しておかないと危険です。これまでのチグハグな様子を見ていると、このシステムは最初から全部壊れている可能性が高いと、容易に予想出来ます。立ち止まって、再考するのはどうでしょう?努力と時間はもっと大切に。

1

現状の雛型では、テーブルの全レコードが出力される状態でしょうか。

「任意のレコードを選んで」は、どのようなユーザーインターフェイスで選ぶ予定でしょうか。
帳票フォームで選択しているレコードを印刷するとか、リストボックスに表示させてそれで選択するとか、
いろいろ考えられますが。

VBAを使うことは可能ですか。

19
wazawaza 2022/06/21 (火) 11:51:51

hatenaさん、
ありがとうございました!
上手くいきました👍

hirotonさん、
ありがとうございます!

りんごさん、
ご指摘ありがとうございます!
今後はリレーションなど、詳細も提示しつつ
質問するようにします。

今回は仕事の都合、時間もないので
hatenaさんのご提案のやり方で進めてみます。

皆さま、ご協力有り難うございました。
SQLはいまの私には難易度高いですね💦

勉強します!

4

まったく別の質問になりますので、
今回の質問が解決したのなら、新規に質問しなおしてください。

3
マイマイ 2022/06/20 (月) 17:17:01

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

別件でお教えください。
"レポート"で封筒のひな形を作りました。そのひな形にテーブルにある何百のレコードから
任意のレコードを選んで、封筒に印刷するのはどのようにすればいいのですか。
最近まで「桐」を使用していたので、「ACCESS」は難しいです。

18
    For i = 1 To 10
      If Not IsNull(Me("依頼理由_1" & i).Value) Then
        rs.AddNew
        For Each fld In rs.Fields
           fld.Value = Me("詳細ID" & i).Value          '←ここでエラー
           fld.Value = Me("ロット番号" & i).Value
           fld.Value = Me("ロット枝" & i).Value
           fld.Value = Me("依頼理由_1" & i).Column(1)
           fld.Value = Me("依頼理由_2" & i).Column(1)
           fld.Value = Me("依頼理由_3" & i).Column(1)
           fld.Value = Me("巻き長さ" & i).Value
           fld.Value = Me("詳細補足説明" & i).Value
           fld.Value = Now
        Next
        rs.Update
      End If
    Next i

上記のコード、私が前に指摘した、

一つずつ、フィールドに対応するテキストボックスの値を代入する方法と、
フィールド名とテキストボックスを同じにしておいて、いちいち指定せずにループで代入しておく方法、
が、ごちゃまぜになってます。

一つずつ、フィールドに対応するテキストボックスの値を代入する方法に書き換えましょう。
後者の方法はまだちょっと敷居が高いようです。

    For i = 1 To 10
      If Not IsNull(Me("依頼理由_1" & i).Value) Then
        rs.AddNew
        rs("詳細ID").Value = Me("詳細ID" & i).Value
        rs("ロット番号").Value = Me("ロット番号" & i).Value
        rs("ロット枝").Value = Me("ロット枝" & i).Value
        rs("依頼理由_1").Value = Me("依頼理由_1" & i).Column(1)
        rs("依頼理由_2").Value = Me("依頼理由_2" & i).Column(1)
        rs("依頼理由_3").Value = Me("依頼理由_3" & i).Column(1)
        rs("巻き長さ").Value = Me("巻き長さ" & i).Value
        rs("詳細補足説明").Value = Me("詳細補足説明" & i).Value
        rs.Update
      End If
    Next i

そのうえでエラーが出たら、エラーメッセージとどの行でエラーが出たか提示してください。

17
りんご 2022/06/20 (月) 11:17:45 c564b@0e907

 パラメーターエラーは、念の為、SQL文の不備から見直してみるのはどうでしょう?
 Null値代入エラーは、取り敢えず、For Each〜Nextを使わないコードに戻してみるのはどうでしょう?
 これで解決しない、もしくは、新しいエラーが出た場合は、For i = 1 To 10 〜Nextを使わないコードに戻してみるのはどうでしょう?
 それでも駄目なら、兎にも角にも、まずは、繰り返し処理を使わないコードを泥臭く書かないと色々難しいでしょう。
 最後に、今回のシステムに関して質問を続ける場合や別のシステムに関して質問をする場合、リレーションシップの画面をスクリーンショットして提示して下さい。リレーションシップが設定されていない場合、質問する意味がありませんので、これが大事です。

6
めむか 2022/06/18 (土) 16:08:04

りんごさん、ありがとうございます。
ベンダーへの依頼も視野に入れていますが、何分まだ予算もつかない状態なので、調査研究中という段階です。
関連して目についた「Pleasanter」というツールを、今評価してみたところですが。
現在考えているAccessでのデータ構造で、フォームの構成を実現できるか検証できませんでした。(1時間では)
データ中心の発想を変えないと、ローコードでの開発は難しいような気がします。

5
りんご 2022/06/18 (土) 14:59:05 c564b@0e907

 30分で設計して、1時間でWeb画面展開(仮)出来ますか?出来ないならば、信頼出来るローコード開発ベンダーを見つけて相談しましょう。

16
wazawaza 2022/06/18 (土) 14:36:59

hirotonさん、ありがとうございます。
再度挑戦しました。
すると「パラメーターが少なすぎます。9を指定してください。」です。

Private Sub btn追加_Click()
    
   Dim rs As DAO.Recordset, fld As DAO.Field
   Dim strSQL As String
   strSQL = "SELECT 依頼ID AS txt依頼ID, 依頼日 AS txt依頼日, 依頼者 AS cmb依頼者, 作業長承認 AS cmb作業長承認, W_No AS txtW_No, W_Noロット AS txtW_Noロット, 品名 AS txt品名, 希望処置 AS cmb希望処置, 補足説明 AS txt補足説明 FROM T_依頼;"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    rs.AddNew
    For Each fld In rs.Fields
        fld.Value = Me(fld.Name).Value
    Next
    rs.Update

    strSQL = "SELECT 詳細ID As txt詳細ID, ロット番号 AS txtロット番号, ロット枝 AS cmbロット枝, 依頼理由_1 AS cmb1依頼理由, 依頼理由_2 AS cmb2依頼理由, 依頼理由_3 AS cmb3依頼理由, 巻き長さ AS txt巻き長さ, 詳細補足説明 AS txt詳細補足説明, T_依頼詳細"
    Set rs = CurrentDb.OpenRecordset(strSQL)    '←ここでエラー
    Dim i As Long
    For i = 1 To 10
        If Not IsNull(Me("cmb1依頼理由" & i).Value) Then
            rs.AddNew
            For Each fld In rs.Fields
                If Not ",依頼ID,最終更新日," Like "*," & fld.Name & ",*" Then
                    fld.Value = Me(fld.Name & i).Value
                End If
            Next
            '//レコード共通項目や計算結果を入れるものは個別に処理
            rs!依頼ID.Value = Me!txt依頼ID.Value
            rs!最終更新日.Value = Now
            rs.Update
        End If
    Next i
    rs.Close
    
    MsgBox "追加しました", vbInformation, "完了"
End Sub

hatenaさん、ありがとうございます。
実行時エラー’3022’は、同じ主キーで一生懸命、登録を試みてました😅
スミマセン😅😅

で、再度挑戦しました。
すると「バリアント型ではない変数にNull値を代入しようとしました」です。

Private Sub btn追加_Click()
    If IsNull(Me.依頼者.Value) Or IsNull(Me.希望処置.Value) _
    Or IsNull(Me.W_No.Value) Then
      MsgBox "必要項目が入力されていません", vbInformation, "確認"
      Exit Sub
    End If
    
    Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_依頼")
    rs.AddNew
    rs("依頼ID").Value = Me.依頼ID.Value
    rs("依頼日").Value = Me.依頼日.Value
    rs("依頼者").Value = Me.依頼者.Value
    rs("W_No").Value = Me.W_No.Value 'コンボボックスの連結列をフィールドのデータと合うものにしておく
    rs("W_Noロット").Value = Me.W_Noロット.Value
    rs("品名").Value = Me.品名.Value
    rs("希望処置").Value = Me.希望処置.Value
    rs("補足説明").Value = Me.補足説明.Value
    rs.Update
    rs.Close
    
    Set rs = CurrentDb.OpenRecordset("T_依頼詳細")
    Dim i As Long
    For i = 1 To 10
      If Not IsNull(Me("依頼理由_1" & i).Value) Then
        rs.AddNew
        For Each fld In rs.Fields
           fld.Value = Me("詳細ID" & i).Value          '←ここでエラー
           fld.Value = Me("ロット番号" & i).Value
           fld.Value = Me("ロット枝" & i).Value
           fld.Value = Me("依頼理由_1" & i).Column(1)
           fld.Value = Me("依頼理由_2" & i).Column(1)
           fld.Value = Me("依頼理由_3" & i).Column(1)
           fld.Value = Me("巻き長さ" & i).Value
           fld.Value = Me("詳細補足説明" & i).Value
           fld.Value = Now
        Next
        rs.Update
      End If
    Next i
    rs.Close

    MsgBox "追加しました", vbInformation, "完了"
End Sub

親テーブル「T_依頼」

進捗状況依頼ID依頼日依頼者作業長承認加工承認仕上承認生管承認W_NoW_Noロット品名希望処置補足説明
Yes/No型短いテキスト日付/時刻型短いテキスト短いテキスト短いテキスト短いテキスト短いテキスト短いテキスト短いテキスト短いテキスト短いテキスト長いテキスト

子テーブル「T_依頼詳細」

詳細ID依頼IDロット番号ロット枝依頼理由_1依頼理由_2依頼理由_3巻き長さ詳細補足説明検品作業者検品フィードバックPEコメント最終更新日
オートナンバー型短いテキスト短いテキスト短いテキスト短いテキスト短いテキスト短いテキスト数値型長いテキスト短いテキスト長いテキスト長いテキスト日付/時刻型
4
めむか 2022/06/18 (土) 14:07:00

今のところ想定しているのは、10名程度の同時使用かと思います。それよりも大規模になる時は、構成し直しになると思います。環境よりも、アプリの操作性を重視したいのですが、今から作成するのであればWebっぽい画面展開にしたいなぁ、などと考えております。勿論、応答速度とセキュリティは外せないのですが。
kintoneも一ヶ月ほど試してみたのですが、馴染めませんでした。
Accessも、一般的な機能(クエリとかマクロ)は限界があるので、Accessでやるとしたら、バリバリVBAを使うことになると思います。
イメージとしては、
1.セキュリティ・応答性 が大丈夫な、クラウドのデータベース
2.Access程度の、パソコンソフト開発のツール
3.まだ良くわかりませんが、スマホでのアプリ開発ツール
を併せて提供してほしいという感じです。
さすがに、Accessで作ったソフトをスマホでそのまま動かしてくれ・・・
とは言えないでしょうが・・・。

勝手なことばかり言って、申し訳ありません。
もし、Microsoft以外の環境についてもご存知でしたら、また教えてください。
FileMakerに少し興味があるのですが、システムのことばかりやっているわけでもないので、なかなか時間が取れません。

15

コンパイルエラーなのでコンパイルをしてみましょう
画像1

エラーの場所が反転してわかると思います
画像2

回答はコード案の一部を記載したものなので、前後の処理や必要な変数宣言は別途記述する必要があります。変数の使いまわしもしてるので記述を整理する必要もあるでしょう

プロシージャをすべて記述するなら

Private Sub btn追加_Click()
    Dim rs As DAO.Recordset, fld As DAO.Field '//この行が不足
    Dim strSQL As String
    strSQL = "SELECT 依頼ID AS txt依頼ID, 依頼日 AS txt依頼日, 依頼者 AS cmb依頼者, 作業長承認 AS cmb作業長承認, W_No AS txtW_No, W_Noロット AS txtW_Noロット, 品名 AS txt品名, 希望処置 AS cmb希望処置, 補足説明 AS txt補足説明 FROM T_依頼;"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    rs.AddNew
    For Each fld In rs.Fields
        fld.Value = Me(fld.Name).Value
    Next
    rs.Update
    
'    Dim strSQL As String '//すでに宣言しているので不要
    strSQL = "SELECT 依頼ID, ロット番号 AS txtロット番号, ロット枝 AS cmbロット枝, 依頼理由_1 AS cmb1依頼理由, 依頼理由_2 AS cmb2依頼理由, 依頼理由_3 AS cmb3依頼理由, 巻き長さ AS txt巻き長さ, 詳細補足説明 AS txt詳細補足説明 FROM T_依頼詳細"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    Dim i As Long
    For i = 1 To 10
        If Not IsNull(Me("cmb1依頼理由" & i).Value) Then
            rs.AddNew
            For Each fld In rs.Fields
                If Not ",依頼ID,更新日時," Like "*," & fld.Name & ",*" Then
                    fld.Value = Me(fld.Name & i).Value
                End If
            Next
            'レコード共通項目や計算結果を入れるものは個別に処理
            rs!依頼ID.Value = Me!依頼ID.Value
            rs.Update
        End If
    Next i
    rs.Close
    
    MsgBox "追加しました", vbInformation, "完了"
End Sub

「更新日時」フィールドは例示のための記述なので削除しました

1

とりあえず、
出力したいテーブルを選択した状態で、作成→レポートウィザードで指示に従って進めていき、レイアウトで「表形式」を選択して、完了を押してみてください。

14

実行時エラー’3022’インデックス、主キー、またはリレーションで重複する値が、、、
が表示され、下記がエラーとなりました。

T_依頼 の主キーフィールドはなんでしょうか。
エラーメッセージのとおりだと思いますので、主キーフィールドの値が重複していないか、確認してみてください。

13
wazawaza 2022/06/17 (金) 11:24:25

hirotonさん
ご提案の文を使わせて頂きました。
“コンパイルエラー 変数が定義されていません。”
初歩的な質問で、大変恐縮ですが
間違えを指摘していただけますか?

Private Sub btn追加_Click()
    
   Dim strSQL As String
   strSQL = "SELECT 依頼ID AS txt依頼ID, 依頼日 AS txt依頼日, 依頼者 AS cmb依頼者, 作業長承認 AS cmb作業長承認, W_No AS txtW_No, W_Noロット AS txtW_Noロット, 品名 AS txt品名, 希望処置 AS cmb希望処置, 補足説明 AS txt補足説明 FROM T_依頼;"
    Set rs = CurrentDb.OpenRecordset(strSQL) '← rs = が反転されます。
    rs.AddNew
    For Each fld In rs.Fields
        fld.Value = Me(fld.Name).Value
    Next
    rs.Update
    
    Dim strSQL As String
    strSQL = "SELECT 依頼ID, ロット番号 AS txtロット番号, ロット枝 AS cmbロット枝, 依頼理由_1 AS cmb1依頼理由, 依頼理由_2 AS cmb2依頼理由, 依頼理由_3 AS cmb3依頼理由, 巻き長さ AS txt巻き長さ, 詳細補足説明 AS txt詳細補足説明, 更新日時 FROM T_依頼詳細"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    Dim i As Long
    For i = 1 To 10
        If Not IsNull(Me("cmb1依頼理由" & i).Value) Then
            rs.AddNew
            For Each fld In rs.Fields
                If Not ",依頼ID,更新日時," Like "*," & fld.Name & ",*" Then
                    fld.Value = Me(fld.Name & i).Value
                End If
            Next
            '//レコード共通項目や計算結果を入れるものは個別に処理
            rs!依頼ID.Value = Me!依頼ID.Value
            rs!更新日時.Value = Now
            rs.Update
        End If
    Next i
    rs.Close
    
    MsgBox "追加しました", vbInformation, "完了"
End Sub
12
wazawaza 2022/06/17 (金) 11:09:57

お二方、ありがとうございます!
まずは、hatenaさん。
ご提案の文を使わせていただいたところ、T_依頼にはレコードが入りますが、

Private Sub btn追加_Click()
    If IsNull(Me.依頼者.Value) Or IsNull(Me.希望処置.Value) _
    Or IsNull(Me.W_No.Value) Then
      MsgBox "必要項目が入力されていません", vbInformation, "確認"
      Exit Sub
    End If
    
    Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_依頼")
    rs.AddNew
    rs("依頼ID").Value = Me.依頼ID.Value
    rs("依頼日").Value = Me.依頼日.Value
    rs("依頼者").Value = Me.依頼者.Value
    rs("W_No").Value = Me.W_No.Value 'コンボボックスの連結列をフィールドのデータと合うものにしておく
    rs("W_Noロット").Value = Me.W_Noロット.Value
    rs("品名").Value = Me.品名.Value
    rs("希望処置").Value = Me.希望処置.Value
    rs("補足説明").Value = Me.補足説明.Value
    rs.Update
    rs.Close
    
    Set rs = CurrentDb.OpenRecordset("T_依頼詳細")
    Dim i As Long
    For i = 1 To 10
      If Not IsNull(Me("依頼理由_1" & i).Value) Then
        rs.AddNew
        For Each fld In rs.Fields
           fld.Value = Me("詳細ID" & i).Value
           fld.Value = Me("ロット番号" & i).Value
           fld.Value = Me("ロット枝" & i).Value
           fld.Value = Me("依頼理由_1" & i).Column(1)
           fld.Value = Me("依頼理由_2" & i).Column(1)
           fld.Value = Me("依頼理由_3" & i).Column(1)
           fld.Value = Me("巻き長さ" & i).Value
           fld.Value = Me("詳細補足説明" & i).Value
           fld.Value = Now
        Next
        rs.Update
      End If
    Next i
    rs.Close

    MsgBox "追加しました", vbInformation, "完了"
End Sub

子レコード側を入力したのち、追加ボタンを押すと
実行時エラー’3022’インデックス、主キー、またはリレーションで重複する値が、、、
が表示され、下記がエラーとなりました。

Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_依頼")
    rs.AddNew
    rs("依頼ID").Value = Me.依頼ID.Value
    rs("依頼日").Value = Me.依頼日.Value
    rs("依頼者").Value = Me.依頼者.Value
    rs("W_No").Value = Me.W_No.Value 'コンボボックスの連結列をフィールドのデータと合うものにしておく
    rs("W_Noロット").Value = Me.W_Noロット.Value
    rs("品名").Value = Me.品名.Value
    rs("希望処置").Value = Me.希望処置.Value
    rs("補足説明").Value = Me.補足説明.Value
    rs.Update   '←ここでエラー
    rs.Close

よろしくお願いします!

11

すっきりして見やすいですねぇなんて思いながら見てましたが、OpenRecordsetにはSQL文も指定できるのでハイブリッドでやるのもいいかなぁと思いました

    strSQL = "SELECT 依頼ID, 依頼日, 依頼者, W_No, W_Noロット, 品名, 希望処置, 補足説明 FROM T_依頼;"

    Set rs = CurrentDb.OpenRecordset(strSQL)
    rs.AddNew
    For Each fld In rs.Fields
        fld.Value = Me(fld.Name).Value
    Next
    rs.Update

不要な分を弾く処理よりは必要分を記述していくほうが分かりやすいかと
単純なSELECT文なので間違いも起きにくいですし

それから、エイリアス使ってひねってやるとフィールド名とコントロール名が別でも良かったりしますね

    strSQL = "SELECT 依頼ID AS txt依頼ID, 依頼日 AS txt依頼日, 依頼者 AS cmb依頼者, W_No AS txtW_No, W_Noロット AS txtW_Noロット, 品名 AS txt品名, 希望処置 AS cmb希望処置, 補足説明 AS txt補足説明 FROM T_依頼;"

フォームに配置できないフィールド名(詳細)とかはこの手法で


質問だと後半のINSERTは「依頼ID」が共通で最大10レコード登録な処理ですかね(追記内容だと「依頼ID」にもiがついているので真実は不明)
これの時は、別入力処理も使っていくことになりそうです

    Dim strSQL As String
    strSQL = "SELECT 依頼ID, ロット番号 AS txtロット番号, ロット枝 AS cmbロット枝, 依頼理由_1 AS cmb1依頼理由, 依頼理由_2 AS cmb2依頼理由, 依頼理由_3 AS cmb3依頼理由, 巻き長さ AS txt巻き長さ, 詳細補足説明 AS txt詳細補足説明, 更新日時 FROM T_依頼詳細"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    Dim i As Long
    For i = 1 To 10
        If Not IsNull(Me("依頼理由" & i).Value) Then
            rs.AddNew
            For Each fld In rs.Fields
                If Not ",依頼ID,更新日時," Like "*," & fld.Name & ",*" Then
                    fld.Value = Me(fld.Name & i).Value
                End If
            Next
            '//レコード共通項目や計算結果を入れるものは個別に処理
            rs!依頼ID.Value = Me!依頼ID.Value
            rs!更新日時.Value = Now
            rs.Update
        End If
    Next i
    rs.Close

更新日時のような計算で求めるものも外に出して個別に処理ですかねぇ


Like判定は誤動作しそうで怖い。完全一致で判定(Select Caseで列挙するとか)したくなります

10

後者の方法なら、下記のコードになります。

入力しないフィールドがある場合  "フィールド1,フィールド2" とカンマ区切りで指定してください。
全てのフィールドに入力するならIf文は不要です。

    Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_依頼")
    rs.AddNew
    For Each fld In rs.Fields
        If Not "フィールド1,フィールド2" Like "*" & fld.Name & "*" Then
            fld.Value = Me(fld.Name).Value
        End If
    Next
    rs.Update
    rs.Close
9

下記の部分でエラーということですね。

    Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_依頼")
        rs.AddNew
        For Each fld In rs.Fields
         fld.Value = Me(依頼ID).Value '←ここでエラー
         fld.Value = Me(依頼日).Value
         fld.Value = Me(依頼者).Value
         fld.Value = Me(W_No).Column(2)
         fld.Value = Me(W_Noロット).Value
         fld.Value = Me(品名).Value
         fld.Value = Me(希望処置).Value
         fld.Value = Me(補足説明).Value
    Next
    rs.Update
    rs.Close

前回の回答で、
一つずつ、フィールドに対応するテキストボックスの値を代入する方法と、
フィールド名とテキストボックスを同じにしておいて、いちいち指定せずにループで代入しておく方法、
の2つを提案したのですが、それを混ぜ和せてしまっては正常に動きません。

前者の方法でいくなら、上記のコードは、下記のようになります。(フィールド名とテキストボックス名は同じにしてあるという前提です)

    Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_依頼")
    rs.AddNew
    rs("依頼ID").Value = Me.依頼ID.Value
    rs("依頼日").Value = Me.依頼日.Value
    rs("依頼者").Value = Me.依頼者.Value
    rs("W_No").Value = Me.W_No.Value 'コンボボックスの連結列をフィールドのデータと合うものにしておく
    rs("W_Noロット").Value = Me.W_Noロット.Value
    rs("品名").Value = Me.品名.Value
    rs("希望処置").Value = Me.希望処置.Value
    rs("補足説明").Value = Me.補足説明.Value
    rs.Update
    rs.Close
8
wazawaza 2022/06/16 (木) 12:10:25

fld.Value = Now は無視してください。

7
wazawaza 2022/06/16 (木) 12:08:25

hatenaさん
ご丁寧な解説、本当に助かります!

前回相談にのって頂いたdbも、最初このSQLで躓き
別の本に載っていた「recordset.AddNew」で試したところ、
上手くいったので、もしや?と思っておりましたが
その“もしや”をご提案いただき、やっぱり!となりました。

さて、早速実践してみましたが、エラーです。
実行時エラー’2465’:
指定した式で参照されている’L0000002'フィールドが見つかりません。

下の文がデバックで黄色になります。
fld.Value = Me(依頼ID).Value

間違っていますね・・・😅
今現在、下記内容になっております


'##############################
'### レコード移動時のID採番 ###
'##############################

Private Sub Form_Current()

    Me.btn最新ID取得.Enabled = True  '「btn最新ID取得」を使用可能に
    Me.btn追加.Enabled = False       '「btn追加」を使用不可に(最新ID取得に導く仕掛け)
    
     Const prefix As String = "L"  '「laminate」の頭文字 "L"
    
    Dim maxID As String
    maxID = DMax("依頼ID", "T_依頼")  '最終IDを取り出す
    
    Dim lastNum As Long
    lastNum = Replace(maxID, prefix, "")  '最終IDから頭文字"L"を除き、数値型へ代入する
    
    Dim newID As String
    newID = prefix & Format(lastNum + 1, "0000000")  '+1して桁を揃えて頭文字"L"と結合
    
    Me.依頼ID.DefaultValue = "'" & newID & "'"  '既定値へ代入
End Sub

'##########################
'### 初期化プロシージャ ###
'##########################

Private Sub initializeForm()       '初期化

    Me.依頼日.Value = Null              '「依頼日」をクリア
    Me.依頼者.Value = Null              '「依頼者」をクリア
    Me.希望処置.Value = Null            '「希望処置」をクリア
    Me.WNo.Value = Null                 '「WNo」をクリア
    Me.W_No.Value = Null                '「W_No」をクリア
    Me.W_Noロット.Value = Null          '「W_Noロット」をクリア
    Me.品名.Value = Null                '「品名」をクリア
    Me.補足説明.Value = Null            '「補足説明」をクリア
    
    Dim i As Long
    For i = 1 To 10
        Me("詳細ID" & i).Value = Null           '「詳細ID」をクリア
        Me("ロット番号" & i).Value = Null       '「ロット番号」をクリア
        Me("ロット枝" & i).Value = Null         '「ロット枝」をクリア
        Me("依頼理由_1" & i).Value = Null       '「依頼理由_1」をクリア
        Me("依頼理由_2" & i).Value = Null       '「依頼理由_2」をクリア
        Me("依頼理由_3" & i).Value = Null       '「依頼理由_3」をクリア
        Me("巻き長さ" & i).Value = Null         '「巻き長さ」をクリア
        Me("詳細補足説明" & i).Value = Null     '「詳細補足説明」をクリア
    Next i
    
    Me.btn最新ID取得.Enabled = True        '「btn最新ID取得」を使用可能に
    Me.btn追加.Enabled = False             '「btn追加」を使用不可に
    Me.btn閉じる.Enabled = True            '「btn閉じる」を使用可能に
    Me.依頼ID.Enabled = True               '「依頼ID」を使用可能に
End Sub


'##############################################
'### 「txtW_No」「txt品名」に対する入力補助 ###
'##############################################

Private Sub WNo_AfterUpdate()    '「cmbW_No」の更新後処理
    W_No.Value = WNo.Column(7)   '「W_No」に7列目を表示。編集不可で設定中
    品名.Value = WNo.Column(2)   '「品名」に2列目を表示。編集不可で設定中
End Sub

Private Sub btn追加_Click()
    If IsNull(Me.依頼者.Value) Or IsNull(Me.希望処置.Value) _
    Or IsNull(Me.W_No.Value) Then
      MsgBox "必要項目が入力されていません", vbInformation, "確認"
      Exit Sub
    End If
    
    Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_依頼")
        rs.AddNew
        For Each fld In rs.Fields
         fld.Value = Me(依頼ID).Value
         fld.Value = Me(依頼日).Value
         fld.Value = Me(依頼者).Value
         fld.Value = Me(W_No).Column(2)
         fld.Value = Me(W_Noロット).Value
         fld.Value = Me(品名).Value
         fld.Value = Me(希望処置).Value
         fld.Value = Me(補足説明).Value
    Next
    rs.Update
    rs.Close
    
    Set rs = CurrentDb.OpenRecordset("T_依頼詳細")
    Dim i As Long
    For i = 1 To 10
      If Not IsNull(Me("依頼理由_1" & i).Value) Then
        rs.AddNew
        For Each fld In rs.Fields
           fld.Value = Me("依頼ID" & i).Value
           fld.Value = Me("ロット番号" & i).Value
           fld.Value = Me("ロット枝" & i).Value
           fld.Value = Me("依頼理由_1" & i).Column(1)
           fld.Value = Me("依頼理由_2" & i).Column(1)
           fld.Value = Me("依頼理由_3" & i).Column(1)
           fld.Value = Me("巻き長さ" & i).Value
           fld.Value = Me("詳細補足説明" & i).Value
           fld.Value = Now
        Next
        rs.Update
      End If
    Next i
    rs.Close

    MsgBox "追加しました", vbInformation, "完了"
End Sub

3
ほり 2022/06/15 (水) 23:16:28 d62ad@47ccc

将来的に同時使用する人数はどのくらいでしょうか?もしかするとデータベースをクラウドに持つにしてもSharePointよりAzureを最初から選択しておいた方が良いかもしれません。
テスト開発、小規模ならSharePointでも良いと思いますが使用規模が思っているよりも大きいとデータの応答速度に使用者が耐えれなくなるかもしれません。

PowerAppsですが、Accessのフォームをイメージして貰えると良いと思いますが試用版はどの程度まで出来るのでしょうか?
Accessは慣れているということなので、販売管理・製造管理をAccessで設計する際にここはクセがありそうだな、という部分をPowerAppsで実現できるかがキモになりそうです。
ものすごく複雑なリレーションシップやAccessの標準機能ではフォロー出来ない、VBAに頼るようなものが既に想定されているとなると、実現可否は私の知識ではわかりません…。

私も大手が出しているパッケージ製品の基幹システムが実務に噛み合わないために色々と試行錯誤をしている身です。YoutubeにもPowerAppsとSharePointを組み合わせた解説動画も多数ありますので、それらの作例からヒントを得てみてはいかがでしょう?あわせてPowerAutomateも知れると思います。

6
hatena 2022/06/15 (水) 12:08:53 修正

VBA内でのSQL文、めんどくさいですよね。
& でつなげなければいけない
データ型によって、#'で囲まなければならない
未入力だったばあい Null に変換したりする必要がある
など・・・

最初のSQLの場合は、1件のレコードを追加するだけですので、自分なら、recordset.AddNewを使いますね。

そうすると下記のようなコードですみます。

    Dim rs As Dao.Recordset

    Set rs = CurrentDb.OpenRecordset("T_依頼")
    rs.AddNew
    rs!依頼日 = Me.txt依頼日.Value
    rs!依頼者 = Me.cmb依頼者.Value
    rs!W_No = Me.txtW_No.Value
    rs!W_Noロット = Me.txtW_Noロット.Value
    rs!品名 = Me.txt品名.Value
    rs!希望処置 = Me.cmb希望処置.Value
    rs!補足説明 = Me.txt補足説明.Value
    rs.Update
    rs.Close

どうでしょうか。こちらの方がはるかにシンプルで読みやすいと思いませんか。

さらに、テキストボックス名をフィールド名と同じにしておけば、下記のようにいちいちフィールド名やテキストボックス名を記述する必要もなくなります。

    Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_売上")
    rs.AddNew
    For Each fld In rs.Fields
        fld.Value = Me(fld.Name).Value
    Next
    rs.Update
    rs.Close

2つめのSQL文は下記のようになります。

テキストボックス名は、
フィールド名の後に1~10の数字を付加したものにしておいて、

    Set rs = CurrentDb.OpenRecordset("T_依頼詳細")
    Dim i As Long
    For i = 1 To 10
      If Not IsNull(Me("依頼理由" & i).Value) Then
          rs.AddNew
          For Each fld In rs.Fields
              fld.Value = Me(fld.Name & i).Value
          Next
          rs.Update
      End If
    Next i
    rs.Close
5
wazawaza 2022/06/14 (火) 22:13:34

hirotonさん、
ありがとうございます!
後半のSQL文、最後の2項目
確かに間違っていました。

まずはSQL文自体を理解していないと
今回の間違いは見つけられないと
思います。発見まで暫く時間帯が
掛かりそうです😅

hatenaさん、
コメントアウトしたら、見事に
ハイライトされました。

先程も書きましたが
やはりSQL文を勉強をしないと
お二人から折角アドバイスを受けても
噛み砕けないままになってしまい
そうです。

もう少し勉強したのち、
今回のものを見直してみます!

ありがとうございました!

2
めむか 2022/06/14 (火) 16:58:29

「ほり」さま。
早々のご回答ありがとうございます。
ほぼおっしゃるとおりだと思います。
現在の企業規模的には、大したシステムを必須とするわけではないのですが、将来的にクラウドとスマホアプリが必須になると思って、勉強中です。
販売管理と製造管理については、今のところ年商1億円くらいのレベルで構築したいのですが、既製品をいくつか覗いてみましたが、やはり実情に合わない部分が多く、できれば自作したいとの思いからとりあえず、「Microsoft 365 Business」を導入してみようかというところです。
パソコンソフトとスマホアプリを同等のレベルで開発するというのは、やはり今のところ無理なのでしょうかね。
Accessには慣れているので、データのクラウド化ができれば、そこそこ業務システムは展開できると思うのですが「PowerApps」がAccess以上にコーディングフルなように見えて、悩んでいます。
Microsoft 以外の環境も調査中ですが、私自身が Microsoft に浸ってきているので、余計に解りにくくて困っています。

4
hatena 2022/06/14 (火) 09:40:16 修正

ハイライトされなくて困っております。

  On Error GoTo ErrorHandler
でエラー処理しているので、エラー場所はわからなくなります。
デバッグするときは、この行はコメントアウトしてから、実行するとエラー箇所がハイライトされるはずです。

おそらく、

   daoDb.Execute strSQL

がハイライトされるはずです。
ここで、strSQLに格納されているSQL文が間違っているのではと推測できます。

あとは、hirotonさんのご指摘を確認してみてください。

3
hiroton 2022/06/14 (火) 08:59:10 5f374@f966d

SQL実行時のエラーメッセージなので実際に実行されるSQL文を確認しましょう

Excel VBA 入門講座 - イミディエイトウィンドウ(pc-users.netさん)

ありがちなのは入力チェック漏れでNULLが指定されててVALUES(1234,,'ABC')みたいな文になってるとかですね


後半のSQL文ですが

フィールド囲み文字リテラルの型
[依頼ID]Me.txt依頼ID.Value(なし)数値
[ロット番号]Me("txtロット番号" & i).Value'文字列
[ロット枝]Me("cmbロット枝" & i).Value(なし)数値
[依頼理由_1]Me("cmb1依頼理由" & i).Value(なし)数値
[依頼理由_2]Me("cmb2依頼理由" & i).Value(なし)数値
[依頼理由_3]Me("cmb3依頼理由" & i).Value(なし)数値
[詳細補足説明]Me("txt巻き長さ" & i).Value(なし)数値
[最終更新日]Me("txt詳細補足説明" & i).Value(なし)数値

特に最後の2項目、間違っていませんか?


ついでにエラーについて

このコードではプログラムが中断されるようなエラーは発生していません。記述通りに動作して、MsgBox errMsg, vbCritical, "エラー"の文が実行されメッセージボックスが表示されているだけです。当然「デバッグ」ボタンも表示されませんし、ハイライト表示もできません

「そのようにプログラミングされている」ことを理解する必要があるでしょう

2
wazawaza 2022/06/13 (月) 21:59:52

hatenaさん、お世話になります。
ハイライトされなくて困っております。

下記がtryExecuteになります。
よろしくお願いします。

Functionさんさん tryExecute(sqlList As Collection) As String
  On Error GoTo ErrorHandler
  
  Dim daoDb As DAO.Database
  Set daoDb = CurrentDb
  
  Dim strSQL As Variant
  For Each strSQL In sqlList
    daoDb.Execute strSQL
  Next strSQL
  
  tryExecute = ""
  
  GoTo Finally
  
ErrorHandler:
  tryExecute = "Error #: " & Err.Number & vbNewLine & vbNewLine & Err.Description
  
Finally:
  If Not daoDb Is Nothing Then
    daoDb.Close
    Set daoDb = Nothing
  End If

End Function
1

そのエラーが出たとき、デバッグボタンを押すと、どの行がハイライトされますか。

あと、tryExecute という関数はないので、ユーザー定義関数と思いますが、そのコードも提示してください。

3
コードビギナー 2022/06/13 (月) 12:29:19 ddfe5@06db9

りんごさん・hatenaさんありがとうございました。色々試しまして Shell A & " " & B & C で上手く動作しました。私の方でコード内でのダブルクオーテーションの使い方が理解出来ていなかったのが原因ですね。いつもこれの使い方で混乱してしまいます。
よく調べるとOfficeのバージョンが2種インストールされていました。これも気がついていませんでした。
もっと勉強が必要ですね・・・

1
ほり 2022/06/11 (土) 19:51:03 d62ad@47ccc

以前、同じようなシチュエーションでAccessとSharePoint、PowerAppsで何ができるのかを勉強がてら触ったことがあります。ただ、私はその手のプロではないのでご了承ください…。

まずパソコンとスマホでそれぞれ何をしたいのかを明確にされたほうが良いと思います。両方とも同じレベルの操作ができないといけないのか、スマホはデータの照会や簡易的な入力などで良いのか…

もしかしたらデータの照会や簡易的な入力程度であればSharePointをアプリに落とすだけで事足りてしまうかもしれませんし、Accessで細かくイベントを設定するようなことがしたい場合はPowerAppsで実現できたとしても使い勝手が良いかはわかりません。

私の場合はスマホはデータの照会やスマホ側で入力変更できる機能はかなり限定的にしました。プルダウンやチェックボックスで選択させ、あとは保存する程度にしました。最初は色々盛り込んだのですが、結局パソコンでいいや、となってしまったので。

あとは販売管理と製造管理の具体的な内容を記載したほうが良いと思います。販売管理ですから金銭の話になるかと思いますが、受注/発注/売掛/買掛/入金/支払…製造管理ですとやはり材料の入荷管理や製造時の材料払出、いわゆる在庫管理ですね。
Accessでは実現可能だと思いますが、これらの全てをPowerAppsでスマホからも…となると素人眼では少しキツイのかな?という印象を持ちました。

あとは有識者の方を待ちましょう😅

3

お礼が遅くなりすみません、いろいろな方法があるのですね!
勉強になります。いろいろと試してみます。またよろしくお願い致します。