回答編集履歴

3

追加

2020/04/04 11:02

投稿

end-u
end-u

スコア52

test CHANGED
@@ -339,3 +339,203 @@
339
339
  End Sub
340
340
 
341
341
  ```
342
+
343
+ ---
344
+
345
+ (2020.04.04追加)
346
+
347
+ 新規登録を追加
348
+
349
+ 「dic.keys()にあって、ファイルリストにないもの」を追加すればいいので、
350
+
351
+ Match関数でまとめて配列CheckしてLoop時エラー値のものを処理します
352
+
353
+ 処理内容は更新と同じなのでサブプロシージャにして外出し。
354
+
355
+ ```VBA
356
+
357
+ '---------------------------------------------------------------------
358
+
359
+ Sub sample2()
360
+
361
+ Dim Fold As String
362
+
363
+ Fold = ThisWorkbook.Path 'とかActiveWorkbook.Pathとか
364
+
365
+
366
+
367
+ Dim tgFol(2) As String
368
+
369
+
370
+
371
+ tgFol(0) = Fold & "\10 未対応"
372
+
373
+ tgFol(1) = Fold & "\20 対応中"
374
+
375
+ tgFol(2) = Fold & "\30 対応済み"
376
+
377
+
378
+
379
+ Dim fso As Object 'Scripting.FileSystemObject
380
+
381
+ Dim f As Object 'file
382
+
383
+ Dim dic As Object 'Scripting.dictionary
384
+
385
+ Dim i As Long
386
+
387
+
388
+
389
+ Set fso = CreateObject("Scripting.FileSystemObject")
390
+
391
+ Set dic = CreateObject("Scripting.Dictionary")
392
+
393
+ '3フォルダ全ファイルからユニークファイル名をkeyにして _
394
+
395
+ ファイルフルパスをdictionaryに登録する
396
+
397
+ For i = 0 To 2
398
+
399
+ For Each f In fso.GetFolder(tgFol(i)).Files
400
+
401
+ If f.Name Like "*お客様問い合わせファイル*" Then
402
+
403
+ dic(f.Name) = f.Path
404
+
405
+ End If
406
+
407
+ Next
408
+
409
+ Next
410
+
411
+ '↑ここまでは少し時間かかる
412
+
413
+
414
+
415
+ Dim key As String
416
+
417
+ Dim rng As Range
418
+
419
+ Dim r As Range
420
+
421
+
422
+
423
+ With ActiveSheet 'とかThisWorkbook.Sheets("data")とか
424
+
425
+ Set rng = .Range("AQ12", .Cells(.Rows.Count, "AQ").End(xlUp))
426
+
427
+ End With
428
+
429
+
430
+
431
+ For Each r In rng
432
+
433
+ If r.Value = "" Then
434
+
435
+ 'ユニークファイル名がr.RowのA列にある場合
436
+
437
+ key = r.EntireRow.Range("A1").Value
438
+
439
+ '例えば別シートのrと同じ行にあるなら
440
+
441
+ 'key = ThisWorkbook.Sheets("一覧").Cells(r.Row, "A").Value
442
+
443
+
444
+
445
+ 'dic(key)でフルパスを取り出してサブプロシージャへ
446
+
447
+ Call wkGetdata(dic(key), r)
448
+
449
+ Else
450
+
451
+ ':
452
+
453
+ ':
454
+
455
+ End If
456
+
457
+ Next
458
+
459
+
460
+
461
+ '新規登録チェック
462
+
463
+ Dim chk, buf
464
+
465
+ chk = Application.Match(dic.keys(), rng.EntireRow.Columns(1), 0)
466
+
467
+ '新規書き出し位置
468
+
469
+ Set r = rng.Offset(rng.Count).Item(1)
470
+
471
+ For i = 1 To UBound(chk)
472
+
473
+ If IsError(chk(i)) Then
474
+
475
+ key = dic(dic.keys()(i))
476
+
477
+ 'フォルダによって除外するなら条件分岐させる
478
+
479
+ 'buf = Split(key, "\")
480
+
481
+ 'If buf(5) <> "30 対応済み" Then
482
+
483
+ Call wkGetdata(key, r)
484
+
485
+ 'ファイル名も忘れずに追加
486
+
487
+ r.EntireRow.Range("A1").Value = dic.keys()(i)
488
+
489
+ Set r = r.Offset(1)
490
+
491
+ 'End If
492
+
493
+ End If
494
+
495
+ Next
496
+
497
+
498
+
499
+ End Sub
500
+
501
+ '---------------------------------------------------------------------
502
+
503
+ Sub wkGetdata(fName As String, r As Range)
504
+
505
+ Dim ret(1 To 69)
506
+
507
+ With Workbooks.Open(fName, UpdateLinks:=False, ReadOnly:=True)
508
+
509
+ With .Sheets("問い合わせ")
510
+
511
+ '1×69の配列にデータセット
512
+
513
+ ret(1) = .Range("AG10").Value
514
+
515
+ ret(2) = .Range("AH10").Value
516
+
517
+ ':
518
+
519
+ ':
520
+
521
+ ':
522
+
523
+ ret(69) = .Range("AT2").Value
524
+
525
+ End With
526
+
527
+ .Close False
528
+
529
+ End With
530
+
531
+ 'Value = ""条件の rの行のB列から右に69セル拡張した範囲に書き込み
532
+
533
+ r.EntireRow.Range("B1").Resize(, 69).Value = ret
534
+
535
+ End Sub
536
+
537
+ '---------------------------------------------------------------------
538
+
539
+ ```
540
+
541
+ 変数を使い回ししてるので解り難ければ適宜変更してください

2

誤字修正

2020/04/04 11:01

投稿

end-u
end-u

スコア52

test CHANGED
@@ -274,7 +274,7 @@
274
274
 
275
275
  With ActiveSheet 'とかThisWorkbook.Sheets("data")とか
276
276
 
277
- Set rng = .Range("AR12", .Cells(.Rows.Count, "AR").End(xlUp))
277
+ Set rng = .Range("AQ12", .Cells(.Rows.Count, "AQ").End(xlUp))
278
278
 
279
279
  End With
280
280
 

1

サンプル追加です

2020/04/03 15:22

投稿

end-u
end-u

スコア52

test CHANGED
@@ -175,3 +175,167 @@
175
175
  そうすると、「更新」であれ「新規登録」であれ、そのファイル名でピンポイントに開いて処理すれば良いと思うんですよね
176
176
 
177
177
  直前に子フォルダ含めたファイルリストをまず作って、それを参照すれば良いと思いますし。
178
+
179
+
180
+
181
+ ---
182
+
183
+ (追記)
184
+
185
+ > 問い合わせ毎のファイルはユニークなファイル名なので、
186
+
187
+ ..という事であれば
188
+
189
+ > 直前に子フォルダ含めたファイルリストをまず作って、それを参照すれば良いと思いますし。
190
+
191
+ のサンプル
192
+
193
+ ```VBA
194
+
195
+ Sub sample()
196
+
197
+ Dim Fold As String
198
+
199
+
200
+
201
+ With Application.FileDialog(msoFileDialogFolderPicker)
202
+
203
+ If .Show = True Then
204
+
205
+ Fold = .SelectedItems(1)
206
+
207
+ Else
208
+
209
+ Exit Sub
210
+
211
+ End If
212
+
213
+ End With
214
+
215
+
216
+
217
+ Dim tgFol(2) As String
218
+
219
+
220
+
221
+ tgFol(0) = Fold & "\10 未対応"
222
+
223
+ tgFol(1) = Fold & "\20 対応中"
224
+
225
+ tgFol(2) = Fold & "\30 対応済み"
226
+
227
+
228
+
229
+ Dim fso As Object 'Scripting.FileSystemObject
230
+
231
+ Dim f As Object 'file
232
+
233
+ Dim dic As Object 'Scripting.dictionary
234
+
235
+ Dim i As Long
236
+
237
+
238
+
239
+ Set fso = CreateObject("Scripting.FileSystemObject")
240
+
241
+ Set dic = CreateObject("Scripting.Dictionary")
242
+
243
+ '3フォルダ全ファイルからユニークファイル名をkeyにして _
244
+
245
+ ファイルフルパスをdictionaryに登録する
246
+
247
+ For i = 0 To 2
248
+
249
+ For Each f In fso.GetFolder(tgFol(i)).Files
250
+
251
+ If f.Name Like "*お客様問い合わせファイル*" Then
252
+
253
+ dic(f.Name) = f.Path
254
+
255
+ End If
256
+
257
+ Next
258
+
259
+ Next
260
+
261
+ '↑ここまでは少し時間かかる
262
+
263
+
264
+
265
+ Dim key As String
266
+
267
+ Dim rng As Range
268
+
269
+ Dim r As Range
270
+
271
+ Dim ret(1 To 69)
272
+
273
+
274
+
275
+ With ActiveSheet 'とかThisWorkbook.Sheets("data")とか
276
+
277
+ Set rng = .Range("AR12", .Cells(.Rows.Count, "AR").End(xlUp))
278
+
279
+ End With
280
+
281
+
282
+
283
+ For Each r In rng
284
+
285
+ If r.Value = "" Then
286
+
287
+ 'ユニークファイル名がr.RowのA列にある場合
288
+
289
+ key = r.EntireRow.Range("A1").Value
290
+
291
+ '例えば別シートのrと同じ行にあるなら
292
+
293
+ 'key = ThisWorkbook.Sheets("一覧").Cells(r.Row, "A").Value
294
+
295
+
296
+
297
+ 'dic(key)でフルパスを取り出す
298
+
299
+ With Workbooks.Open(dic(key), UpdateLinks:=False, ReadOnly:=True)
300
+
301
+ With .Sheets("問い合わせ")
302
+
303
+ '1×69の配列にデータセット
304
+
305
+ ret(1) = .Range("AG10").Value
306
+
307
+ ret(2) = .Range("AH10").Value
308
+
309
+ ':
310
+
311
+ ':
312
+
313
+ ':
314
+
315
+ ret(69) = .Range("AT2").Value
316
+
317
+ End With
318
+
319
+ .Close False
320
+
321
+ End With
322
+
323
+ 'Value = ""条件の rの行のB列から右に69セル拡張した範囲に書き込み
324
+
325
+ r.EntireRow.Range("B1").Resize(, 69).Value = ret
326
+
327
+ Else
328
+
329
+ ':
330
+
331
+ ':
332
+
333
+ End If
334
+
335
+ Next
336
+
337
+
338
+
339
+ End Sub
340
+
341
+ ```