回答編集履歴
5
追記
test
CHANGED
@@ -210,43 +210,203 @@
|
|
210
210
|
|
211
211
|
以下に対象となっているシートと、セルの値を表示するサンプルを作成してみました。
|
212
212
|
|
213
|
+
⇒ 長くなりすぎたので全体ソースを参照してください。
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
これで状況を確認してみてください。
|
218
|
+
|
219
|
+
|
220
|
+
|
221
|
+
全体ソース
|
222
|
+
|
223
|
+
---
|
224
|
+
|
213
|
-
```
|
225
|
+
```
|
226
|
+
|
227
|
+
Option Explicit
|
228
|
+
|
229
|
+
|
230
|
+
|
231
|
+
Dim gyo As Long
|
232
|
+
|
233
|
+
Dim gyo2 As Long
|
234
|
+
|
235
|
+
Dim filecount As Long
|
236
|
+
|
237
|
+
Dim sheetcount As Long
|
238
|
+
|
239
|
+
Dim unmatch As Long
|
240
|
+
|
241
|
+
Dim erfilecount As Long
|
242
|
+
|
243
|
+
|
244
|
+
|
245
|
+
'ボタンを押したとき
|
246
|
+
|
247
|
+
Sub FolderSelect()
|
248
|
+
|
249
|
+
ThisWorkbook.Worksheets(1).Range("A6:C3005").ClearContents
|
250
|
+
|
251
|
+
ThisWorkbook.Worksheets(2).Range("A3:AS3005").ClearContents
|
252
|
+
|
253
|
+
Dim folderpass As String
|
254
|
+
|
255
|
+
With Application.FileDialog(msoFileDialogFolderPicker)
|
256
|
+
|
257
|
+
If .Show = True Then
|
258
|
+
|
259
|
+
folderpass = .SelectedItems(1)
|
260
|
+
|
261
|
+
Else
|
262
|
+
|
263
|
+
ThisWorkbook.Worksheets(1).Range("B3").Value = "キャンセルしました。"
|
264
|
+
|
265
|
+
Exit Sub
|
266
|
+
|
267
|
+
End If
|
268
|
+
|
269
|
+
End With
|
270
|
+
|
271
|
+
|
272
|
+
|
273
|
+
filecount = 0
|
274
|
+
|
275
|
+
sheetcount = 0
|
276
|
+
|
277
|
+
unmatch = 0
|
278
|
+
|
279
|
+
erfilecount = 0
|
280
|
+
|
281
|
+
gyo = 6
|
282
|
+
|
283
|
+
gyo2 = 3
|
284
|
+
|
285
|
+
|
286
|
+
|
287
|
+
ThisWorkbook.Worksheets(1).Range("B2").Value = "処理中"
|
288
|
+
|
289
|
+
|
290
|
+
|
291
|
+
Call FileSearch(folderpass, "*.xls*")
|
292
|
+
|
293
|
+
Dim dateupdate As String
|
294
|
+
|
295
|
+
dateupdate = Year(Date) & "年" & Month(Date) & "月" & Day(Date) & "日更新"
|
296
|
+
|
297
|
+
ThisWorkbook.Worksheets(2).Range("A1").Value = dateupdate
|
298
|
+
|
299
|
+
ThisWorkbook.Worksheets(2).Name = dateupdate
|
300
|
+
|
301
|
+
ThisWorkbook.Worksheets(1).Range("B2").Value = "完了"
|
302
|
+
|
303
|
+
ThisWorkbook.Worksheets(2).Activate
|
304
|
+
|
305
|
+
End Sub
|
306
|
+
|
307
|
+
|
308
|
+
|
309
|
+
'ファイル検索
|
310
|
+
|
311
|
+
Sub FileSearch(Path As String, Target As String)
|
312
|
+
|
313
|
+
|
314
|
+
|
315
|
+
Dim FSO As Object, Folder As Variant, File As Variant
|
316
|
+
|
317
|
+
Set FSO = CreateObject("Scripting.FileSystemObject")
|
318
|
+
|
319
|
+
|
320
|
+
|
321
|
+
Dim wsStatusSheet As Worksheet '状況出力シート
|
322
|
+
|
323
|
+
Set wsStatusSheet = ThisWorkbook.Worksheets(1)
|
324
|
+
|
325
|
+
|
326
|
+
|
327
|
+
'全てのサブフォルダをループ処理
|
328
|
+
|
329
|
+
For Each Folder In FSO.GetFolder(Path).SubFolders
|
330
|
+
|
331
|
+
'サブフォルダを指定して再帰呼び出し
|
332
|
+
|
333
|
+
Call FileSearch(Folder.Path, Target)
|
334
|
+
|
335
|
+
Next Folder
|
336
|
+
|
337
|
+
|
338
|
+
|
339
|
+
'フォルダ内のすべてのファイルをループ処理
|
340
|
+
|
341
|
+
For Each File In FSO.GetFolder(Path).Files
|
342
|
+
|
343
|
+
If File.Name Like Target Then
|
344
|
+
|
345
|
+
'ファイル名がTargetに含まれる場合、処理対象
|
346
|
+
|
347
|
+
filecount = filecount + 1
|
348
|
+
|
349
|
+
wsStatusSheet.Cells(gyo, 1) = File.Name 'ファイル名を出力
|
350
|
+
|
351
|
+
wsStatusSheet.Cells(gyo, 2) = File.Path 'ファイルパスを出力
|
352
|
+
|
353
|
+
'コピー処理
|
354
|
+
|
355
|
+
Call ParCopy(File.Path)
|
356
|
+
|
357
|
+
|
358
|
+
|
359
|
+
gyo = gyo + 1
|
360
|
+
|
361
|
+
End If
|
362
|
+
|
363
|
+
wsStatusSheet.Range("B3").Value = filecount & "個のファイルが見つかりました。"
|
364
|
+
|
365
|
+
Next File
|
366
|
+
|
367
|
+
End Sub
|
368
|
+
|
369
|
+
|
370
|
+
|
371
|
+
|
372
|
+
|
373
|
+
''一覧出力
|
214
374
|
|
215
375
|
Sub ParCopy(Path As String)
|
216
376
|
|
217
|
-
|
377
|
+
|
218
378
|
|
219
379
|
'Dim i As Long
|
220
380
|
|
221
381
|
'Dim j As Long
|
222
382
|
|
223
|
-
|
383
|
+
|
224
384
|
|
225
385
|
Dim openbook As Workbook
|
226
386
|
|
227
387
|
Dim openbooksheet As Worksheet
|
228
388
|
|
229
|
-
|
389
|
+
|
230
390
|
|
231
391
|
Application.ScreenUpdating = False
|
232
392
|
|
233
|
-
|
393
|
+
|
234
394
|
|
235
395
|
On Error GoTo myError
|
236
396
|
|
237
397
|
Set openbook = Application.Workbooks.Open(Path)
|
238
398
|
|
239
|
-
|
399
|
+
|
240
400
|
|
241
401
|
'一覧化コピペ
|
242
402
|
|
243
403
|
'For i = 1 To openbook.Worksheets.Count
|
244
404
|
|
245
|
-
|
405
|
+
|
246
406
|
|
247
407
|
Set openbooksheet = openbook.Worksheets(1)
|
248
408
|
|
249
|
-
|
409
|
+
|
250
410
|
|
251
411
|
'Dim blof As Variant
|
252
412
|
|
@@ -258,13 +418,13 @@
|
|
258
418
|
|
259
419
|
'Next j
|
260
420
|
|
261
|
-
|
421
|
+
|
262
422
|
|
263
423
|
Dim strMsg As String 'デバッグ用メッセージ
|
264
424
|
|
265
425
|
strMsg = ""
|
266
426
|
|
267
|
-
|
427
|
+
|
268
428
|
|
269
429
|
If openbooksheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row <> 1 Then
|
270
430
|
|
@@ -294,7 +454,7 @@
|
|
294
454
|
|
295
455
|
ThisWorkbook.Worksheets(2).Cells(gyo2, 56) = openbooksheet.Range("M22")
|
296
456
|
|
297
|
-
|
457
|
+
|
298
458
|
|
299
459
|
'デバッグ用メッセージに書き出し
|
300
460
|
|
@@ -322,27 +482,27 @@
|
|
322
482
|
|
323
483
|
strMsg = strMsg & "M22 :" & openbooksheet.Range("M22") & vbCr
|
324
484
|
|
325
|
-
|
485
|
+
|
326
486
|
|
327
487
|
gyo2 = gyo2 + 1
|
328
488
|
|
329
489
|
End If
|
330
490
|
|
331
|
-
|
491
|
+
|
332
492
|
|
333
493
|
'処理中のファイル名・シート名を画面表示する
|
334
494
|
|
335
|
-
Msg
|
495
|
+
MsgBox "ファイル名:" & Path & vbCr & "シート名:" & openbooksheet.Name & vbCr & strMsg
|
336
|
-
|
337
|
-
|
496
|
+
|
497
|
+
|
338
498
|
|
339
499
|
'Next i
|
340
500
|
|
341
|
-
|
501
|
+
|
342
502
|
|
343
503
|
openbook.Close False
|
344
504
|
|
345
|
-
|
505
|
+
|
346
506
|
|
347
507
|
Application.ScreenUpdating = True
|
348
508
|
|
@@ -362,6 +522,6 @@
|
|
362
522
|
|
363
523
|
|
364
524
|
|
365
|
-
こ
|
525
|
+
このコードで、指定フォルダ配下の2ファイル、およびそのサブフォルダ配下の1ファイルからの情報取得を確認しています。
|
366
|
-
|
367
|
-
|
526
|
+
|
527
|
+
|
4
追記
test
CHANGED
@@ -14,6 +14,12 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
+
|
18
|
+
|
19
|
+
気になったこと
|
20
|
+
|
21
|
+
---
|
22
|
+
|
17
23
|
ソース上、気になる点がいくつかありました。
|
18
24
|
|
19
25
|
①全シート数分のループ処理をしているのに、読み込みシートは常にシート1でよいのか?
|
@@ -160,6 +166,10 @@
|
|
160
166
|
|
161
167
|
---
|
162
168
|
|
169
|
+
|
170
|
+
|
171
|
+
|
172
|
+
|
163
173
|
追記を受けて
|
164
174
|
|
165
175
|
---
|
3
追記
test
CHANGED
@@ -155,3 +155,203 @@
|
|
155
155
|
⇒具体的に空セルがセットされるメカニズムを把握する
|
156
156
|
|
157
157
|
といった調査で原因を特定していけばよいと思います。
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
---
|
162
|
+
|
163
|
+
追記を受けて
|
164
|
+
|
165
|
+
---
|
166
|
+
|
167
|
+
やりたいことはおおよそ伝わりましたが、エラーの発生状況がまだよくわかりません。
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
コードが期待通りのロジックとなっているのなら、取り込まれる側シートのA70,R2,…AE48の内容を取り込む側シートの6,7,42,…56列目にコピーしたいのだと思います。
|
172
|
+
|
173
|
+
・これらすべてが空欄となるのか
|
174
|
+
|
175
|
+
・あるファイルの分はコピーできているが、あるファイルの分は空欄となってしまうのか
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
追加で気になったこと
|
182
|
+
|
183
|
+
---
|
184
|
+
|
185
|
+
コード内で読み取るシートを
|
186
|
+
|
187
|
+
```
|
188
|
+
|
189
|
+
Set openbooksheet = openbook.Worksheets(1)
|
190
|
+
|
191
|
+
```
|
192
|
+
|
193
|
+
と指定しています。
|
194
|
+
|
195
|
+
これで取得できるシートは、ブック内で一番左側のシートです。
|
196
|
+
|
197
|
+
これには非表示のシートも含まれますので、一番左のシートが非表示の場合、見えていないシートからデータを取得することになります。
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
以下に対象となっているシートと、セルの値を表示するサンプルを作成してみました。
|
202
|
+
|
203
|
+
```
|
204
|
+
|
205
|
+
Sub ParCopy(Path As String)
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
'Dim i As Long
|
210
|
+
|
211
|
+
'Dim j As Long
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
Dim openbook As Workbook
|
216
|
+
|
217
|
+
Dim openbooksheet As Worksheet
|
218
|
+
|
219
|
+
|
220
|
+
|
221
|
+
Application.ScreenUpdating = False
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
On Error GoTo myError
|
226
|
+
|
227
|
+
Set openbook = Application.Workbooks.Open(Path)
|
228
|
+
|
229
|
+
|
230
|
+
|
231
|
+
'一覧化コピペ
|
232
|
+
|
233
|
+
'For i = 1 To openbook.Worksheets.Count
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
Set openbooksheet = openbook.Worksheets(1)
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
'Dim blof As Variant
|
242
|
+
|
243
|
+
'ReDim blofar(0 To 1)
|
244
|
+
|
245
|
+
'For j = 0 To UBound(blof)
|
246
|
+
|
247
|
+
' blofar(j) = Trim(blof(j))
|
248
|
+
|
249
|
+
'Next j
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
Dim strMsg As String 'デバッグ用メッセージ
|
254
|
+
|
255
|
+
strMsg = ""
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
If openbooksheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row <> 1 Then
|
260
|
+
|
261
|
+
'シートに書き出し
|
262
|
+
|
263
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 6) = openbooksheet.Range("A70")
|
264
|
+
|
265
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 7) = openbooksheet.Range("A70")
|
266
|
+
|
267
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 42) = openbooksheet.Range("R2")
|
268
|
+
|
269
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 43) = openbooksheet.Range("AC43")
|
270
|
+
|
271
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 44) = openbooksheet.Range("AC44")
|
272
|
+
|
273
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 45) = openbooksheet.Range("AC45")
|
274
|
+
|
275
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 46) = openbooksheet.Range("AC46")
|
276
|
+
|
277
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 47) = openbooksheet.Range("AE48")
|
278
|
+
|
279
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 49) = openbooksheet.Range("AA2")
|
280
|
+
|
281
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 52) = openbooksheet.Range("M22")
|
282
|
+
|
283
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 54) = openbooksheet.Range("T22")
|
284
|
+
|
285
|
+
ThisWorkbook.Worksheets(2).Cells(gyo2, 56) = openbooksheet.Range("M22")
|
286
|
+
|
287
|
+
|
288
|
+
|
289
|
+
'デバッグ用メッセージに書き出し
|
290
|
+
|
291
|
+
strMsg = strMsg & "A70 :" & openbooksheet.Range("A70") & vbCr
|
292
|
+
|
293
|
+
strMsg = strMsg & "A70 :" & openbooksheet.Range("A70") & vbCr
|
294
|
+
|
295
|
+
strMsg = strMsg & "R2 :" & openbooksheet.Range("R2") & vbCr
|
296
|
+
|
297
|
+
strMsg = strMsg & "AC43:" & openbooksheet.Range("AC43") & vbCr
|
298
|
+
|
299
|
+
strMsg = strMsg & "AC44:" & openbooksheet.Range("AC44") & vbCr
|
300
|
+
|
301
|
+
strMsg = strMsg & "AC45:" & openbooksheet.Range("AC45") & vbCr
|
302
|
+
|
303
|
+
strMsg = strMsg & "AC46:" & openbooksheet.Range("AC46") & vbCr
|
304
|
+
|
305
|
+
strMsg = strMsg & "AE48:" & openbooksheet.Range("AE48") & vbCr
|
306
|
+
|
307
|
+
strMsg = strMsg & "AA2 :" & openbooksheet.Range("AA2") & vbCr
|
308
|
+
|
309
|
+
strMsg = strMsg & "M22 :" & openbooksheet.Range("M22") & vbCr
|
310
|
+
|
311
|
+
strMsg = strMsg & "T22 :" & openbooksheet.Range("T22") & vbCr
|
312
|
+
|
313
|
+
strMsg = strMsg & "M22 :" & openbooksheet.Range("M22") & vbCr
|
314
|
+
|
315
|
+
|
316
|
+
|
317
|
+
gyo2 = gyo2 + 1
|
318
|
+
|
319
|
+
End If
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
'処理中のファイル名・シート名を画面表示する
|
324
|
+
|
325
|
+
Msgbox "ファイル名:" & Path & vbCr & "シート名:" & openbooksheet.Name & vbCr & strMsg
|
326
|
+
|
327
|
+
|
328
|
+
|
329
|
+
'Next i
|
330
|
+
|
331
|
+
|
332
|
+
|
333
|
+
openbook.Close False
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
Application.ScreenUpdating = True
|
338
|
+
|
339
|
+
Exit Sub
|
340
|
+
|
341
|
+
myError:
|
342
|
+
|
343
|
+
ThisWorkbook.Worksheets(1).Cells(gyo, 3) = "エラー発生"
|
344
|
+
|
345
|
+
erfilecount = erfilecount + 1
|
346
|
+
|
347
|
+
Application.ScreenUpdating = True
|
348
|
+
|
349
|
+
End Sub
|
350
|
+
|
351
|
+
```
|
352
|
+
|
353
|
+
|
354
|
+
|
355
|
+
これで状況を確認してみてください。
|
356
|
+
|
357
|
+
|
2
修正
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
どんなデータを読みとった時にどんな動作を
|
1
|
+
どんなデータを読みとった時にどんな動作をするのか、
|
2
2
|
|
3
3
|
・期待する動作
|
4
4
|
|
1
修正
test
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
どんなデータを読みとった時にどんな動作をしているのか、
|
2
|
+
|
1
3
|
・期待する動作
|
2
4
|
|
3
5
|
・実際の動作
|
4
6
|
|
5
7
|
・対象フォルダの構成
|
6
8
|
|
7
|
-
|
9
|
+
が不明瞭なので的確なアドバイスができているかわかりませんが。
|
8
10
|
|
9
11
|
|
10
12
|
|
@@ -26,7 +28,7 @@
|
|
26
28
|
|
27
29
|
|
28
30
|
|
29
|
-
②配列でない変数を配列として扱っている為エラーが発生している
|
31
|
+
②配列でない変数を配列として扱っている為エラーが発生している ⇒不要な処理であれば削除する
|
30
32
|
|
31
33
|
```
|
32
34
|
|