回答編集履歴

3

コード微修正

2020/09/08 05:22

投稿

hatena19
hatena19

スコア33757

test CHANGED
@@ -54,6 +54,8 @@
54
54
 
55
55
  ' 省略した場合はワークブックを新規作成する
56
56
 
57
+ ' 既に開いているワークブックに追加するときは、データのフィールドは同一とする
58
+
57
59
  Function ExcelData(frm As Form, Optional wkb As Object) As Object
58
60
 
59
61
  On Error GoTo Err_Excelcmd_Click

2

コード追加

2020/09/08 05:22

投稿

hatena19
hatena19

スコア33757

test CHANGED
@@ -29,3 +29,187 @@
29
29
 
30
30
 
31
31
  [サブフォームとサブフォームコントロールの違いとは? - hatena chips](https://hatenachips.blog.fc2.com/blog-entry-347.html)
32
+
33
+
34
+
35
+
36
+
37
+ 複数のサブフォームのデータを一つのブックに連続して追加する場合
38
+
39
+ ---
40
+
41
+
42
+
43
+ **標準モジュール**
44
+
45
+ ```vba
46
+
47
+ 'Excelにデータを出力
48
+
49
+ '引数
50
+
51
+ ' frm: フォームオブジェクト(省略不可)
52
+
53
+ ' wlb: 既に開いているワークブック(省略可)
54
+
55
+ ' 省略した場合はワークブックを新規作成する
56
+
57
+ Function ExcelData(frm As Form, Optional wkb As Object) As Object
58
+
59
+ On Error GoTo Err_Excelcmd_Click
60
+
61
+
62
+
63
+ 'DAOで抽出結果のクローンを作成
64
+
65
+ Dim xls As Object 'Excel.Applicationを代入するオブジェクト変数
66
+
67
+ ' Dim wkb As Object 'Excel.Wookbookを代入するオブジェクト変数
68
+
69
+ Dim rst As DAO.Recordset '現在のレコードセットを入れる変数
70
+
71
+ Dim idx As Long 'フィールド数変数
72
+
73
+
74
+
75
+ Set rst = frm.Recordset.Clone 'フォームのレコードセットのクローンを代入
76
+
77
+
78
+
79
+ 'レコードが存在しない場合、処理を中止
80
+
81
+ If rst.BOF = True And rst.EOF = True Then
82
+
83
+ MsgBox "出力出来るデータがありません。", vbOKOnly + vbExclamation, "出力不可"
84
+
85
+ 'レコードセットを閉じる
86
+
87
+ rst.Close: Set rst = Nothing
88
+
89
+ Exit Function
90
+
91
+ End If
92
+
93
+
94
+
95
+ 'レコードが存在する場合、Excelに出力
96
+
97
+ 'レコードセットの最初のデータにカーソルを移動
98
+
99
+ rst.MoveFirst
100
+
101
+
102
+
103
+ If wkb Is Nothing Then 'ワークブックが指定されていないとき
104
+
105
+ 'Excelファイルを内部的に作成
106
+
107
+ Set xls = CreateObject("Excel.Application")
108
+
109
+ '作成されたExcelファイルにワークブックを追加
110
+
111
+ Set wkb = xls.Workbooks.Add()
112
+
113
+ Else
114
+
115
+ Set xls = wkb.Application
116
+
117
+ End If
118
+
119
+
120
+
121
+ 'ワークブックに、レコードセットのデータをコピー
122
+
123
+ With wkb.Worksheets(1)
124
+
125
+ If .Range("A1") = "" Then
126
+
127
+ For idx = 1 To rst.Fields.Count
128
+
129
+ .Cells(1, idx).Value = rst.Fields(idx - 1).Name
130
+
131
+ Next
132
+
133
+ End If
134
+
135
+ Dim LastRow As Long
136
+
137
+ LastRow = .Range("A1").CurrentRegion.Rows.Count
138
+
139
+ .Cells(LastRow + 1, 1).CopyFromRecordset Data:=rst
140
+
141
+ End With
142
+
143
+
144
+
145
+ 'レコードセットを閉じる
146
+
147
+ rst.Close: Set rst = Nothing
148
+
149
+ 'Excelデータを表示
150
+
151
+ xls.Visible = True
152
+
153
+ xls.UserControl = True
154
+
155
+ 'メモリに展開されたExcel用オブジェクト変数を開放
156
+
157
+ Set ExcelData = wkb
158
+
159
+
160
+
161
+ Set wkb = Nothing
162
+
163
+ Set xls = Nothing
164
+
165
+
166
+
167
+ Exit_Excelcmd_Click:
168
+
169
+ Exit Function
170
+
171
+
172
+
173
+ Err_Excelcmd_Click:
174
+
175
+ 'エラーの場合、エラーNOと内容を表示
176
+
177
+ ' MsgBox Err.Number & Err.Description
178
+
179
+ MsgBox "エラーのため、Excelへ出力できません。" & vbCrLf & "一旦フォームを閉じ、再度トライしてください。", _
180
+
181
+ vbOKOnly + vbCritical, "Excel出力不可!"
182
+
183
+ Resume Exit_Excelcmd_Click
184
+
185
+ End Function
186
+
187
+ ```
188
+
189
+
190
+
191
+ フォームのモジュール
192
+
193
+ ```vba
194
+
195
+ Private Sub コマンド1_Click()
196
+
197
+ Dim wkb As Object
198
+
199
+
200
+
201
+ Set wkb = ExcelData(Me.埋め込み1.Form)
202
+
203
+ Set wkb = ExcelData(Me.埋め込み2.Form, wkb)
204
+
205
+ Set wkb = ExcelData(Me.埋め込み3.Form, wkb)
206
+
207
+ Set wkb = ExcelData(Me.埋め込み4.Form, wkb)
208
+
209
+
210
+
211
+ Set wkb = Nothing
212
+
213
+ End Sub
214
+
215
+ ```

1

参考リンク追加

2020/09/08 05:19

投稿

hatena19
hatena19

スコア33757

test CHANGED
@@ -23,3 +23,9 @@
23
23
 
24
24
 
25
25
  サブフォーム名とサブフォームコントロール名は別物ということは認識してますか。
26
+
27
+ わからなければ、下記のリンク先を参考にしてください。
28
+
29
+
30
+
31
+ [サブフォームとサブフォームコントロールの違いとは? - hatena chips](https://hatenachips.blog.fc2.com/blog-entry-347.html)