回答編集履歴

5

追記

2016/06/15 07:43

投稿

jawa
jawa

スコア3013

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
- Msgbox "ファイル名:" & Path & vbCr & "シート名:" & openbooksheet.Name & vbCr & strMsg
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

追記

2016/06/15 07:43

投稿

jawa
jawa

スコア3013

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

追記

2016/06/14 07:53

投稿

jawa
jawa

スコア3013

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

修正

2016/06/14 07:43

投稿

jawa
jawa

スコア3013

test CHANGED
@@ -1,4 +1,4 @@
1
- どんなデータを読みとった時にどんな動作をしているのか、
1
+ どんなデータを読みとった時にどんな動作をるのか、
2
2
 
3
3
  ・期待する動作
4
4
 

1

修正

2016/06/14 05:59

投稿

jawa
jawa

スコア3013

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