teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

コード修正

2021/01/11 16:21

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -95,7 +95,7 @@
95
95
 
96
96
  '開いているExcelブック数を数えて、2個目以降のブックのSheets(1)を1個目のブックに追加して閉じていく
97
97
  'ブックを閉じる場合は、最後のブックから閉じていかないとうまくいかない
98
- For i = xlsx.Workbooks(xlsx.Workbooks.Count) To 2 Step 1
98
+ For i = xlsx.Workbooks.Count To 2 Step 1
99
99
  xlsx.Workbooks(i).Worksheets(1).Copy _
100
100
  Before:=xlsx.Workbooks(1).Sheets(1) 'ワークブック1にシートを追加してコピー
101
101
  xlsx.Workbooks(i).Close

4

コード修正

2021/01/11 16:20

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -85,25 +85,26 @@
85
85
  Exit Sub
86
86
  End If
87
87
 
88
- Dim DesktopPath As String, FilePath As String, WSH As Variant
88
+ Dim DesktopPath As String, FilePath As String, WSH As Variant
89
- Set WSH = CreateObject("Wscript.Shell")
89
+ Set WSH = CreateObject("Wscript.Shell")
90
- DesktopPath = WSH.SpecialFolders("Desktop")
90
+ DesktopPath = WSH.SpecialFolders("Desktop")
91
- FilePath = DesktopPath & "\保存名.xlsx"
91
+ FilePath = DesktopPath & "\保存名.xlsx"
92
92
 
93
- 'メイン処理
93
+ 'メイン処理
94
- Dim i As Integer
94
+ Dim i As Integer
95
95
 
96
96
  '開いているExcelブック数を数えて、2個目以降のブックのSheets(1)を1個目のブックに追加して閉じていく
97
+ 'ブックを閉じる場合は、最後のブックから閉じていかないとうまくいかない
97
- For i = 2 to xlsx .Workbooks(xlsx.Workbooks.Count)
98
+ For i = xlsx.Workbooks(xlsx.Workbooks.Count) To 2 Step 1
98
- xlsx .Workbooks(i).Worksheets(1).copy _
99
+ xlsx.Workbooks(i).Worksheets(1).Copy _
99
- Before:=xlsx.Workbooks(1).Sheets(1) 'ワークブック1にシートを追加してコピー
100
+ Before:=xlsx.Workbooks(1).Sheets(1) 'ワークブック1にシートを追加してコピー
100
- xlsx.Workbooks(i).Close
101
+ xlsx.Workbooks(i).Close
101
- next i
102
+ Next i
102
103
 
103
104
  xlsx.Workbooks(1).SaveAs FileName:=FilePath
104
105
  xlsx.Workbooks(1).Close
105
106
 
106
- MsgBox "完了しました。"
107
+ MsgBox "完了しました。"
107
108
 
108
109
  End Sub
109
110
  ```

3

説明追記

2021/01/11 09:37

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -114,4 +114,6 @@
114
114
  ```vba
115
115
  xlsx.Quit
116
116
  Set xlsx = NoThing
117
- ```
117
+ ```
118
+
119
+ 「AccessVBAでExcelブックを1つにまとめて保存」プロシージャでブックを保存してますので、その最後でExcelアプリケーションを終了、解放してもいいかもです。

2

コード追記

2021/01/11 09:16

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -77,6 +77,35 @@
77
77
  '****中略*****
78
78
 
79
79
  End Function
80
+
81
+ Sub AccessVBAでExcelブックを1つにまとめて保存()
82
+
83
+ If xlsx Is Nothing Then
84
+ MsgBox "開いているブックはありません。"
85
+ Exit Sub
86
+ End If
87
+
88
+ Dim DesktopPath As String, FilePath As String, WSH As Variant
89
+ Set WSH = CreateObject("Wscript.Shell")
90
+ DesktopPath = WSH.SpecialFolders("Desktop")
91
+ FilePath = DesktopPath & "\保存名.xlsx"
92
+
93
+ 'メイン処理
94
+ Dim i As Integer
95
+
96
+ '開いているExcelブック数を数えて、2個目以降のブックのSheets(1)を1個目のブックに追加して閉じていく
97
+ For i = 2 to xlsx .Workbooks(xlsx.Workbooks.Count)
98
+ xlsx .Workbooks(i).Worksheets(1).copy _
99
+ Before:=xlsx.Workbooks(1).Sheets(1) 'ワークブック1にシートを追加してコピー
100
+ xlsx.Workbooks(i).Close
101
+ next i
102
+
103
+ xlsx.Workbooks(1).SaveAs FileName:=FilePath
104
+ xlsx.Workbooks(1).Close
105
+
106
+ MsgBox "完了しました。"
107
+
108
+ End Sub
80
109
  ```
81
110
 
82
111
  生成したExcelアプリケーションは、適切なタイミングで、終了、解放しておく必要があります。

1

説明追記

2021/01/11 08:12

投稿

hatena19
hatena19

スコア34367

answer CHANGED
@@ -19,4 +19,70 @@
19
19
  あるいは、特定のフォルダー内のブックを対象とするのでしょうか。
20
20
  それとも、、、
21
21
 
22
- その辺を明確に提示してください。
22
+ その辺を明確に提示してください。
23
+
24
+ 追記されたコードについて
25
+ ---
26
+
27
+ CreateObject("Excel.Application")は新規のエクセルアプリケーションを生成します。
28
+ もし、これを繰り返す実行すると複数のエクセルアプリケーションが開いてしまいます。
29
+ (タスクマネージャーで確認してみてください。)
30
+ それぞれのWorkbooks.Add()で新規ブックを一つ開いていることになります。
31
+
32
+ 下記の点を考慮してコーディングしてください。
33
+
34
+ - Dim xlsx As Object の宣言は標準モジュールの冒頭で宣言する。モジュールの冒頭だとモジュールの実行後自動解放されるので以降参照できない。また、モジュール内で解放しないようにする。
35
+ - CreateObject("Excel.Application")は最初の一回のみ実行する。複数のエクセルアプリケーションを開かないようにする。
36
+
37
+ 上記を考慮すると、
38
+
39
+ ```vba
40
+ Option Compare Database
41
+ Option Explicit
42
+
43
+ Dim xlsx As Object 'Excel.Applicationを代入するオブジェクト変数
44
+
45
+ Function ExcelData(frm As Form)
46
+ On Error GoTo Err_cmdExcel_Click
47
+ 'DAOで抽出結果のクローンを作成
48
+ Dim wkb As Object 'Excel.Wookbookを代入するオブジェクト変数
49
+ Dim rst As DAO.Recordset '現在のレコードセットを入れる変数
50
+ Dim idx As Long 'フィールド数変数
51
+ Dim j As Long ' 最終行取得用
52
+ Const xlUp As Integer = -4162
53
+
54
+ '****中略*****
55
+
56
+ 'Excelアプリケーションを生成(事前に生成されていない場合のみ)
57
+ If xlsx Is Nothing Then
58
+ Set xlsx = CreateObject("Excel.Application")
59
+ End If
60
+
61
+ 'Excelアプリケーションにワークブックを追加
62
+ Set wkb = xlsx.Workbooks.Add()
63
+
64
+ '追加されたワークブックに、レコードセットのデータをコピー
65
+ With wkb.Worksheets(1)
66
+
67
+ '****中略*****
68
+
69
+ 'Excelデータを表示
70
+ xlsx.Visible = True
71
+ xlsx.UserControl = True
72
+ 'メモリに展開されたExcel用オブジェクト変数は解放しない
73
+ 'Set wkb = Nothing
74
+ 'Set xlsx = Nothing
75
+ End With
76
+
77
+ '****中略*****
78
+
79
+ End Function
80
+ ```
81
+
82
+ 生成したExcelアプリケーションは、適切なタイミングで、終了、解放しておく必要があります。
83
+ 不必要になった時とか、Accessを閉じる前とか、・・・
84
+
85
+ ```vba
86
+ xlsx.Quit
87
+ Set xlsx = NoThing
88
+ ```