Microsoft Access 掲示板

views
4 フォロー
6,283 件中 1,841 から 1,880 までを表示しています。
6
ノッチ 2023/05/16 (火) 13:42:24 c8dc0@e817a

■続きです

  .ScreenUpdating = False
    .Workbooks.Open cstrTemplateDir & cstrTemplateBook
    .Workbooks(cstrTemplateBook).WorkSheets("Sheet2").Copy
   .DisplayAlerts = False
   .Workbooks(cstrTemplateBook).Save
   .Workbooks(cstrTemplateBook).Close
   .DisplayAlerts = True
    .Cells(2, 1).CopyFromRecordset rst2
  Set qdf3 = dbs.QueryDefs("Q_明細3_R")
  With qdf3
  .Parameters("見積りNO") = Forms!F見積!見積りNo
  Set rst3 = .OpenRecordset
  End With
  Set xls = CreateObject("Excel.Application")
  With xls
    .ScreenUpdating = False
    .Workbooks.Open cstrTemplateDir & cstrTemplateBook
    .Workbooks(cstrTemplateBook).WorkSheets("Sheet3").Copy
   .DisplayAlerts = False
   .Workbooks(cstrTemplateBook).Save
   .Workbooks(cstrTemplateBook).Close
   .DisplayAlerts = True
    .Cells(2, 1).CopyFromRecordset rst3
    rst1.Close
    rst2.Close
    rst3.Close
    '保存するファイル名のフルパスを組み立て
   strSaveBookPath = cstrSaveBookDir & "見積書
" & Format$(Forms!F_見積!物件名) & ".xlsx"
    On Error Resume Next '同名ファイルを強制削除
    Kill strSaveBookPath
    On Error GoTo 0
    .ScreenUpdating = True    '画面の再描画を元に戻す
    .ActiveWorkbook.SaveAs strSaveBookPath  'データを代入したブックを保存
    MsgBox "データを保存しました"
    .Quit 'Excelを終了
  End With
  Set xls = Nothing
    End With
    End With
End Sub

5
ノッチ 2023/05/16 (火) 13:42:09 c8dc0@e817a

お世話様です。ネットの記事を読んで作成しましたが、VBA勉強不足のために途中で止まりました。
以下、2つのコードです。ご教示をよろしくお願いします。
■DAOでエクスポートをしようとした
Private Sub コマンド53_Click()
  Dim SQL As String
  Dim dbs As DAO.Database
  Dim qdf1 As DAO.QueryDef
  Dim qdf2 As DAO.QueryDef
  Dim qdf3 As DAO.QueryDef
  Dim rst1 As DAO.Recordset
  Dim rst2 As DAO.Recordset
  Dim rst3 As DAO.Recordset
  Dim xls As Object
  Dim strSaveBookPath As String
  'テンプレートの保存先フォルダ
Const cstrTemplateDir As String = "\SV30**\metal2*課\HDD\リフォーム見積りDB\見積書\"
  Const cstrTemplateBook As String = "RF見積書.xlsx" 'テンプレートのファイル名
  Const cstrSaveBookDir As String = "\SV30
\metal2***課\HDD\リフォーム見積りDB\見積書\" 'データが代入されたファイルの保存先フォルダ
  Set dbs = CurrentDb  'データ元のクエリを開く
  Set qdf1 = dbs.QueryDefs("Q_見積明細1_P")  'クエリのオブジェクトを取得します
  With qdf1
  'クエリのオブジェクトに対して設定を行います。”抽出する○○ID”などがパラメータ名です
  .Parameters("見積りNo").Value = Forms!F_見積!見積りNo
  Set rst1 = .OpenRecordset  '設定後のクエリオブジェクトを元にRecordsetを開きます
  End With
  Set xls = CreateObject("Excel.Application")  'Excelオブジェクトを生成
  With xls
    .ScreenUpdating = False '画面の再描画を抑止
    .Workbooks.Open cstrTemplateDir & cstrTemplateBook  'テンプレートファイルを開く
    .Workbooks(cstrTemplateBook).WorkSheets("Sheet1").Copy 'ワークシートをコピー
   .DisplayAlerts = False 'テンプレートファイルを閉じる
   .Workbooks(cstrTemplateBook).Save
   .Workbooks(cstrTemplateBook).Close
   .DisplayAlerts = True
    .Cells(2, 1).CopyFromRecordset rst1
  Set qdf2 = dbs.QueryDefs("Q_明細2_R")
  With qdf2
  .Parameters("見積りNO") = Forms!F_見積!見積りNo
  Set rst2 = .OpenRecordset
  End With
  Set xls = CreateObject("Excel.Application")
  With xls

■次に続きます

4
ノッチ 2023/05/16 (火) 13:07:57 c8dc0@e817a

お世話様です。書き込みを有難うございます。
既存のテンプレートで名前を物件名を入れ込んで保存しようとしていました。(過去にこれは作成しています)
エクスポートはシートを指定して(クエリ毎にシート1・2・3と指定している)いますが、新しく書き込みをするようで、初めのシート1・2は消えて3だけがエクスポートされます。

3

エクセルファイルは新規に作成したものにエクスポートするのでしょうか。
それとも既存のテンプレートがあり、そこに出力するということでしょうか。

DoCmd.TransferSpreadsheetで3つのクエリをエクスポートすると3つ目のデータはエクスポートされますが
、前の2つは消えてしまいます。

DoCmd.TransferSpreadsheetで既存のエクセルファイルにエクスポートすると、クエリはそれぞれ別々のシートに出力されると思いますが、そうはならないですか。

まずは、現状のコードを提示してもらえますか。

2
ノッチ 2023/05/16 (火) 09:17:54 c8dc0@e817a

お世話様です。早速の書き込みを有難うございます。
クエリはテーブルを元に作成しており、それぞれT_明細1、T_明細2、T_明細3のテーブルとなっていて、3つのテーブルは明細NOフィールドをオートナンバーとして、テキストフィールドと数値や計算式のフィールドは数値型となっています。
テーブルをそのままクエリにしていますが、基本となるT_見積物件情報の見積りNOをオートナンバーとして、3つのクエリはQ_明細1、Q_明細2、Q_明細3で、見積りNOと明細NOにテキストと数値フィールドで構成されています。
Q_明細1のみは、T_見積物件情報とT_明細1の2つのテーブルとしています。
最大で3枚の見積書になりますが、フォームで親をT_見積物件情報、子を明細1~3で各フィールドをエクセルのような配置にしており、明細1は約170(7列×24行)フィールド明細2と3は約200(7列×28行)フィールドづつになっています。
T_見積物件情報は殆んどがテキスト型で、物件名・誦所・担当者に日付などが有ります。
Q_明細1・2・3は見積り書のNO・品名・数量・単位・単価・金額・備考(7列)で、T_製品マスタから品名をコンボボックスで選択し、数量を入れると単位・単価・金額が入るようになっています。
エクセルに出力するには上記と同じ形式の帳票で考えていますが、1物件づつの見積り書としてエクスポートするために、フォームの見積りNOでフィルターを掛けて、各クエリのデータをエクセルのシート1・2・3へ1行づつ出力して、それを元にしてもう一つのシートへ見積書として統合するよう、エクセル側でVBAを組んでデータを振り分けたいと考えています。
以上がデータベースの概要ですが、不足が有りましたらご指摘ください。
お手数を掛けますが、ご教示をよろしくお願いします。画像1

1

回答するには、
見積書のクエリのそれぞれのフィールド構成、
エクセルへ出力する場合のレイアウト、
の情報が必要かと思います。

できれば、それぞれのクエリのデータ例、
それをエクセルに出力したときのデータレイアウト、
があればより回答しやすいです。

2
あん 2023/05/15 (月) 14:06:28 927ea@5024a

hiroton様
ご返答ありがとうございます。

ご指摘の箇所には全く気づきませんでした!
そんなところが変になっていたとは。

コピペです。
元々、Accessで作った式をLibreOffice Writerにコピーして一部書き換えしたので、そこで"が”になってしまったようです。

助かりました。
さすがです。

1
hiroton 2023/05/15 (月) 13:25:24 40792@f966d

「実際の式」はコピペですか?
Dsum("見積金額","qry見積","見積番号 = '" & [見積番号] & "' and (特殊行 = 3 Or 特殊行 = 4 Or 特殊行 = 5 Or 特殊行 = 6 Or 特殊行 is null))

Dsum("見積金額","qry見積","見積番号 = '" & [見積番号] & "' and (特殊行 = 3 Or 特殊行 = 4 Or 特殊行 = 5 Or 特殊行 = 6 Or 特殊行 is null)”)

↓

Dsum("見積金額","qry見積","見積番号 = '" & [見積番号] & "' and (特殊行 = 3 Or 特殊行 = 4 Or 特殊行 = 5 Or 特殊行 = 6 Or 特殊行 is null)")
5
コロン 2023/05/09 (火) 18:02:29 a439f@f2d2a

hatena様
hiroton様

ありがとうございます。また、返答遅くなり申し訳ありません。

他の部分での原因がわかり解決しました。
ユニオンクエリで結合した際にデーター型が数値型からテキスト型に変換してました。
元々型の違うテーブルでフィールド名だけをそろえたテーブルだったので…

再度SQLで数値型に変換したところ合計値が表示しました。

お騒がせしてすみません。まだまだACCESS初心者なので今後もよろしくお願いします。
ありがとうございました。

4
hiroton 2023/05/09 (火) 12:04:51 ceb48@f966d

いちおう

他のフィールド(計算)でエラーがあると正常なはずのフィールドでもエラーを表示する

という謎の現象が発生することはあります

最小構成でフォームを作成して=Sum([フィールド名])でエラーが出ないか見てみるといいと思います

3

=Sum(Nz([フィールド名], 0))
でも「#エラー」になってしまいます…

Nz関数はNull値を0に変換する関数ですので、それでもエラーになるということは、フィールドにNull値が含まれているのが原因ではないということになります。

現状のユニオンクエリのSQLを提示してもらえますか。

2
コロン 2023/05/09 (火) 10:56:12 a439f@f2d2a >> 1

hatena様ありがとうございます
=Sum(Nz([フィールド名], 0))
でも「#エラー」になってしまいます…

他に部分での原因としては2つのテーブルをユニオンクエリで1つの結合テーブルにしてます
フォームへのデータは結合テーブルのフィールドになります。
そのフィールドの合計値をと考えてます。
ACCESS初心者なので上記のわかりにくい説明ですみません。

1

Sum関数は空白(Null値)があってもエラーなく計算してくれるはずですが。

他の部分に原因がありそうです。
そのフィールドは演算フィールドだったりしませんか。
もし、そうならその式を提示してください。

いちおう、下記の式にした場合はどうなりますか。

=Sum(Nz([フィールド名], 0))
39

独立した内容で新たに追加したいということであれば、改めて質問を立てたほうがいいかもしれません。既存環境に追加したいということでこの質問のURL(https://zawazawa.jp/ms-access/topic/564
を記載するといいと思います


今ちょっと腰を据えて手を付けられそうにないので確認と方針を挙げておきます

ひとまず分類のみの索引が出力されるか試してみる
→レポートを複製して、コードをいったん全て削除して、分類用索引のコードのみでテストする

分類の索引は出力順でいいですか?
→出力順を弄らないならコードを弄るところもほぼないと思います。(コントロール名くらい)
レポートの最初(レポートヘッダー)に出力するか最後(レポートフッター)に出力するかでコードが変わってくるので使うコードをよく見てください。また、これに合わせてコントロール(テキストボックス)の配置場所も重要かもしれません

コントロール名が正しく指定できているか?
→コントロール名
×:コントロールソースプロパティ
〇:名前プロパティ
です。
また、掲示板上のやり取りがやりやすいように具体的な名前を付けておくといいと思います
既存のコードがこの質問のコピペなら「txt目次N(N=0,1,2)」となっていると思います。(改めて見直したらソートしてるので「目次」じゃないですね)
分かりやすいように既存のテキストボックスはtxt目次Ntxt薬品名索引Nとして、今回追加する様のはtxt分類索引とするなど
分類索引も段組みにしたいのなら、その情報も必要ですね

分類だけで索引がうまく作成出来たら元のレポートと組み合わせます
既存の索引の前にということなので、レポートフッターの先頭に「txt分類索引テキストボックス」と「改ページコントロール」を挿入すればいいのでは?と思っていますがテストできていません

38
norinori 2023/05/08 (月) 16:10:57

hirotonさんの目にとまり良かったです。薬品名を五十音順とした索引はそのままで、分類とその
ページの索引を新たに追加したいです。五十音順の索引コードに何かあっては困るので、分類索引のコードは別で作成していました。配置は五十音順索引の前にしたいです。宜しくお願い致します。

13
hiroton 2023/05/08 (月) 11:39:39 8b032@f966d

ループ処理はループ内のコードをそのまま繰り返します

hatenaさんも指摘していることですが、ループの最後で上書きするような処理はループ内に含める必要は薄いです。質問のコードも

For i = 1 To 5

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & i)

Next i

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 5)

Forms![F_test2]![txtテキスト_1] = Me.Controls("txt子テキスト_" & 5)

と何ら変わらないので意味のない(≒ダメな)コードです。hirotonの伝わらない回答もそんな感じのことを言っていました


ループ処理を使うときは「イニシャル部」「メイン部」「エンド部」(前処理、メイン処理、後処理)を考えるようにすると良いです
「最終的にやりたいこと」と「ループ処理させたら楽そうな部分」を明確にすることですね

以下、いくつか同様のことを成すコードを記述してみます

Forms![F_test2]![txtテキスト_1] = Me.txt子テキスト_1 & vbNewLine & Me.txt子テキスト_2 & vbNewLine & Me.txt子テキスト_3 & vbNewLine & Me.txt子テキスト_4 & vbNewLine & Me.txt子テキスト_5 & vbNewLine &
Forms![F_test2]![txtテキスト_1] = Me.txt子テキスト_1 & vbNewLine
Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.txt子テキスト_2 & vbNewLine
Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.txt子テキスト_3 & vbNewLine
Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.txt子テキスト_4 & vbNewLine
Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.txt子テキスト_5 & vbNewLine &
Dim memo As String
memo = Me.txt子テキスト_1 & vbNewLine
memo = memo & Me.txt子テキスト_2 & vbNewLine
memo = memo & Me.txt子テキスト_3 & vbNewLine
memo = memo & Me.txt子テキスト_4 & vbNewLine
memo = memo & Me.txt子テキスト_5 & vbNewLine
Forms![F_test2]![txtテキスト_1] = memo
Dim i As Long

Forms![F_test2]![txtテキスト_1] = ""
For i = 1 to 5
  Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.Controls("txt子テキスト_" & i) & vbNewLine
Next
Dim i As Long

Forms![F_test2]![txtテキスト_1] = Me.txt子テキスト_1 & vbNewLine
For i = 2 to 5
  Forms![F_test2]![txtテキスト_1] = Forms![F_test2]![txtテキスト_1] & Me.Controls("txt子テキスト_" & i) & vbNewLine
Next
Dim i As Long
Dim memo As String

memo = Me.txt子テキスト_1 & vbNewLine
For i = 2 to 5
  memo = memo & Me.Controls("txt子テキスト_" & i) & vbNewLine
Next
Forms![F_test2]![txtテキスト_1] = memo

無駄な記述はしないというのがプログラミングの基本ではありますが、

memo = ""
memo = memo  & txt子テキスト_1 & vbNewLine  '//ここの「= memo」のmemoは無駄だけど
memo = memo  & txt子テキスト_2 & vbNewLine


'//このような記述は冗長に思える
memo = txt子テキスト_1 & vbNewLine
For i = 2 To 5
  memo = memo  & Me.Controls("txt子テキスト_") & i & vbNewLine
Next

'//無駄な処理を含むコードでもこっちのほうが見やすい
memo = ""  
For i = 1 To 5
  memo = memo  & Me.Controls("txt子テキスト_") & i & vbNewLine
Next

「目的が達成されない」や「エラーが出る」などの不正解は簡単な話ですが、善し悪しを語るのはなかなかに難しい話ですね

37
hiroton 2023/05/08 (月) 10:43:42 8b032@f966d

なにやら見覚えのあるタイトルが、と覗いてみたら懐かしい記憶が少しだけよみがえりました(ほとんど忘れてます)


今までの(薬品名を五十音ソートした)索引とはどういう関係ですか?
・削除して新たに分類ごとの索引を配置
・残したまま新たに分類ごとの索引を配置(→配置位置は?既存の索引の前? or 後 or その他)
・複合した索引を設置、薬品名は分類のグループごとに分割
・その他

10
wazawaza 2023/05/07 (日) 22:11:51

りんごさん
社内では、製品を口座番号で管理しております。
また、当該DBは社内基幹システムの口座番号と紐付けされています。
口座管理は既成事実ですので、おそらく問題は起こらないのでは?と考えております。
ありがとうございます!

12
えいじ 2023/05/07 (日) 22:01:45

hatena様

ご丁寧にありがとうございました。

9
りんご 2023/05/07 (日) 21:51:59 935bc@0e907 >> 8

 そうしたいのであれば、責任を負わなくて済むように立ち回りましょう。会社から口座番号を主キーにするように命令されていたので、その前提のもとで設計を開始したんだ。諸々の選択肢を検討したんだけれどね。根回し・既成事実化しておかないと詰みますな。

8
wazawaza 2023/05/07 (日) 21:01:08

リンゴさん
派生・親子・参照それぞれの関係性について
ご提案いただきありがとうございます。
このDBは、口座番号で検索する既存用紙をDB化したものなので、
口座番号を主キーにした方が、不特定多数の者が使用することを想定しても
移行しやすいと思い設計しました。ご提案の内容も、一度検討したいと思います。

toneさん
列名の件、設計段階で「どうかな?」なんて思いながらもハイフンを使用しました。
改名したいと思います。ありがとうございます!

hatenaさん
ご指摘ありがとうございます。
ちょうど一年前に、こちらで非連結フォームの質問をした際に、同じようなご指摘を頂きました。
前回のDBでは、最大10人の者が使用する想定でしたので、よく目にする「ユーザー用の画面は
非連結で、予期せぬ更新を排除」というのを実践したく、こちらで助けていただきました。
今回のDBでは、データ編集をするのは最大3人で、かつ同時にデータ編集は行われないので、
ご指摘の通り、連結で設計してもよいかもしれませんね!

1
初老の人 2023/05/06 (土) 20:07:01 96de1@3d6cc

format で自己解決しました。

36
norinori 2023/05/06 (土) 13:21:38

2年程前、医薬品集の索引作成で大変お世話になりました。今回、この医薬品集に大分類(薬効87分類)、中分類(拡張薬効分類)を設けてレポートも作成し直した為、分類ごと(薬効87分類)の索引も欲しいと思い、hateneさんが提示されていた『目次(索引)ページを自動作成』を元にコピペしてみたのですが、テキストボックスに何もはきださない現象となっています。分からないなりに試行錯誤しましたが、どこが間違っているのかさっぱり分かりません。ご教示お願い致します。
Option Compare Database
Option Explicit

Private Sub グループヘッダー1_Format(Cancel As Integer, FormatCount As Integer)
    If Me.Pages = 0 Then
        Me.txt索引 = Me.txt索引 & Left(薬効87分類 & String(12, "・"), 12) & Format(Me.Page, "@@@") & vbCrLf
    End If
End Sub
Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    Me.Page = 0
End Sub
画像1
画像2

35
norinori 2023/05/06 (土) 13:19:32

↑すみません投稿し直します。

34
norinori 2023/05/06 (土) 13:17:37

2年程前、医薬品集の索引作成で大変お世話になりました。今回、この医薬品集に大分類(薬効87分類)、中分類(拡張薬効分類)を設けてレポートも作成し直した為、分類ごと(薬効87分類)の索引も欲しいと思い、hateneさんが提示されていた『目次(索引)ページを自動作成』を元にコピペしてみたのですが、テキストボックスに何もはきださない現象となっています。分からないなりに試行錯誤しましたが、どこが間違っているのかさっぱり分かりません。ご教示お願い致します。
Option Compare Database
Option Explicit
Private Sub グループヘッダー1_Format(Cancel As Integer, FormatCount As Integer)
    If Me.Pages = 0 Then
        Me.txt索引 = Me.txt索引 & Left(薬効87分類 & String(12, "・"), 12) & Format(Me.Page, "@@@") & vbCrLf
    End If画像1
画像2

End Sub

Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    Me.Page = 0
End Sub

11

そのコードでも結果は同じになりますが、memoをテキストボックスの代入するのは最後に1回のみでいいので、ループ内で繰り返すのは無駄ですね。

Sub 転記()
    Dim memo As String
    memo = ""
    For i = 1 To 5
        memo = memo  &  Me.Controls("txt子テキスト_" & i) & vbNewLine
    Next i
    Forms![F_test2]![txtテキスト_1] = memo
End Sub
5
初老の人 2023/05/06 (土) 08:00:35 96de1@3d6cc

早速のご指導ありがとうございます。小生、配列は全く理解(?)できていません。いろいろな達人からの助言・指導を受けて応用しながら使っています。助言いただいた構文、大切に使わせていただきます。改めておれいもうしあげます。

4

こんな感じでどうですか。

Public Sub test()
    
    Dim excelBookName As String
    Dim Sheets As String
    Dim strRange As String
    excelBookName = "Book1.xlsm"
    Sheets = "data,aaa,bbb,ccc" 'カンマ区切りで対象シート名を記述
    strRange = "!A7:I"

    Dim myDir As String, excelPath As String
    myDir = Application.CurrentProject.Path 'データベースファイルのパス
    excelPath = myDir & "\" & excelBookName

    Dim sheet
    For Each sheet In Split(Sheets, ",")
        DoCmd.TransferSpreadsheet acImport, _
                              acSpreadsheetTypeExcel12Xml, "T_2022", excelPath, , sheet & strRange
    Next

End Sub
3
初老の人 2023/05/05 (金) 11:26:37 68b80@3d6cc

早速のご指導、ありがとうございます。
シート数分記述 はできたのですが、「シート名を配列に格納して、Fprループで繰り返す」方法ができません。
シート名は固定されています。上記の構文を教授お願いできませんか?
よろしくお願いいたします。

2

例えば、data、aaa、bbb の固定なら、

     DoCmd.TransferSpreadsheet acImport, _
                    acSpreadsheetTypeExcel12Xml, "T_2022", varxls, ,"data!A7:I"
     DoCmd.TransferSpreadsheet acImport, _
                    acSpreadsheetTypeExcel12Xml, "T_2022", varxls, ,"aaa!A7:I"
     DoCmd.TransferSpreadsheet acImport, _
                    acSpreadsheetTypeExcel12Xml, "T_2022", varxls, ,"bbb!A7:I"

とシート数分記述すればいいでしょう。

シート数が多い場合は、シート名を配列に格納して、Fprループで繰り返すようにすれば短くできます。

シート名か固定でなく、事前にシート名か分からないなら、TransferSpreadsheet では無理なので、VBAでExcelアプリケーションを開いて処理することになります。

AccessからExcelを操作する 《CreateObject》|Access|ヘルプの森

1

シート名は固定ですか、それとも、その時々で変わりますか。変わる場合は全シートが対象ですか。

10
えいじ 2023/05/05 (金) 10:32:00

Sub 転記()
Dim memo As String
memo = ""
For i = 1 To 5
memo = memo  &  Me.Controls("txt子テキスト_" & i) & vbNewLine

Forms![F_test2]![txtテキスト_1] = memo
Next i
End Sub

こういうことだったのですね。

hiroton様
hatena様

ご丁寧にありがとうございました。

7
hatena 2023/05/03 (水) 09:32:08 修正

質問に対する直接の回答ではなく、前提に関する疑問点なんですが、

リレーションシップをみると一つのメインテーブルに4つのサブテーブルが紐づいているという関係ですね。つまり一対多の関係が4組あるということになります。

これを非連結のコントロールを想定されるレコード数分配置してそこに表示するという設計ですね。

通常、Accessでは一対多の関係のデータはメイン/サブフォーム形式で簡単に表示させることが可能です。
今回の場合は、[T_機械設定]をメインフォームのレコードソースにして、そこに4つのサブテーブルをサブフォームとしてそれぞれ配置すれば、コード無しに目的のことは実現できます。

そうせずに、非連結で設計する理由はなんでしょうか。

現状だと、レコード数が用意したコントロール数を超えてしまうということもあるし、コード量が増えて、メンテナンスも大変になるだけでメリットがあるようには思えないですが。

9

現状のコードをhirotonさんの回答あった「(元の値)と(転記する値) & vbNewLineを連結して上書きする」というヒントを元に書き換えると、下記になります。

Sub 転記()
Dim memo As String
memo = ""

memo = memo  & txt子テキスト_1 & vbNewLine
memo = memo  & txt子テキスト_2 & vbNewLine
memo = memo  & txt子テキスト_3 & vbNewLine
memo = memo  & txt子テキスト_4 & vbNewLine
memo = memo  & txt子テキスト_5 & vbNewLine

Forms![F_test2]![txtテキスト_1] = memo

End Sub

これを質問の最初のコードのForループと同じ考え方で書き換えればいいでしょう。

6

「FUTEC品名4-表」のようなハイフンを含む列名は、SQLでマイナス記号として扱われてしまうため、[FUTEC品名4-表]のように角かっこで囲む必要があります。しかし、このような列名は他の場面でもトラブルの種になりがちなので、可能なかぎり列名を変更したほうが良いと思います。

5
りんご 2023/05/02 (火) 13:51:33 935bc@0e907 >> 4

派生関係 T_特記事項:🔑品名,🔑開始日,特記事項
T_機械設定:🔑品名,🔑開始日,…,承認者,承認日
親子関係 T_クレーム履歴:🔑品名,🔑開始日,🔑クレーム履歴番号,…
親子関係 T_FUTEC設定:🔑品名,🔑開始日,🔑検査番号,…
参照関係 T_更新履歴:🔑承認者,🔑承認日,…
とりあえず、たたき台にどうですか?

4
wazawaza 2023/05/02 (火) 11:23:21

りんごさん、ありがとうございます。
リレーションシップに関するご指摘ですが、このような感じで良いでしょうか?
画像1

シングルクォーテーションとカンマについて。
おっしゃる通りでした。ありがとうございます!

3
りんご 2023/05/02 (火) 10:57:33 935bc@0e907 >> 1

リレーションシップウィンドウのスクショでしょうか?
もしかしたら、主キーの設定が緩い、リレーションシップが未設定、という課題があるかもしれませんね。
品名と年月を軸に、再検討は如何でしょうか?
参考サイト
リレーションシップの作成と参照整合性の設定

8
えいじ 2023/05/02 (火) 10:15:48
Sub 転記()


memo = txt子テキスト_1 & vbNewLine _
       & txt子テキスト_2 & vbNewLine _
       & txt子テキスト_3 & vbNewLine _
       & txt子テキスト_4 & vbNewLine _
       & txt子テキスト_5 & vbNewLine

Forms![F_test2]![txtテキスト_1] = memo

End Sub

教えていただいた、処理方法と違うかもしれませんが、
実現することは、一応できます。

ただ、テキストボックスの最後に数字が連続しているので、ループまたは、カウントアップで出来ないかなと思いました。

https://zawazawa.jp/ms-access/topic/876

このトピで、hatena様から、改行コードを入れることで、転記ができたので、安直に、転記できると思いました。

ただ、hiroton様が、初めにカウントアップのことを記載したということは、カウントアップでコードを短くできるのでしょうか?

2
りんご 2023/05/02 (火) 10:09:42 935bc@0e907

  "SELECT '更新日時, '起案者', '承認者', '制定・改訂理由' " & _

最初のシングルクォテーションは、閉じないのでしょうか?

"T特記事項.'特記事項', " &

最後のカンマは、必要ですか?